Java中常见的集合

Java中常见的集合

一、Collection

1、List(有序,可重复)

ArrayList
  1. 内部是通过数组实现(缺点是每个元素之间不能有间隔)
  2. 有序,可重复
  3. 当从ArrayList中间进行插入或者删除元素时,需要对数组进行复制,移动,代价很高
  4. 随机查找和遍历的速度很快,不适合插入和删除。
LinkedList
  1. 内部通过链表实现
  2. 有序,可重复
  3. 由于是通过链表实现**,动态的插入和删除比较方便,随机访问和遍历的速度比较慢**
Vertor
  1. 内部通过数组进行实现
  2. 与ArrayList不同的支持线程同步,某一时刻只能一个线程写Vertor,避免多线程同时写引起的不一致。
  3. 缺陷:由于线程同步,访问速度比较慢。

2、Set(无序,不可重复)

​ 存储无序(存入和取出的顺序不一定相同),值不能重复,对象的相同本质是hashCode值判断,如果想让两个不相等的对象相等,就必须覆盖Object的hashCode方法和equals方法。

HashSet
  1. HashSet存储数据时是按照哈希值进行存储。取数据也是按照哈希值取数据的。
  2. 元素的哈希值通过HashCode方法来获取。HashSet首先判断两个的哈希值,哈希值相同再调用equals方法。
  3. Hash值会存在相同,equals不同的情况是,会有哈希桶的情况,即排成一列。
TreeSet
  1. 内部实现原理二叉树
  2. 添加元素时:对新add()的对象进行排序,每增加一个对象就会进行排序,之后插入到二叉树
  3. Integer和String对象都可以进行默认的TreeSet排序,自定义对象,想要实现排序,自定义类需要实现Comparable接口,覆写compareTo()函数。
LinkHashSet
  1. 底层:继承于HashSet,基于LinkedHashMap实现,保存元素:使用LinkedHashMap保存元素
  2. 实现方法:LinkedHashSet只提供了四个构造方法,并通过传递一个标识参数,调用父类的构造器。直接调用父类HashSet的方法即可。

3、Queue

二、Map

1、HashMap(重要)
  1. 底层:Java8(数组+链表+红黑树),Java7(数据+链表)
  2. 键、值:最多只允许一条记录的键为null,允许多条记录的值为null
  3. 线程安全:非线程安全(任一时刻,可以有多个线程同时写HashMap)
    • 实现线程安全的方法:1、用Collections的syschronziedMap方法实现;2、使用ConcurrentHashMap实现

详解:

  • Java7下的HashMap
    1. 底层实现:数组+单向链表
    2. 每个实体是嵌套了一个Entry实例:Entry包含四个属性:key,value,hash值和单向链表的next.
      • capacity:当前数组容量,始终保持2^n,扩容后数组的大小是当前的2倍。
      • loadFactor:负载因子,默认为0.75
      • threshold:扩容的阈值,等于capacity*loadFactor
  • Java8下的HashMap
    1. 底层实现:数组+链表+红黑树
    2. 红黑树增加的意思:在java7时,查找的时候,通过数组能够快速的定位到具体的下标,之后就需要顺着链表一个一个进行比较。时间复杂度取决于链表的长度,为O(n), Java8时,当链表当中的元素超过8个的时候,就会将链表转换为红黑树,继而这些位置查找的时候,就降低了时间复杂度为O(log N).
2、ConcurrentHashMap(重要)
  1. 组成:由一个个的Segment组成。也被称为分段锁
  2. 线程安全:ConcurrentHashMap是一个Segment数组(Segment继承ReentrantLock加锁),所以加锁的时候,是锁住一个segment,这样就保证了线程的安全。
  • Java7下的ConcurrentHashMap
  1. concurrencyLevel(并行度默认16):也被称为segment数,默认为16,所以理论上可以有16个线程并发写,在初始化的时候,可以设置“16”这个数。但是一旦初始化,就不能够进行扩容。
  • Java8下的ConcurrentHashMap
  1. 引用了红黑树
3、HashTable
  1. 线程安全:任一时刻,只能一个线程进行写。并发性不如ConcurrentHashMap
  2. 项目需要线程安全时一般使用ConcurrentHashMap,不需要线程安全时可以用HashMap替换。
4、TreeMap(可排序)
  1. 实现SortedMap接口,能够把保存的记录根据键排序,默认按照键值升序排序
  2. 用Iterator遍历时,得到的记录也是排序之后的。
  3. 注意:使用TreeMap时,key必须实现Comparable接口,或者构造TreeMap时传入自定义的Comparator,否则会抛出异常。
5、LinkHashMap
  1. LinkHashMap是HashMap的一个子类。保存了记录的插入顺序。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

挖土机-挖挖挖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值