JAVA基础之集合框架

JAVA基础之集合框架

1.基础的集合

1.1根接口

map(映射):有序key值不可重复,value值可重复。
Map:Map实现类都用于保存具有映射关系的数据,它们保存的数据都是key-value对,如果要查找Map中的数据,总是根据key来获取,所以key是不可重复的,它用于标识集合里的每项数据。

public interface Map<K,V>

collection(根接口):一组对象,有无序的collection,也有无序的collection。

Collection派生出三个子接口,Set代表不可重复的无序集合、List代表可重复的有序集合、Queue是java提供的队列实现;Collection是最基本的集合接口,它提供了一些通用的方法,供子接口调用。

Iterable(迭代器):iterator为Java中的迭代器对象,是能够对List这样的集合进行迭代遍历的底层依赖。

Collection:继承了接口Iterable迭代器,即所有Collection集合体系中的集合类,都可以使用forEach进行循环遍历

public interface Collection<E> extends Iterable<E>

详细的根接口的底层点击这里

1.2常用集合

list(数组):有序可重复。
ArrayList:
1.有序可重复
2.底层是数组
3.线程不安全
4.初始默认10
5.扩容jdk1.7以前原始大小的1.5倍+1;java1.7以后(包含1.7)即原始大小的1.5倍。
6.查询快,增删慢
Vector:
1.有序可重复
2.底层是数组
3.线程安全
4.初始默认大小10
5.扩容大小是原始大小的2倍。
6.查询快,增删慢
LinkedList:
1.有序可重复
2.底层是双向链表
3.线程不安全
4.没有初始化大小,也没有扩容的机制。就是一直在前面或者后面新增就好。
5.查询慢,增删快

Queue:在两端出入的list

set(集):无序不可重复。
hashSet:
1.排列无序且不可重复
2.底层是hash表
3.存取快
4.底层实现是一个HashMap(保存数据),实现Set接口
5.默认初始大小为16
6.扩容大小为原始大小的2倍
7.线程不安全
LinkedHashSet:
1.底层是hash表
2.使用双向链表记录插入顺序
3.底层实现是一个LinkedHashMap
TreeSet:
1.排列有序且不可重复
2.底层是双向树实现的
3.TreeSet是基于TreeMap实现的
4.treeSet通过自然排序或者比较排序的方法排序
map(映射):有序key值不可重复,value值可重复。

链表增删快,查找慢
数组查找快,增删慢

HashMap:
1.HashMap 初始化大小是 16 ,
2.扩容因子默认0.75(可以指定初始化大小,和扩容因子)
扩容机制.(当前大小 和 当前容量 的比例超过了扩容因子,就会扩容,扩容后大小为 一倍。
3.当hashMap的数组大小超过64,链表长度超过8时,HashMap底层会转变为红黑树,当链表长度低于6时,HashMap底层会转变为链表
4.key不可以重复,value可以重复
5.key可以有一个null值,value可以有多个null值
6.线程不安全
7.底层是hash表

了解红黑树首先要知道什么是二叉查找树
什么是二叉查找树?
1.左子树上所有结点的值均小于或等于它的根结点的值。
2.右子树上所有结点的值均大于或等于它的根结点的值。
3.左、右子树也分别为二叉排序树
二叉查找树的优缺点
二叉查找树的最大查找次数等于二叉查找树的高度,在插入时,也是通过一层层的比较插入到比较适合的节点,但是当多次插入时,可能会变成近似与线性的情况,所以才有了红黑树
什么是红黑树?(红黑树是自平衡的二叉查找树)
1.根节点是黑色。
2.节点是红色或黑色
3.每个叶子节点都是黑色的空节点
4.每个红色节点的子节点都是黑色(从根节点到叶子节点的路径上不能有连续的红节点)
5.从任意节点到叶子节点的路径上黑色节点的数量是相同的
6.红黑树从跟到叶子的最长路径到最短路径不会超过2倍
当插入或者删除节点时可能会打破红黑树的规则时候会用到变色和旋转
变色:
为了重新符合红黑树的规则,尝试把红色节点变为黑色,或者把黑色节点变为红色。
左旋转:
逆时针旋转红黑树的两个节点,使得父节点被自己的右孩子取代,而自己成为自己的左孩子
右旋转:
顺时针旋转红黑树的两个节点,使得父节点被自己的左孩子取代,而自己成为自己的右孩子

TreeMap:
1.键不可以重复,值可以重复
2.底层是二叉树
HashTable:
1.key不可以重复,value可以重复
2.底层是hash表
3.线程安全
4.key和value不可以为空

2.集合线程不安全

2.1ArrayList线程不安全

1.给ArrayList的add方法增加synchronized(同步锁)

List<String> list = Collections.synchronizedList(new ArrayList<>());

2.使用CopyOnWriteArrayList(写时复制ArrayList)

List<String> list = Collections.synchronizedList(new ArrayList<>());

CopyOnWrite容器即写时复制的容器。往一个容器添加元素的时候,不直接往当前容器Object[]添加,而是先将当前容器Object[]进行copy,复制出一个新的容器Object[] newElements,然后新的容器Object[] newElements里添加元素,添加完元素之后,再将原容器的引用指向新的容器setArray(newElements);这样做的好处是可以对copyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。

2.1HashSet线程不安全

1.给HashSet增加synchronized(同步锁)

Set<String> set = Collections.synchronizedList(new ArrayList<>());

2.使用CopyOnWriteArrayList(写时复制HashSet)

Set<String> set = Collections.synchronizedList(new ArrayList<>());
2.1HashMap线程不安全

1.给HashMap增加synchronized(同步锁)

Map<String,String> map = Collections.synchronizedMap(new HashMap<>());

2.使用 ConcurrentHashMap

Map<String,String> map = new ConcurrentHashMap<>();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值