区分ArrayList与LinkedList,List与Set,TreeMap与HashMap,TreeSet与HashSet

文章详细介绍了Java集合框架中的ArrayList和LinkedList的区别,包括它们的实现方式、优缺点以及适用场景。同时,文章还对比了List和Set接口的特性,以及HashMap和TreeMap的差异,包括它们的内部实现、性能和使用建议。此外,文章也提及了TreeSet和HashSet的存储结构及插入删除原理。
摘要由CSDN通过智能技术生成
Java的集合包括三大类,它们是Set(集)、List(列表)和Map(映射),它们都处于java.util包中,Set、List和Map都是接口,它们有各自的实现类。

1. ArrayList与LinkedList

ArrayList与LinkedList都实现了List接口。

(1)ArrayList

ArrayList:数组,存储元素可以重复,存储的地址是连续的,
  • 优点:便于对集合进行快速的随机访问。因为地址连续,一旦数据存储好了,查询操作效率比较高
  • 缺点:插入和删除操作效率比较低 。
当对数组中的元素进行增加或者删除时,需要搬移元素(尾插和尾删除外)
例如在中间位置插入元素时:
    for (int i = size -1; i >= index ; i--) {
            elementData[i +1] = elementData[i];//后移
        }

(2)LinkedList

LinkedList:链表,存储元素可以重复,存储的地址是不连续的
  • 优点:插入和删除操作效率比较高

例如删除一个节点(前驱断开与当前节点的链接,连上当前节点的下一个节点),不用进行元素的搬移:

        Node node = prev.next;
        prev.next = node.next;
        node.next = null;
  • 缺点:查询操作效率比较低(只知道当前节点的地址,下一个节点的地址需要x.next)
例如查询链表中某一个元素时:
        Node x = head;
        for (int i = 0; i < index; i++) {
            x = x.next;
        }

(3)二者的使用场景推荐

ArrayList使用场景:数组一开始就已经固定,后序很少进行插入或删除,多半是查询操作,尽量不对ArrayList进行插入或删除操作(删除尾部除外)

LinkedList使用场景:经常有删除/插入操作,而查询使用较少。

2. List与Set

List与Set都实现了collection接口。

(1)List

List:元素有放入顺序,元素可重复 。

(2)Set

Set:元素无放入顺序,元素不可重复,重复元素会覆盖掉。

(3)二者的使用场景推荐

List:正常存储所有元素。
Set:对集合中的元素进行去重。

3. TreeMap与HashMap

TreeMap与HashMap都实现了Map接口。

HashMap是无序的。

TreeMap是按键的升序排列的。

LinkedHashMap是按元素最后一次访问的时间从早到晚排序的。

(1)reeMap与HashMap比较

Map底层结构
TreeMapHashMap
底层结构
红黑树
哈希桶
插入/删除/查找时间复杂度
\large \log_{2}NO(1)
是否有序
关于Key有序(大小关系由Comparable或比较器对象决定)
不一定有序
线程安全
不安全
不安全
插入/删除/查找区别
需要进行元素比较
1. 先计算key哈希地址 2. 然后进行查找,插入和删除
比较与覆写
key必须能够比较,否则会抛出ClassCastException异常
自定义类型需要覆写equals和hashCode方法
应用场景
需要Key有序场景下
Key是否有序不关心,需要更高的时间性能
key和value是否允许为空key不允许为空,value允许为空;key必须具备课比较的性质,或者传入比较器对象key和value都允许为空
(2)二者的使用场景推荐

HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。
HashMap:适用于在Map中插入、删除和定位元素。
Treemap:适用于按自然顺序或自定义顺序遍历键(key)。

4.  TreeSet与HashSet

Set底层结构
TreeSetHashSet
底层结构
红黑树
哈希桶
插入/删除/查找时间复杂度
\large \log_{2}NO(1)
是否有序
关于Key有序
不一定有序
线程安全
不安全
不安全
插入/删除/查找区别
按照红黑树的特性来进行查找,插入和删除
1. 先计算key哈希地址 2. 然后进行查找,插入和删除
比较与覆写
key必须能够比较,否则会抛出
ClassCastException异常
自定义类型需要覆写equals和
hashCode方法
应用场景
需要Key有序场景下
Key是否有序不关心,需要更高的时间性能

TreeSet集合对象的加入过程:

TreeSet的底层是通过二叉树来完成存储的,无序的集合
当我们将一个对象加入treeset中,treeset会将第一个对象作为根对象,然后调用对象的compareTo方法拿第二个对象和第一个比较,当返回至=0时,说明2个对象内容相等,treeset就不把第二个对象加入集合。返回>1时,说明第二个对象大于第一个对象,将第二个对象放在右边,返回-1时,则将第二个对象放在左边,依次类推。


HashSet集合对象的加入过程:

hashset底层是hash值的地址,它里面存的对象是无序的。
第一个对象进入集合时,hashset会调用object类的hashcode根据对象在堆内存里的地址调用对象重写的hashcode计算出一个hash值,然后第一个对象就进入hashset集合中的任意一个位置。
第二个对象开始进入集合,hashset先根据第二个对象在堆内存的地址调用对象的计算出一个hash值,如果第二个对象和第一个对象在堆内存里的地址是相同的,那么得到的hash值也是相同的,直接返回true,hash得到true后就不把第二个元素加入集合(这段是hash源码程序中的操作)。如果第二个对象和第一个对象在堆内存里地址是不同的,这时hashset类会先调用自己的方法遍历集合中的元素,当遍历到某个元素时,调用对象的equals方法,如果相等,返回true,则说明这两个对象的内容是相同的,hashset得到true后不会把第二个对象加入集合。

5. Set与Map

Map是一个接口类,该类没有继承自Collection,该类中存储的是<K,V>结构的键值对。

Set是一个接口类,该类继承自Collection,该类中存储的是Key。

Set 与 Map 的共同点:① key唯一,②Set底部采用Map实现 

Set 与 Map 主要的不同有两点:① Set 是继承自 Collection 的接口类,② Set 中只存储了 Key 。
  • 14
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值