java 集合框架
集合图解
个人总结
List :有序 可以插入多个空,可以有重复值
ArrayList: 查询修改快,增删慢,因为List底层结构是数组有索引,所以可以根据索引查询效率快,线程不安全,效率快。
LinkedList:增删快,查询慢,底层结构是双向链表,所以增加删除快,线程也是不安全,效率快
Voctor:线程安全,底层加了Synchronized 但是效率慢
set:
hashSet: 只可以插入一个null,不能重复,底层结构是Map,插入的值就是插入到Key上,
线程不安全,无序的
LinkedSet: 底层是双向链表,所以查询出来的是有序的,底层结构是LinkedHashMap
Map
HashMap:
键值对的形式存储,底层结构是数组+链表+红黑数,数组初始化大小是16,默认加载因子是0.75,16x0.75=12,这个12 就是临界值,意思就是当塞入的数据到达12的时候,就会增加数组长度,16x2=32, 32x0.75=24,就是下一个临界值。
链表就是每一个Key的Has值相同,然后就在eques比较值,Key不相同:就会形成一个链表,第一个值的next就会指向下一个数据。相同的Key:就不能增加
当两个数据Key相同的时候,value的值就会替换上一个值
红黑数的出现,就是当链表到达8或者以上,和数组值到到64才能转换成红黑数
HashTable:
hashTable 的键和值都不能为null,否则会抛出NullPointerException
hashTable 线程是安全的 ,因为加了synchronized关键字,HashMap 线程是不安全的
Iterator 迭代器
iterator 迭代器 就是循环 集合中的数据
在调用iterator.next()方法之前必须要调用iterator.hasNext()进行检测,若不调用,且下一条记录无效,直接调用iterator.next()会抛出
NoSuchElementException异常
iterator.hasNext() 判断下个坐标是否有数据
iterator.next() 获取下个数据
增加for循环也可以循环获取集合中的数据
增强for循环底层也是迭代器
List
list集合 是有序的 可以重复
ArrayList
ArrayList 可以塞入任何数据,和空值
ArrayList 是由数组来实现数据存储
ArrayList 是线程不安全
ArrayList 查询快 增删慢
查询快:是因为可以根据下标查询 ,顺序都是有序的
增删慢 :每当插入或者删除的时候倒要想后移动元素
当插入元素的时候还要判断需要是否扩容 然后需要扩容就的增加操作
当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData容量为0,第1次添加,则扩容elementData为10,如需要再次扩容,则扩容elementData为1.5倍
如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容,则直接扩容elementData为1.5倍
自我总结ArrayList源码分析
底层结构是数组
不管有参无参 第一个就是装箱操作 List 只接受装箱的数据类型
假如是无参构造的ArryList
增加的执行顺序
先进入下面这个方法
elementData==0 就进入Math.max 方法
返回的就是10
10-0>0
这个方法 就是扩容方法 每次扩容1.5倍
int newCapacity = oldCapacity + (oldCapacity >> 1);
vector
底层结构是数组
vector 空参数构造 也是初始化为10
扩容 是2倍
vector 是线程安全的 因为 add 方法 增加了synchronized 所以线程是安全的 但是效率会低
LinkedList
LinkedList底层实现是双向链表
可以添加任意元素,元素可以重复,可以为null
线程不安全,没有实现同步
增删快,查询慢
只需要修改插入位置或删除位置左右数据的引用目标即可。
查询的话 就的从头开始一个个查询
set
set 接口是无序的 不可以重复 可以增加一个空
set add 的底层是HasMap
增加的值就是Map 的K 的位置 所以是不能重复的
LinkedHashset
LinkedHashset 插入的顺序和取出的顺序是一致的
LinkedHashset 底层维护的就是LinkedHashMap(hashMap的子类)
LinkedHashset 底层结构 是数组加双向链表
Map
Map保存具有映射关系的数据 :Key-Value
Map中的Key和Value 都是用的引用数据类型
Map中的Key不允许重复 ,value 可以重复
Map中可以存一个NUll ,Value可以存多个Null
HasMap 的底层是数组加链表+红黑树
hasMap的扩容机制
1<<4 默认是16个 加载因子 是0.75 16*0.75 那么 就会算出12
当数据增加到12 的时候就会扩容 而不是增加满了才扩容
16x2=32 32x0.75=24 那么下次的临界值就是24
hasMap底层数组加链表的实现
每次插入一个数据都会有has 值 ,然好会跟每一个值去比较,假如是相同的has值
那么就要eques比较内容是否相同,相同的话就不加入,然后返回
不相同的话 就在后面加上变成链表形式
当链表的个数达到8的时候不会变成红黑数,要等数组个数变成64才能变成红黑树
Hashtable
hashTable 的键和值都不能为null,否则会抛出NullPointerException
hashTable 线程是安全的 ,因为加了synchronized关键字,HashMap 线程是不安全的