在最近接的我的项目中用到了很多汇合的常识,发现许多常识都遗记了,看来须要恶补一下了,毕竟根底不牢,地动山摇。
\(数组和汇合的区别 \)
其实简略来说,数组和汇合的最大区别就是汇合的长度可变,数组长度不可变
Collection 汇合(单链)
List 汇合
- ArrayList:底层数据结构是数组,查问快,增删慢,线程不平安,效率高,能够存储反复元素。
原理:该汇合增加元素时,首先判断本人长度是否够用,如果不够用就创立一个本身 1.5 倍的数组,再把原数组元素拷贝过去。数组的特点就是查问快,减少删除慢。
- LinkedList 底层数据结构是链表,查问慢,增删快,线程不平安,效率高,能够存储反复元素。
原理:LinkedList 汇合因为底层时链表实现的,链表的特点就是减少和删除比拟快,查问慢。
- Vector: 底层数据结构是数组,查问快,增删慢,线程平安,效率低,能够存储反复元素。
原理:Vector 和 ArrayList 汇合的底层原理差不多,最大的区别就是线程是否平安。线程平安就像一扇带锁的门一样,你拜访的时候要开锁,所以执行效率就比拟低。
以上三个汇合有一些专用的办法,我以 ArrayList 为例,话不多说间接上代码
其中有个重要的知识点,就是泛型的常识,泛型就是指定汇合所寄存元素的类型。按上例所示 Double 就是 ArrayList 的泛型。
如果查问多,增删少就用 ArrayList 汇合
如果增删多,查问少就用 LinkedList 汇合
如果都多就用 ArrayList 汇合
Set 汇合
- HashSet 底层数据结构采纳哈希表实现,元素无序且惟一,线程不平安,效率高,能够存储 null 元素,元素的唯一性是靠所存储元素类型是否重写 hashCode() 和 equals() 办法来保障的。
- LinkedHashSet 底层数据结构采纳链表和哈希表独特实现,链表保障了元素的程序与存储程序统一,哈希表保障了元素的唯一性。线程不平安,效率高。举了个例子来具体阐明:
- TreeSet 底层数据结构采纳二叉树来实现,元素惟一且曾经排好序;唯一性同样须要重写 hashCode 和 equals() 办法,二叉树构造保障了元素的有序性。
首先要解释一下 compareto 办法,它一个基于二叉树的排序办法:
而后再看个例题:
个别在开发的时候不须要对存储的元素排序,所以在开发的时候大多数用 HashSet,TreeSet 在面试的时候比拟多。