Set
1.Set是Collection的子接口
2.Set中存储的数据是无序的,不可重复的。
不可重复:当Set中添加相同的元素时,后面相同的元素不能添加。
要求:添加进Set中的元素,一定要重写equals()(要去重复)和hashcode()方法
- Set中的元素存储:使用哈希算法
①当向Set中添加元素时,首先 会调用该对象所在类的hashCode方法
,计算对象的哈希值,这个哈希值就决定了对象将来在Set中的存储位置
②在通过equals()方法比较两个对象是否相同,如果相同,则后面的对象不能添加
4.实现类HashSet(主要实现类)
LinkHashSet
TreeSet
public class TestSet {
@Test
public void testHashSet(){
Set set = new HashSet<>();
Integer number=new Integer(123);
set.add(number);
set.add(123);//隐式转化123==number
set.add(456);
set.add("A");
set.add("B");
set.add(null);
Person p1 = new Person("xiaohu",23);
Person p2 = new Person("xiaohu",23);
set.add(p1);
set.add(p2);
System.out.println(p1.equals(p2));//true person中重写了equals方法
System.out.println(p1.hashCode());
System.out.println(p2.hashCode());
set.remove(123);
System.out.println(set);
//遍历Set集合
//使用迭代器遍历
Iterator iterator = set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println("-----------------------");
//使用增强for循环
for (Object object : set) {
System.out.println(object);
}
}
}
其中的Person类有name,age两个成员变量,且重写了tostring方法,hashCode方法和equals方法
结果:
true
-759498058
-759498058
[null, A, B, 456, Person [name=xiaohu, age=23]]
null
A
B
456
Person [name=xiaohu, age=23]
-----------------------
null
A
B
456
Person [name=xiaohu, age=23]
只有同一类中两个对象要存入Set集合中,比较是否相同,需要在所在类中重写equals和hashCode方法,这样才能保证不重复(因为两个对象的引用地址不同,所以一定会被判断不相等,会输出)
若不重写,就会输出一样的
Person类中不重写hashCode方法和equals方法
则结果为:
false
99550389
1598924227
[null, A, B, 456, Person [name=xiaohu, age=23], Person [name=xiaohu, age=23]]
null
A
B
456
Person [name=xiaohu, age=23]
Person [name=xiaohu, age=23]