Java集合入门




前言

排坑排到集合了,想看源码很久了,终于如愿以偿




@TOC

集合

架构体系

单列集合

«interface» Iterable «interface» Collection «interface» Set «interface» List Vector ArrayList LinkedList TreeSet HashSet

双列集合

«interface» Map HashMap TreeMap HashTable LinkedHashMap Properties



单列集合

List接口实现类

ArrayList
  1. Arraylist中维护了一个Object类型的数组(transient object[] elementData;// transient表示瞬间短暂的,表示该属性不会被序列化与反序列化)
  2. 当创建 ArrayList对象时,如果使用的是无参构造器,则初始容量为0,第1次添加,则扩容 elementData为10,如需要再次扩容,则扩容 elementData为1.5倍
  3. 如果使用的是指定大小的构造器,则初始 elementData容量为指定大小,如果需要扩容,则直接扩容 elementData为1.5倍。

Vector
  1. Vector底层也是一个对象数组,protected Object[] elementData。

  2. Vector是线程同步的,即线程安全, Vector类的操作方法带有 synchronized。

public synchronized E get(int index) {
    if (index >= elementCount)
    	throw new ArraylndexOutofBoundsException (index);
    return elementData(index)
}  
  1. 在开发中,需要线程同步安全时,考虑使用 Vector。

LinkedList
  1. 实现双向链表和双端队列。
  2. 线程不安全

对比
底层结构线程安全效率扩容倍数
ArrayList可变数组不安全查找O(1)效率高1.5倍(初始容量默认为10)
Vector可变数组安全查找O(1)效率低2倍(初始容量默认为10)
LinkedList双向链表不安全查找O(n),修改O(1)



Set接口实现类

HashSet
  1. 不保证有序,顺序取决于Hash

  2. 底层是HashMap(HashMap底层是数组 + 链表 + 红黑树)

  3. 添加元素的实现原理(减少了Set中equals的次数,提高了效率)

    1. 获取hash值
    2. 遍历table,产看索引是否有元素
    3. 没有就加入
    4. 有,调用equals比较,相同放弃添加,不同添加到链表末尾
    5. Java8以后,链表长度大于等于8,会转换为红黑树
    6. 建议看源码

TreeSet

​ 1. 二叉树算法实现的有序Set


LinkedHashSet

HashSet的链表实现



双列集合

Map接口实现类

HashMap
  1. 实现原理,见HashSet
  2. 非线程安全,如果需要满足线程安全,可以用 Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap。

TreeMap
  1. 可以排序
    1. 对其中的元素使用Comparable接口
    2. 自定义比较器Comparator

HashTable
  1. 线程安全
  2. key和value都不允许有null

ConcurrentHashMap
  1. 支持并发,原理是分段锁的实现(一个 Segment 数组,它的内部细分了若干个小的 HashMap)

Properties
  1. 继承自HashTable类并实现了Map接口,也是一种k-v行是保存数据
  2. 使用与hashtable类似
  3. 可以用于从.properties文件中加载数据到Propertis类对象并进行读取和修改



Collections工具类

常见方法

1reverse(List)	//反转List元素的顺序
2shuffle(List)	//对List集合元素进行随机排序
3sort(List)	//升序排序
4sort(List, Comparator) 		//根据指定比较器排序
5swap(List, int, int)	//交换



小结

开发中如何选择集合的实现类

  1. 判断储存类型(一组对象【单列】,一组键值对【双列】)

  2. 单列

    1. 允许重复:List
      1. 修改多:LinkedList
      2. 查询多:ArrayList
    2. 不允许重复:Set
      1. 无序:HashSet(底层HashMap,维护数组 + 链表 + 红黑树)
      2. 有序:TreeSet
      3. 插入和取出顺序一致:LinkedHashSet(数组 + 双向链表)
  3. 双列:Map

    1. 键无序:HashMap
    2. 键有序:TreeMap
    3. 出入一致:LinkedHashMap
    4. 读取文件参数:Properties



推荐文章

[Java集合篇]Collection单列集合和Map双列集合知识点汇总

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值