目的:
继续学习了有关集合的知识点:HashSet、HashMap,大致功能和List差不多,当然也存在一些区别,已经学习了异常处理,了解代码运行过程中的异常和错误如何处理。
技术:
1.泛型:
泛型:
-- 泛型类
-- 泛型方法
--泛型数组
Java里面泛型一定是引用类型即类类型,若为基本数据类型则使用其包装类
eg:定义一个泛型类:
其中的T是一个泛指,可以是任意引用类型,以及基本数据类型的包装类,但所有的T同一情况下必须一致。
class GenericTest<T>{
int age;
T a1;
T a2;
public void test(T a1, T a2){
this.a1 = a1;
this.a2 = a2;
System.out.println(a1.equals(a2));
}
}
调用:
public class Myclass {
public static void main(String[] args){
GenericTest<String> genericTest = new GenericTest<>();
genericTest.test("jack","jack");
}
2.HashSet、HashMap:
hashSet是Set接口下:HashSet类、LinkedHashSet类、TreeSet类之一
hashMap类是Map接口下的一个类。
1.集合里面对象不能重复 如果重复,加不进去
-- 内部使用HashMap来实现 键值对 键Key不能重复
--"jack":obj
2.集合是无序的 添加顺序和存储顺序无关
-- 使用默认排序
-- 哈希算法
-- 如何实现HashMap里面Key不相同
-- 计算这个Key对应的对象的hash值
--整数:在对象的地址的基础上按照一定的算法计算出来的的一个整数
-- 如果两个对象相同 那么计算出来的hash值就相同
HashSet类的方法使用:
插入,不可重复输入相同的数据,同时输入数据后自动进行排序,而且添加顺序和存储顺序无关
HashSet<String> names = new HashSet<>();
// names.add("jack");
// names.add("jack"); //结果只有一个jack
names.add("jack");
names.add("merry");
names.add("abc"); //结果:[abc, jack, merry]
删除一部分内容,使用removeIF(//被删除部分的共性)
//删除 jack merry
names.removeIf(ele ->{
return ele.compareTo("c") > 0 ; //compareTo返回为整形
});
System.out.println(names);
排序 1.对基本数据类型数据进行排序
//可以排序的集合
TreeSet<Integer> score = new TreeSet<>();
score.add(23);
score.add(2);
score.add(3);
System.out.println(score); //已经自动排序喽
对对象排序,自定义排序方法:
equals 比较的是对象内部的内容
使用的两个对象必须实现Compareble接口的compareTo方法
在compareTo里面实现具体该如何实现
//方法1
TreeSet<Person> score1 = new TreeSet<>(new Comparator<Person>() {
@Override
public int compare(Person person, Person t1) {
return person.compareTo(t1);
}
});
//方法2
TreeSet<Person> score1 = new TreeSet<>( (Person person, Person t1) -> {
return person.compareTo(t1);
});
Person person1 = new Person("jack",20);
Person person2 = new Person("rose",20);
Person person3 = new Person("jack",30);
score1.add(person1);
score1.add(person2);
score1.add(person3);
System.out.println(score1);
对应的Person类:( 使用的两个对象必须实现Compareble接口的compareTo方法) 继承接口Compatable,实现compareTo方法
class Person implements Comparable{
public String name;
public int age;
public Person(String name, int age) {
this.age = age;
this.name = name;
}
@Override
public int compareTo(Object o) {
//1.判断o 是不是Person类的对象
if(o instanceof Person){
//自己规定比较的策略
if(this.age != ((Person) o).age){
return this.age - ((Person) o).age;
}else{
//在年龄相同情况下 比较姓名
return this.name.compareTo(((Person) o).name);
}
}else{
return -1;
}
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
HashMap类的方法使用:
HashMap 集合 存储数据的特点:建Key-值value
Key不能重复 可以是任意的对象类型 通常使用字符串

HashMap<String,Integer> score = new HashMap<>();
//添加对象:键值对
score.put("Chinese",89);
score.put("Math",30);
score.put("English",100);
//更改某个键对应的值
score.put("Chinese",91);
//获取键值对的个数
score.size();
//获取所有的Key
System.out.println(score.keySet());
//获取所有的value
System.out.println(score.values());
//获取Entry key-value
System.out.println(score.entrySet());
//获取Key对应的值
System.out.println(score.get("English"));
2.键值对的遍历:
//1通过遍历Key来得到每一个Key对应的值
for(String key : score.keySet()){
//通过Key得到值
int s = score.get(key);
System.out.println("key:"+key+" value"+s);
}
//2.通过EntrySet 得到Entry对象的集合
// 一个Entry管理一个键值对 getKey getValue
Set<Map.Entry<String,Integer>> entries = score.entrySet();
for (Map.Entry entry : entries){
//得到Entry第一的Key
String key = (String)entry.getKey();
//得到Entry对应的值
Integer value = (Integer)entry.getValue();
System.out.println("key:"+key+" value:"+value);
}
异常处理:
/**
* 异常处理 错误:error
* 运行过程中出现不可控的错误 使程序更健壮
* Exception1-
*1. try{
* 执行代码
* 可能出现异常
* 一旦出现异常 系统自动为我们创建一个异常类 并抛出
* }catch(NullPointerException e){
* 如果需要自己处理异常就catch
* }catch(){
* 如果有多个异常 可以使用多个catch来捕获
* 如果有多个异常 catch的顺序为从小到大
* }finally{
* 处理资源回收 网络链接 数据库链接 I/O流
* }
*
* 如果异常出现 后面的代码将不会执行
* try代码块不是越多越好 不要抓太多
*
* 2.使用throws抛出异常
* 如果有多个异常 用逗号隔开
*
* 3.当出现特殊情况 自己可以选择抛出异常
* throw
* throw new IllegalAccessException
*/
1.try方法:

//圆括号里面只能添加可以关闭的对象
//实现了Closeable接口的对象
//如果出现异常 系统自动就关闭这个资源
try(FileReader fr1 = new FileReader("dddd")){
//使用对象
} catch (IOException e) {
e.printStackTrace();
}
2.使用throws抛出异常:
public static void text() throws FileNotFoundException,NullPointerException{
FileReader fr = new FileReader("");
}
3.使用throw抛出自己创建的异常:
public static void text2() throws IllegalAccessException{
//....
if(2<1){
throw new IllegalAccessException();
}
}
4.⾃自定义异常类: 能够⾃自⼰己定义输出内容 更更快地找到出现问题的位置:
//自定义异常处理
class PXDException extends Throwable{
//1.提供一个无参构造方法
public PXDException(){
}
//2.提供一个有参构造方法 参数是一个字符串
public PXDException(String desc){
super(desc);
}
}
使用:
public static void text3() throws PXDException{
//........
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
StackTraceElement e = stackTrace[2];
String detail = " "+e.getFileName()+"->"+e.getMethodName()+"->"+e.getLineNumber();
throw new PXDException("自己的异常类:无所作为"+detail);
}
捕获:
try{
TException.text3();
}catch (PXDException e){
System.out.println(e.getMessage());
}
结果·:
自己的异常类:无所作为 Exception1.java->main->67
.实际编程
心得:
逐渐地习惯这种生活方法了,按时起按时进教室上课,每天都是按部就班地过,“程序员”的世界是真的枯燥,但是编代码成功时的快感是真的爽,得把今天学习的知识吸收的同时复习以前的知识了。