Collection是集合最上层的接口,List,Set和Queue都要继承它,那么顺嘴说一句Collections是啥呢,别背,嗯说的就是我,我之前就死记硬背的,但是我们的科目所有的理论最终都是java实现,所以还是查看Collections类就能明白了
看Collections能排序
看Collections还能实现同步map
点进Collections发现有同的对集合操作的方法
到这里我说那句Collection是集合的父类,Collections是对java集合的工具类,你应该明白把!
说正题了
Collection 定义了单列(存储单个元素)集合规范,派生出三个子接口,List代表可重复的有序集合,Set代表不可重复的无序集合
Queue是队列实现,先说一下List的集合实现
所有的List的子类的共性如下:
1.元素按进入先后有序保存
2.允许存储重复的元素
3.索引存储方式
底层数组实现,支持随机访问,线程不安全,查询快,增删需要移动元素所以慢,
增加:增加如果不指定存储哪个位置默认存储最后一个位置,也不考虑扩容,那么时间复杂度就是O(1),如果add(5,"sd");指定了存储哪个位置,数组就会进行复制底层数组,最坏的打算时间复杂度O(n)
使用示例:
List arrayList = new ArrayList();
arrayList.add(5);
arrayList.add(1);
arrayList.add(1);
arrayList.add(4);
// 随机访问
System.out.println("随机访问:" + arrayList.get(2));
// 演示可支持重复,按元素顺序存储
for (int i = 0; i < arrayList.size(); i++) {
System.out.println(arrayList.get(i));
}
底层是链表实现,不支持随机访问,线程不安全,增删快,查询慢,必须挨个遍历,
增加:不指定位置尾部添加复杂度是O(1),指定位置插入需要遍历,然后指针操作O(n)
查询: 根据下标查询需要遍历获取O(n)
删除: 直接指针操作O(n)
System.out.println("------------------LinkedList-------------");
List linkedList = new LinkedList();
linkedList.add("22");
linkedList.add("32");
System.out.println("随机访问:" + linkedList.get(1));
for (int i = 0; i < linkedList.size(); i++) {
System.out.println(linkedList.get(i));
}
底层数组实现,用的是synchronized实现了线程安全的类,使用方式和上两种无异,就不展示了,多线程使用Vector能保证线程安全。
不允许存储重复元素,没有索引得一类集合,代表有HashSet,TreeSet,LinkedHashSet
实现:底层数据结构是HashMap,是基于HashMap实现的,数据的存储是唯一无序的(存储和取出元素的顺序有可能不一致)
使用限制:对象必须实现hashCode()方法来保证元素的唯一性,可以存储null,但是只能存一个
Set hashSet = new HashSet();//用hashMap中的方法
hashSet.add(7);
hashSet.add(6);
hashSet.add(0);
// 没有随机获取元素的方法
for (int num : hashSet) {
System.out.println("hashSet示例:" + num);
}
看结果会发现会对我们的数据进行排序
实现:TreeSet是基于TreeMap实现的,底层数据结构是红黑树,数据的存储是唯一,无序的(存储和取出元素的顺序有可能不一致)
使用限制:放入的数据不能重复且不能为null,可以重写compareTo()方法来确定元素大小,从而进行升序排序。
Set treeSet = new TreeSet(); // TreeMap中的实现
treeSet.add(1);
treeSet.add(5);
treeSet.add(2);
treeSet.add(2);
System.out.println("----------------TreeSet---------------");
for (int num : treeSet) {
System.out.println("TreeSet示例:" + num);
}
看结果不能存储重复元素,也会进行排序
实现:底层数据结构是链表和哈希表,FIFO(先进先出)插入是有序的唯一的,就是说存储和取出来的数据顺序是一致的,那就证明不会进行排序的,咱们看看
// 排序的示例,没有进行排序
System.out.println("----------------likedHashSet---------------");
Set likedHashSet = new LinkedHashSet(); //linkedHashMap实现
likedHashSet.add(30);
likedHashSet.add(25);
likedHashSet.add(16);
for (int num : likedHashSet) {
System.out.println("LinkedHashSet示例:" + num);
}
//***********set小结******************
相同点:
1.都继承Set,所以都不能包含重复数据
2.都不是线程安全的,如果要使用线程安全可以Collections.synchronizedSet()
区别:TreeSet主要用于排序
LinkedHashSet主要用于保证FIFO的有序集合(先进先出)
HashSet只是通用的存储数据的集合
性能比较:
插入:HashSet > LinkedHashSet > TreeSet
排序:HashSet不保证有序,LinkedHashSet保证按插入顺序排序,TreeSet可以自定义排序规则(自然排序,比较器排序)
null:HashSet、LinkedHashSet允许存在null数据,TreeSet不允许