Java集合
集合的家族
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MeKAZxSE-1592019974582)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20200613102002305.png)]
集合与数组的区别
1.数组声明后只能存放同一种数据类型,集合可以存不同的数据类型
2.数组声明后长度不可变,集合是可变长度
3.数组可以存放基本数据类型和引用数据类型,集合只能存放引用数据类型注意:集合要想存放基本数据类型,可以封装成对应的包装类
Collection - 集合/接口:
List:(extends Collection)
特点:有序的可重复
注意:该接口添加了许多针对于下标操作的方法(所以有序的可重复)
ArrayList:
数据结构:一维数组
默认长度:10
扩容:指针(size) == 数组长度时扩容
扩容:原来长度的1.5倍
注意:不是线程安全
LinkedList:
数据结构:双向链表
特点:队列模式和栈模式
Vector:
数据结构:一维数组
默认长度:10
扩容:指针(elementCount) == 数组长度时扩容
扩容:原来长度的2倍
注意:是线程安全
Stack:(Stack extends Vector)
数据结构:一维数组
特点:栈模式
Set:(extends Collection)
Set:(extends Collection)
特点:无序的不重复
HashSet:(底层由HashMap实现)
数据结构:hash表(hash数组)
特点:去重复
LinkedHashSet:(底层由LinkedHashMap实现)
数据结构:hash表(hash和数组)
特点:去重复,有序
TreeSet(底层由TreeMap实现):
数据结构:二叉树(红黑树)
特点:自然排序(根据不同类型的属性进行不同的排序)
Map - 集合/接口:
HashMap:
数据结构:hash表(hash数组)
特点:无序、key是唯一的
注意:
1.默认长度16
2.负载因子0.75
3.临界值:长度*负载因子
4.每次扩容是原来的2倍
5.长度一定会是2的幂
LinkedHashMap:
数据结构:hash表(hash数组)
特点:有序、key是唯一的
Hashtable:
数据结构:hash表(hash数组)
特点:无序、key是唯一的
ConcurrentHashMap:
数据结构:hash表(hash数组)
特点:无序、key是唯一的
TreeMap:
数据结构:二叉树(红黑树)
特点:针对于key自然排序(根据不同类型的属性进行不同的排序)
Properties:文件集合(web项目中,会以配置文件的身份出现)
注意1:Collection vs Map
>Collection拥有直接获取迭代器的方法(遍历)
>
>Map没有直接获取迭代器的方法
>
>Collection存储单个值
>
>Map存储键值对(Key-Value)
注意2:理解 有序和无序
有序:存入顺序与取出顺序一致
无序:存入顺序与取出顺序不一致,无序不代表随机
注意3:泛型
含义:规定该使用的类型,是一种数据安全的做法
注意4:ArrayList vs LinkedList
>ArrayList:存储数据
>
>LinkedList:存储数据、队列模式、栈模式
>
>因为数据结构不同,效率也不同:(做实验证明)
>
>添加(不扩容):ArrayList快
>添加(扩容):LinkedList快
>删除:LinkedList快
>查询:ArrayList快
>修改:ArrayList快
>注意:使用最频繁的是ArrayList,因为项目中查询数据的功能最多,ArrayList查询快,所以使用他;
注意5:红黑树知识点
《算法导论》中对于红黑树的定义如下:
每个结点或是红的,或是黑的
根节点是黑的
每个叶结点是黑的
如果一个结点是红的,则它的两个儿子都是黑的
对每个结点,从该结点到其子孙节点的所有路径上包含相同数目的黑结点
注意6:排序接口(内置与外置)
Comparable接口 – compareTo方法
使用:一个类的对象存入TreeSet集合中,该类必须实现排序接口,自定义排序规则
Comparator接口 – compare方法
使用:这个类是别人的类,不能更改排序规则的情况下,使用外部排序接口
比较器的优先级别:Comparator > Comparable
注意7:HashMap vs Hashtable vs ConcurrentHashMap
HashMap 允许存入null键 null值
Hashtable 不允许存入null键 null值
ConcurrentHashMap 不允许存入null键 null值
HashMap 线程不安全
Hashtable 线程安全(直接在方法上加锁,效率低)
ConcurrentHashMap 线程安全(分段式加锁,效率更高)
注意8:HashMap源码问题
JDK1.7 :
数组+链表(hash桶)
hash碰撞:如果两个对象(Key)的hash值是一样的,在hash数组中的下标也是一样
多线程下有回环问题:源于多线程下扩容后的Entry地址引用
在方法上加锁,效率低)
ConcurrentHashMap 线程安全(分段式加锁,效率更高)
注意8:HashMap源码问题
JDK1.7 :
数组+链表(hash桶)
hash碰撞:如果两个对象(Key)的hash值是一样的,在hash数组中的下标也是一样
多线程下有回环问题:源于多线程下扩容后的Entry地址引用