Set集合
1.集合框架Set(HashSet哈希表存储、重复元素存储底层探究)
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、集合框架TreeSet(自然排序、比较器排序)
2.1 自然排序的用途
- 使添加的元素自身具备排序规则,这种排序规则又被称为自然排序
易错点
如果只放一个元素,就汇报类型转换异常
2.2
按年龄排序
/**
*正数:后面的0必当前(this)大
*0代表相等
*/
@Override
public int compareTo(Person o) {
int num = this.getAge() - o.getAge();
if(num==0) {
return this.getName().compareTo(o.getName());
}
return num;
}
}
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.泛型
3.1什么时候定义泛型类?
当类中要操作的引用数据类型不确定的时候,
早期定义Object来完成扩展,现在定义泛型来完成扩展
将运行时的异常转移到编译时期
3.2 泛型方法
泛型类定义的泛型,在整个类中有效,如果被方法调用,
那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。
为了让不同方法可以操作不同的类型,而且类型还不确定。
那么可以将泛型定义在方法上。