集合:
Collection(I) + Map(I)
Collection(I)
| - List(I)
| - ArrayList(C) - 数组
| - LinkedList(C) - 双向链表
| - Vector(C) - 数组
|- Stack - 作为栈实现
| - Set(I)
| - HashSet(C) - 散列表
| - SortedSet(I)
| - TreeSet(C) - 二叉树
| - Queue(I) - 队列
| - Deque(I) - 双端队列(栈)
| - LinkedList(C)
Map(I)
|- HashMap(C)
|- LinkedHashMap(C)
|- HashTable(C)
|- ConcurrentHashMap(C)
|- SortedMap(I)
|- TreeMap(C)
Map的特点:
1).Map集合是一个双列集合,是以key-value的形式表示.
2)key和value都可以使用泛型,也就意味着可以使用引用数据类型(自定义类)
3).key值都不允许有重复值
4).value值允许有多个重复值
5).如果key值完全一致,则value值会被覆盖
6).因为key是唯一的,可以通过key找到value值
HashMap(C):
1.底层实现: 哈希表(散列表)
2.底层数据结构:
JDK1.7: 数组 + 双向链表
JDK1.8: 数组 + 双向链表 + 红黑树
3.特点:
就是Map接口的特点
4.HashMap的存储过程:
a.计算key的hashCode值,确定位置
b.如果位置上有元素,则使用equals()和该位置上的所有元素比较
c.如果元素一致,会进行覆盖
d.如果元素不一致,则直接存入链表末尾
5.初始空间大小
a.默认初始容量:16
b.加载因子: 0.75 -> 容量达到百分之75的时候进行扩容
b.如果元素太少就进行扩容,会造成空间的浪费
c.如果元素太多进行扩容,则会造成效率低下
遍历方式:
1)获取所有的key,并且得到对应的Set集合类型
map.keySet()
2)获取所有的value,并且得到对应的List集合类型
map.values()
3)获取所有的键值对entry,并且得到对应的Set集合类型
注意:
a.在set集合中只能存放一种泛型,所以键值对(entry)也是一个整体泛型类型
b.Entry是属于Map的内部接口,内部接口的使用方式和内部类一样
c.Entry的结构
获取键:
getKey()
获取值:
geyValue()
LinkedHashMap(C)
1)底层数据结构:数组+链表+双向链表
2)特点:
a.按照插入顺序进行排列
TreeMap(C)
1)底层数据结构:红黑树
2)作用:
a.对Map集合进行排序
Hashtable(C)
1)底层数据结构: 数组 + 链表
2)和HashMap的区别
a.父类的不同
b.线程安全
c.版本问题
d.扩容问题
e.是否可以存在null值
ConcurrentHashMap(C)
1)底层数据结构:
JDK1.7: 数组 + 链表
Segment数组 + hashEntry数组 + hashEntry链表
JDK1.8: 数组 + 链表|红黑树
CAS + synchronized(同步锁)
CAS全称: Compare And Swap - 比较并交换
三个数据值:
内存值V 当前值A 修改的新值B
情况1:
内存值V 和 当前值A 比较结果相同,将修改的新值B替换内存值V的值
情况2:
内存值V 和 当前值A 比较结果不相同,要么重试,要么就放弃更新
CAS的目的: 把内存值V 和 当前值A进行比较
synchronized锁: 每一次会让一个线程操作共享的数据,而CAS相当于是没有加锁,多个线程就都可以操作共享的数据.
在实际去修改的时候才会去判断能否修改成功.