1.1 HashSet的特点(根据版本原因有些版本是有序的) 元素是无序(存入和取出的顺序不一定一致),元素不可以重复; hashset本身具备去重的功能 1.2 重复元素存储底层探究 /** * 返回值代表着容器中的具体的位置坐标 */ @Override public int hashCode() {
return this.getName().hashCode()+this.age;//可以减少调用次数提高去重的效率 } @Override //当person这个人的名字相等,年龄相等,就存在集合中堆内存里的同一个引用地址 public boolean equals(Object obj) { if(obj instanceof Person) { Person p = (Person) obj; //this.name还没有 // p.getName()已经存进去了 System.out.println(this.getName()+"equals"+ p.getName()); return this.getName().equals(p.getName())&& this.getAge()==p.getAge(); } return false; } @Override public String toString() { // TODO Auto-generated method stub return "Person [name="+name+",age="+age+"]"; }注意 HashSet是如何保证元素唯一性的呢?
是通过元素的两个方法:hashCode与equals方法来完成; 如果hashCode值相同,才会判断equals是否为true; 如果hashCode值不同,那么不会调用equals。易错点 如果只放一个元素,就汇报类型转换异常
2.2
}
2.3
比较器comparator接口的作用: 使得容器具有比较性
/**
定义一个比较person的比较器规则:先按姓氏,再按年龄先主要条件再次要条件,如果不按这个规则来,那么就会数据丢失*/
class PersonComp implements Comparator{ public int compare(Person o1, Person o2) { int num = o1.getName().compareTo(o2.getName()); if(num==0) { return o1.getAge() - o2.getAge(); } return num; } }
3.1什么时候定义泛型类?
当类中要操作的引用数据类型不确定的时候, 早期定义Object来完成扩展,现在定义泛型来完成扩展 将运行时的异常转移到编译时期
泛型类定义的泛型,在整个类中有效,如果被方法调用,
那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。
为了让不同方法可以操作不同的类型,而且类型还不确定。
那么可以将泛型定义在方法上。