JB-001-JAVA集合介绍

Java 集合介绍

集合 存储相同类型的数据,并能够对数据进行增删改查等操作。

Collection 该接口没有直接实现类,有两个继承的子接口List和Set;List可以存储重复元素,Set是不能够存储重复元素。

1、List

List存放的数据是有序的,其主要关注的索引,List中的实现类有如下。

1.1 ArrayList

  1. 原理: ArrayList是基于数组的,其在初始化的时候会构造一个空的数组(Object[] elementData={})。ArrayList默认的Capacity长度是10,如果Capacity达到最大,那么给容量增加Capacity/2。元素是安装插入的顺序排序。
  2. 线程安全: 非线程安全的,多线程下增删元素出现数据不一致。
  3. 性能: 由于是数组存储, 可以根据索引直接去查找元素,查找效率高;对于删除和增加元素而言,需要进行元素的移位操作,所以插入删除的效率低。
  4. 主要方法: add:插入第一个元素是初始化capacity;remove可以根据下标也可以根据Object删除,删除后空间不释放;提供sort方法排序。

1.2 LinkedList

  1. 原理: LinkedList是基于链表的,它是一个双向列表,每个节点维护了一个pre和next,每个节点维护了一个first和last指针。
  2. 线程安全: 非线程安全的,多线程下增删元素出现数据不一致。
  3. 性能: 链表方式修改指向,所以插入删除数据效率高,不支持索引查找,查找效率低。
  4. 主要方法: LinkedList提供了几个添加元素的方法:addFirst、addLast、addAll、add等,时间复杂度为O(1)。LinkedList提供了几个移除元素的方法:removeFirst、removeLast、removeFirstOccurrence、remove等,时间复杂度为O(1)。

1.3 Vector

  1. 原理: Vector,其在初始化的时候会构造一个空的数组(Object[] elementData={})。ArrayList默认的Capacity长度是10,如果Capacity达到最大,那么给容量增加Capacity。元素是安装插入的顺序排序。
  2. 线程安全: 线程安全,给每个方法上使用synchronized控制。
  3. 性能: 由于线程安全,所以性能会比较差,一般情况下不建议使用。
  4. 主要方法: ---。

2、Set

Set存放的是不重复元素,也没有插入先后顺序之分。

2.1 HashSet

  1. 原理: HashSet其实是通过封装HashMap实现的,其元素存储在HashMap的key上,对应的key的value的值永远是persent。HashSet的key不允许重复,可以为null。HashSet初始化容量为16,其扩大因子0.75。
  2. 线程安全: 线程非安全
  3. 主要方法: HashSet克隆其实是浅拷贝,并没有复制元素。

2.2 TreeSet

  1. 原理: 基于 TreeMap 的 NavigableSet 实现。使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator进行排序,具体取决于使用的构造方法。
  2. 线程安全: 线程非安全

3、Queue

4、Map

Map集合中存储的是键值对,键不能重复,值可以重复。根据键得到值,对map集合遍历时先得到键的set集合,对set集合进行遍历,得到相应的值。

###4.1 HashMap ###

  1. 原理: HashMap是以数组的方式存储key/value,允许null作为key和value,key不可以重复,value允许重复,不保证元素迭代顺序是按照插入时的顺序,key的hash值是先计算key的hashcode值,然后再进行计算,每次容量扩容会重新计算所以key的hash值,会消耗资源,要求key必须重写equals和hashcode方法。默认初始容量16,加载因子0.75,扩容为旧容量乘2,查找元素快,如果key一样则比较value,如果value不一样,则按照链表结构存储value,就是一个key后面有多个value;HashMap底层就是一个数组结构,数组中的每一项又是一个链表。
  2. 线程安全: 线程非安全
  3. 方法: hashCode和equals
  4. hashCode hashCode是用来在散列存储结构中确定对象的存储地址;如果两个对象相同,这两个对象hashcode一定相同;如果两个hashcode相同,,对象不一定相同。如果equals重写,那么hashcode也要重写。
  5. 扩容 默认情况下,数组大小为16,那么当hashmap中元素个数超过16x0.75=12的时候,就把数组的大小扩展为2x16=32,即扩大一倍,然后重新计算每个元素在数组中的位置,而这是一个非常消耗性能的操作,所以如果我们已经预知hashmap中元素的个数,那么预设元素的个数能够有效的提高hashmap的性能。

4.1 HashTable

  1. 原理: HashMap(1)存储结构也是数组+链表,(2)Key和Value都不能为空。
  2. 线程安全: 线程安全
  3. 方法: hashCode和equals,插入元素如果KEY冲突,元素插入到对应链表的第一个元素。
  4. 扩容 Hashtable的扩容原理,扩容因子0.75,bucket的初始大小11.(扩容的函数为2N+1,hashMap的扩容函数是2N,之所以是2的倍数,是因为,Hashtable为了保证速度,扩容直接位移<<1这样就是2的倍数)

转载于:https://juejin.im/post/5cbd0af45188250a971335bc

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值