集合Collection-set-List讲解

Collection是集合最上层的接口,List,Set和Queue都要继承它,那么顺嘴说一句Collections是啥呢,别背,嗯说的就是我,我之前就死记硬背的,但是我们的科目所有的理论最终都是java实现,所以还是查看Collections类就能明白了

看Collections能排序

看Collections还能实现同步map

点进Collections发现有同的对集合操作的方法

到这里我说那句Collection是集合的父类,Collections是对java集合的工具类,你应该明白把!

说正题了

Collection 定义了单列(存储单个元素)集合规范,派生出三个子接口,List代表可重复的有序集合,Set代表不可重复的无序集合

Queue是队列实现,先说一下List的集合实现

1.List

所有的List的子类的共性如下:

1.元素按进入先后有序保存

2.允许存储重复的元素

3.索引存储方式

1.1 ArrayList

底层数组实现,支持随机访问,线程不安全,查询快,增删需要移动元素所以慢,

增加:增加如果不指定存储哪个位置默认存储最后一个位置,也不考虑扩容,那么时间复杂度就是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));
}

1.2 LinkedList

底层是链表实现,不支持随机访问,线程不安全,增删快,查询慢,必须挨个遍历,

增加:不指定位置尾部添加复杂度是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));
}

1.3 Vector

底层数组实现,用的是synchronized实现了线程安全的类,使用方式和上两种无异,就不展示了,多线程使用Vector能保证线程安全。

2 Set

不允许存储重复元素,没有索引得一类集合,代表有HashSet,TreeSet,LinkedHashSet

2.1 HashSet

 实现:底层数据结构是HashMap,是基于HashMap实现的,数据的存储是唯一无序的(存储和取出元素的顺序有可能不一致)

 使用限制:对象必须实现hashCode()方法来保证元素的唯一性,可以存储null,但是只能存一个

Set<Integer> hashSet = new HashSet<Integer>();//用hashMap中的方法
hashSet.add(7);
hashSet.add(6);
hashSet.add(0);
// 没有随机获取元素的方法
for (int num : hashSet) {
    System.out.println("hashSet示例:" + num);
}

看结果会发现会对我们的数据进行排序

2.2 TreeSet

实现:TreeSet是基于TreeMap实现的,底层数据结构是红黑树,数据的存储是唯一,无序的(存储和取出元素的顺序有可能不一致)

使用限制:放入的数据不能重复且不能为null,可以重写compareTo()方法来确定元素大小,从而进行升序排序。

Set<Integer> treeSet = new TreeSet<Integer>(); // 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);
}

看结果不能存储重复元素,也会进行排序

2.3 LinkedHashSet

实现:底层数据结构是链表和哈希表,FIFO(先进先出)插入是有序的唯一的,就是说存储和取出来的数据顺序是一致的,那就证明不会进行排序的,咱们看看

 // 排序的示例,没有进行排序
 System.out.println("----------------likedHashSet---------------");
 Set<Integer> likedHashSet = new LinkedHashSet<Integer>(); //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不允许

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值