Java集合类复习

Java集合类复习

接口关系

Collection是集合set,list,Queue的基本接口。

Map:是映射表的基础接口。

Iterator:迭代器接口

List接口

List 是有序的 Collection。List 一共三个实现类: ArrayList、Vector 和 LinkedList。List定义了若干线性结构数据的操作方法。

ArrayList(动态数组)

ArrayList 是最常用的 List 实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。

ArrayList只能装引用型对象。并且 ArrayList线程不安全

当数组大小不满足时需要增加存储能力,就要将已经有数组的数据复制到新的存储空间中。 当从 ArrayList 的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。


Vector(数组,线程安全)

Vector 与 ArrayList 一样,也是通过数组实现的,不同的是它支持线程的同步。

Vector是使用synchronized实现线程安全的 ,但实现同步需要很高的花费,因此,访问它比访问 ArrayList 慢。


LinkList(链表)

LinkList是线程不安全的。

LinkedList 是用链表结构存储数据的 ,很适合数据的动态插入和删除,随机访问和遍历速度比较慢。并且它格外实现了List接口中没定义的方法,对链表的头元素和未元素进行操作。

Set接口

Set 是一个无序的集合类接口,注重独一无二的性质,值不能重复。

Set根据hashCode 值判断对象是否相等,hashCode 值是依据对象的内存地址计算出的。


HashSet(Hash 表)

HashSet 存储元素的顺序并不是按照存入时的顺序 ,而是按照哈希值来存的所以取数据也是按照哈希值取得。 HashSet 首先判断两个元素的哈希值,如果哈希值一样,接着会比较equals 方法 如果 equls 结果为 true ,HashSet 就视为同一个元素。这样主要是避免哈希冲突,所以还会使用equals 方法。

哈希值相同 equals 为 false 的元素是在同样的哈希值下顺延,就像哈希桶一样。HashSet 通过 hashCode 值来确定元素在内存中的位置。 一个 hashCode 位置上可以存放多个元素


TreeSet(红黑树)

TreeSet是使用二叉树的原理对新 add()的对象按照指定的顺序排序,TreeSet底层存储是使用红黑树实现的 。每增加一个对象都会进行排序,将对象插入的二叉树指定的位置。

自定义类的对象必须实现 Comparable 接口,并且覆写相应的 compareTo()函数,才可以正常使用。


LinkedHashSet

LinkedHashSet是HashSet+LinkedHashMap的组合体。

LinkedHashSet 底层使用 LinkedHashMap 来保存所有元素,它继承与 HashSet,并且其所有的方法操作上又与 HashSet 相同。


HashMap(数组+链表,红黑树)

HashMap根据键的 hashCode 值存储数据,HashMap 最多只允许一条记录的键为 null。HashMap 非线程安全, 可以用 Collections 的 synchronizedMap 方法使HashMap 具有线程安全的能力。

  • HashMap (JDK1.7):底层实现是数组+链表,HashMap 里面是一个数组,然后数组中每个元素是一个单向链表。并且链表元素是Entry 的实例。Entry 包含四个属性:key, value, hash 值和用于单向链表的 next。
  • HashMap (JDK1.8):底层实现是数组+链表+红黑树,当链表中的元素超过了 8 个以后,会将链表转换为红黑树。

HashMap构造函数的参数解析:

  • capacity:当前数组容量,始终保持 2^n,可以扩容。当数组的使用值到达扩容的阈值时进行2倍扩容。
  • loadFactor:负载因子,默认为 0.75
  • threshold:扩容的阈值

结构图:

在这里插入图片描述

在这里插入图片描述

参考博文:https://www.cnblogs.com/myseries/p/10876843.html


ConcurrentHashMap(线程安全)

ConcurrentHashMap的 Segment段 。ConcurrentHashMap和HashMap相似,ConcurrentHashMap 由一个个 Segment 组成。每一个Segment是一组数组,我们姑且叫它 Segment数组。 ConcurrentHashMap是线程安全的 ,内部使用的是ReentrantLock 来进行加锁。每次需要加锁的操作锁住的是一个 segment,这样只要保证每个 Segment 是线程安全的。

  • JDK1.7 下的ConcurrentHashMap结构:底层实现是 Segment数组+链表 , 上锁的对象是Segment,类似于分段锁。通过ReentrantLock 来进行加锁来实现线程安全。
  • JDK1.8 下的ConcurrentHashMap结构:底层实现是 Segment数组+链表+红黑树 ,跟HashMap类似。但链表长度大于某个阀值就变红黑树。

ConcurrentHashMap相关参数解析:

  • concurrencyLevel:并行级别(Segment数组个数),默认是 16,Segment数组不可扩容

结构图:

在这里插入图片描述

HashTable(线程安全)

映射的常用功能与 HashMap 类似,可以看作是线程安全版的HashMap,不同的是它承自 Dictionary 类。 HashTable是线程安全的 ,并发性上不如ConcurrentHashMap,因为HashTable没有像ConcurrentHashMap一样的分段锁,同意时间只能有一个线程能写Hashtable。Hashtable一般不用,我们一般使用HashMap或者ConcurrentHashMap。

TreeMap(红黑)

TreeMap的底层使用了红黑树来实现 ,像TreeMap对象中放入一个key-value 键值对时,就会生成一个Entry对象。

TreeMap 实现 SortedMap 接口,能够把它保存的记录根据键排序,在使用 TreeMap 时,key 必须实现 Comparable 接口或者在构造 TreeMap 传入自定义的Comparator。跟Treeset相似,也是通过对象的Comparable的接口方法来进行排序的,只不过 TreeMap使用key的Comparable 接口方法对比,而Treeset是直接使用对象的Comparable 接口方法对比

LinkedHashMap

LinkedHashMap 是 HashMap 的一个子类,保存了记录的插入顺序。

排序的,只不过 TreeMap使用key的Comparable 接口方法对比,而Treeset是直接使用对象的Comparable 接口方法对比

LinkedHashMap

LinkedHashMap 是 HashMap 的一个子类,保存了记录的插入顺序。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值