Set
1.Set接口是继承于Collection
2.Set堆中存储的数据是无序的(不代表乱序)
3.Set中存储的数据是不可重复的:当Set中添加相同的元素,只能添加一个元素。
4.添加进Set中的元素一定要重写equals和hashCode方法
* ①.Set中的元素存储使用哈希算法
* ②.当向Set添加元素时,首先会调用该对象所在类的hashCode方法,计算对象的哈希值,这哈希值就决定了set元素的存储位置
* ③.在通过equals()方法比较两个对象是否相同,如果相同,则后面的对象不能添加
5.实现类
* ①.HashSet(主要实现类)
* ②.LinkHashSet
* ③.TreeSet
6.HashSet
* ①.HashSet是Set接口的主要实现类。
* ②.HashSet是采用哈希算法存储集合的元素,因此有很多存取和查询性能(底层数据结构是哈希表)
* 哈希表:综合数组和链表的优点(一个链表的数组)
* ③.HashSet不能保证元素的排列数据,顺序和添加的顺序不一致
* ④.内部存储机制:HashSet集合判断两个元素的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode值也相等。确保元素的唯一性。
* ⑤.为什么不使用数组而使用HashSet?
* 1).HashSet通过哈希值确定存储位置,可以自由的增加长度,并根据哈希值访问元素,不能挨个遍历索引去访问
7.LinkedHashSet
* ①.LinkedHashSet是HashSet的一个子类
* ②.LinkedHashSet是用链表维护元素的顺序
* ③.输出集合元素时元素顺序和添加顺序一致的
8.TreeSet
* ①.TreeSet是SortedSet接口的实现类
* ②.TreeSet可以确保集合元素处理排序状态
* ③.TreeSet内部是二叉树,默认是从小到大进行排序
* ④.TreeSet采用两种排序方法:自然排序和定制排序(默认是自然排序)
9.List和Set区别
* ①.List和Set都是Collection的子接口
* ②.List是存储有序的 可以重复的数据
* ③.Set是存储无序的不能重复的数据
* ④.底层存储机制不同
public class TestSet {
@Test
public void testHashSet() {
Set set = new HashSet();
Integer number = new Integer(123);
set.add(number);
set.add(123);
set.add(456);
set.add("A");
set.add(null);
Person p1 = new Person("xiaoming", 23);
Person p2 = new Person("xiaoming", 23);
set.add(p1);
set.add(p2);
System.out.println(set);
set.remove(123);
System.out.println(set);
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
Object obj = iterator.next();
System.out.println(obj);
}
for (Object object : set) {
System.out.println(object);
}
}
}