JB-001-JAVA集合介绍 左手的ㄟ右手 2022-10-01 06:53 146阅读 0赞 ## 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
还没有评论,来说两句吧...