Collection
List
特点:里面的元素时有序的,且可重复,因为体系里有索引,用户可通过索引来访问元素。
特有方法:add(index,element),addAll(index,collection),remove(index),set(index,element)
ArrayList
底层采用的数组结构,初始化大小为10,插入新元素的时候,会判断是否需要扩容,扩容的步长是0.5倍原容量,扩容方式是利用数组的复制,这就降低了增加的效率。ArrayList想要在指定位置插入或删除元素时,主要耗时的是System.arraycopy动作,会移动index后面所有的元素。但查找时直接根据索引进行查找就可以了。
LinkedList
底层采用了链表数据结构,在增加或删除时只需改变指针的指向,速度很快,但查询时,node()函数遍历链表,虽然使用二分法,但效率还是低于ArraryList
总结
ArraryList采用数组数据结构,查询快,增删慢,因为查询时调用get()方法,获取索引,增删时要改变数组的大小,只要是System.arryCopy,移动index后面的所有值。而LinkList采用链表数据结构,增删时只需改变指针指向,查询慢,因为要遍历整个链表。
Set
元素是无序的,且不可重复
HashSet
实现Set接口,底层是hashcode数据结构,存入的是对象,且是无序不重复的,通过hashcode和equals方法来判断元素是否相同
TreeSet
底层是红黑树数据结构,有序不重复的。当元素自身具有比较性时,继承comparable接口覆盖compareTo方法进行比较,当不具有比较性时,自定义比较器comparator,覆盖compare方法
Map
HashMap
1.底层数据结构
JDK 1.8对HashMap进行了优化,改成了数组、链表和红黑树(在链表长度大于8的时候进行转换)
2.工作原理
HashMap根据put()和get()来存储和获取对象,存储时,先计算key的hash值,然后用indexFor()方法找到数组Entry的下标值,然后判断hashcode是否相同以及key是否是同一个key,否的话插入,相同则覆盖value。取出时也是根据key的hashcode确定数组的下标取出,通过equals方法找到正确的键值对,取出
3.hashmap的key value可以为空值
4.hashMap的扩容机制
HashMap全总结
https://blog.csdn.net/mbshqqb/article/details/79799009?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161191627816780265472145%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=161191627816780265472145&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-4-79799009.first_rank_v2_pc_rank_v29_10&utm_term=hash%E5%8E%9F%E7%90%86&spm=1018.2226.3001.4187