大神博客写的很好:https://blog.csdn.net/justloveyou_/article/details/62893086
java集合:list、queue、set
前二有序、可重复,后一无序、不重复
保证不重复依据equals、低效
先hashCode计算元素位置,无、直存,有equals较同:不存?对应链头
arraylist、linkedlist、copyonwriteArrayList
a数组形式实现,顺序插入、查找快、插删慢
l:链表,顺序插、插慢、插删快
hashmap结合上利
http://www.baoding-soft.com/news/software/908.html
list:继承Collection,ArrayList是动态数组,LinkedList双向链表
list容量可动态扩展,有序:可以对某个元素在集合中的位置进行指定
可重复,集合对象Vector线程安全、arraylist、linkedlist线程不安全
arraylist:实现list可选操作,包括null在内的所有元素
基于数组实现,动态数组,容量自增,size标识元素个数
每个实例都有个容量,存储列表元素的数组的大小,至少等于列表的大小
自增带来数据向新数组的重新拷贝,扩容1.5倍+1
linkedList:双向链表
header表头,entry实例,previous上、next下、element该、size节点实例个数
element存放业务数据,previous与next分别是指向前后节点的指针
https://blog.csdn.net/justloveyou_/article/details/52955619
HashMap 和 HashSet
实现的接口规范不同,底层Hash存储机制相同;HashSet是在HashMap基础上实现
hashMap
构造一个指定初始容量和默认负载因子 (0.75)的空 HashMap
HashMap 的容量必须是2的幂次方,超过 initialCapacity 的最小 2^n
存取实现思路:
判断key是否为null,若为null,则直接调用putForNullKey方法;
若不为空,则先计算key的hash值,然后根据hash值搜索在table数组中的索引位置,
如果table数组在该位置处有元素,则查找是否存在相同的key,若存在则覆盖原来key的value,
否则将该元素保存在链头(最先保存的元素放在链尾)。此外,若table在该处没有元素,则直接保存。
PUT元素:
先根据key的hash值得到这个元素在数组中的位置(即下标)把元素放到对应的位置
如果元素所在位子已存放有其他元素,在同一位子上的元素将以链表的形式存放
新加入的放在链头,最先加入的放在链尾
hashMap数据结构:
数组和链表的结合
数组:寻址易插删难;链表:寻址难插删易;哈希结合
hash算法:位置、尽量分布均匀:HashMap底层数组长度为何为2的次方
static int indexFor(int h, int length) {
return h & (length-1);//key得hashcode值,数组的长度-1做一次“与”运算(&)
}https://my.oschina.net/ManderSY/blog/1604790
结果值一定=<数据长度、不会越界、存在不同的位置,碰撞机会小
hashmap构造函数capacity<<=1保证
扩容:resize
原数组的数据重新计算其在新数组中的位置并放进入
map中元素超过数组*loadFactor时,扩大一倍;耗性能
预知hashmap中元素个数,预设元素个数: new hashMap(个数)
capacity <<= 1; https://www.cnblogs.com/o-andy-o/p/3437101.html
i <<= 1;//i = i<<1 i等于i乘以2的1次方
i <<= 2;//i = i<<2 i等于i乘以2的2次方,>>就是相除了
static int hash(int h) {
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}http://www.iteye.com/topic/709945 一张图胜过千言万语
== equals hashCode
==:操作数的值间关系
基本数据类型:float double byte short int long char Boolean
变量直接存值,==比较值本身
引用类型:存储的是其关联对象在内存中的地址
equals:Object实例方法,比较两个对象的content是否相同
String重写equals方法
String str1 = new String("hello");
String str2 = new String("hello");虽然new但是true
重写原则:对称、自反、类推、一致
x.equals(null)【应使用关系比较符 ==】
同时需重写hashCode,且e中的成员变量h也要用
前比较项后摘要信息项
https:blog.csdn.net/justloveyou_/article/details/52464440
步骤:先判断是否同一引用、类型一致、内容一致
hashCode:object的native方法,获取对象哈希值,确定对象在哈希表中索引位置
hash将任意长度的输入通散列算法变成固定长度输出(散列值)压缩映射
散列值空间小于输入的空间、不同输入散列成相同输出
针对不同对象返回不同整数
Map.entrySet:表示一个映射项,key和value
返回set<map.entry<k,v>>表示映射项set
entry是map的内部类,实现了map.entry接口
keySet()返回Map中key值集合;entrySet()返回Set集合,集合类型Map.Entry。
entry接口是map的内部接口,实现getkey/value,setkey/value方法相当于一个javaBean
hashMap存储key-value使用数组加链表
linkedHashMap链表、treemap二叉
treeMap put时:
Comparable<? super K> k = (Comparable<? super K>) key;Comparable<T>对实现它的类对象整体排序:自然排序
https://blog.csdn.net/kyi_zhu123/article/details/52769469
compareble:
简单的同等性比较,允许执行顺序比较,与Object的equals方法具有相似的特性,涉及到泛型的。
类实现了Comparable接口,就表明它的实例具有内在的排序关系(natural ordering)
实现Comparable接口的对象数组进行排序,只需要:Arrays.sort(a);
compareTo通用约定和equals相似,将对象与指定对象比较。当对象小于、等于或者大于指定对象的时,返回一个负整数、零或者正整数。
如果由于指定对象的类型而无法和该对象进行比较,则抛出ClassCastException异常。
https://blog.csdn.net/Jing_Unique_Da/article/details/49924289
linkedHashMap:将所有Entry节点链入一个双向链表的HashMap
新增两个属性保证迭代顺序,双向链表头节点header、标志位AccessOrder
accessOrder:true安装访问顺序迭代,false插入顺序迭代
重新定义entry,新增指针before、after
next维护hashMap桶中entry连接顺序,before维护插入顺序
所有put进来的Entry都保存在HashMap中,但由于它又额外定义了一个以head为头结点的空的双向链表,
因此对于每次put进来Entry还会将其插入到双向链表的尾部。
https://blog.csdn.net/justloveyou_/article/details/71713781