Collections接口中的 list 接口与 set接口的区别

Collections接口

1、list 接口中的实现类允许存在重复元素,且排列有序

  • list 实现类
    ArrayList:

    优点: 底层数据结构是数组,查询快,增删慢。
    缺点: 线程不安全,效率高
    Vector:
    优点: 底层数据结构是数组,查询快,增删慢。
    缺点: 线程安全,效率低
    LinkedList:
    优点: 底层数据结构是链表,查询慢,增删快。
    缺点: 线程不安全,效率高

ArrayList和LinkList的区别:

ArrayList的内存结构是数组,这个数组的初始是10位的,插入的时候如果超过10位就将位数扩大到原来的2.5倍,依次类推。如果是add()的话会插入到最后一位,效率还是挺高的,但是如果这种add(i,b)方式将元素插入到特定的位置,那这个位置之后的元素将都会重新排序,效率低下。同样删除其中某一个元素时候,删除元素后面的元素也需要重新分组,效率低下。但是查询效率高,直接通过下角标找到对应的值即可。

LinkedList使用了循环双向链表数据结构,LinkedList链表由一系列表项连接而成,如图:在这里插入图片描述
对于LinkedList而言,在插入元素到任何位置,以及删除都是一样的,只需要把这个元素已经这个元素的连接删除掉就可以。但是查询效率低,因为每次取一个值的时候会先判断这个值在前一半还是后一半,每次取值都会将这个值前面的所有值都查一遍。

2、set 接口中的实现类不允许存在重复元素,且排列无序

- set 实现类
HashSet

底层数据结构是哈希表。(无序,唯一)
如何来保证元素唯一性?
1.依赖两个方法:hashCode()和equals()
LinkedHashSet
底层数据结构是链表和哈希表。(FIFO插入有序,唯一)
1.由链表保证元素有序
2.由哈希表保证元素唯一
TreeSet

底层数据结构是红黑树。(唯一,有序)
1、如何保证元素排序的呢?
自然排序
比较器排序
2、如何保证元素唯一性的呢?
根据比较的返回值是否是0来决定

HashSet与LinkedHashSet区别:
HashSet是按传入值的hashCode值由大到小的顺序去遍历的,与增加的顺序无关。
LinkedHashSet遍历的时候虽然是按增加的顺序依次遍历的,但是它存储的时候依然是按hashCode值去存储的。

发布了46 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/SMith7412/article/details/104023494
今日推荐