Java容器

容器

在这里插入图片描述

collection

1. List,set,queue的基本接口
2. 如何一边遍历一边删除
使用迭代器的remove()方法;
3. Collection 和 Collections 有什么区别:前者是集合类接口,后者是集合类的工具类,提供了一系列的静态方法(创建单例,实现不可修改类等)。

Iterator<Integer> it = list.iterator();
while(it.hasNext()){
// todo something
	it.remove();
}

List

ArrayList :排列有序,可重复;底层使用数组;线程不安全;随机访问,查询快,增删慢,有一定的空间浪费;扩容1.5+1。+一半+1
适合随机查找和遍历。ArrayList默认构造的容量为10,没错。 因为ArrayList的底层是由一个Object[]数组构成的,而这个Object[]数组,默认的长度是10。
Vector:有序,可重复,底层使用数组,线程安全(使用了sync),扩容
2.
因为使用了sync,所以访问起来比较慢。Vector:线程安全,但速度慢。底层数据结构是数组结构。加载因子为1:即当 元素个数 超过 容量长度 时,进行扩容扩容增量:原容量的 1倍。如 Vector的容量为10,一次扩容后是容量为20
LinkedList:有序,使用了双向循环链表,增删快,查询慢,线程不安全
可以当做队列使用,双向队列,堆栈来使用。

Set

HashSet:无序,不可重复;底层使用hash表实现;存取速度快;内部是HashMap
TreeSet:有序,不可重复;底层使用二叉树实现;排序存储;内部是TreeMap的SortedSet。
//需要覆盖compare()方法
LinkedHashSet:采用hash表存储,使用双线链表记录插入顺序;内部是LinkedHashMap

Queue

Map

HashMap: 键不可重复;底层哈希表;线程不安全;允许key为null,value为null。查询快。默认大小是16,扩容因子0.75。
(数组+链表+红黑树)链表中的元素超过8就会转换成红黑树,查找的时间复杂度降低为O(LogN)
1. 如何确定key放在数组哪里:
首先得到4字节的hashcode(int类型)
hashcode的高16位与低16位异或得到hash值(因为数组一般不会超过16位,为了让高16位参与进来,稀释到低16位中,提高散列均匀度)
然后hash值与数组长度-1的值进行按位与得到坐标。
2. 扩容原理:扩容到原本的2倍。扩容阈值和容量值同时增倍。
3. 为什么hashmap的key一般是int或string:因为已经重写了hashcode()和equals()方法。
4. 为什么容量是2的次方:前面说过的,要-1与操作,如果是2的次方,那就可以直接按位与操作(其实原本是取余操作,因为是2^n-1所以等同于按位与)
HashTable:键不可重复;底层哈希表;线程安全;不允许key和value为null。效率低下,使用了sync。
Hashtable: 线程安全,默认初始容量为11,加载因子为0.75:即当 元素个数 超过 容量长度的0.75倍 时,进行扩容,扩容增量:原容量的 1 倍+1。如 Hashtable的容量为11,一次扩容后是容量为23。
TreeMap:键不可重复值可以,底层二叉树。在使用 TreeMap 时,key 必须实现 Comparable 接口或者在构造 TreeMap 传入自定义的
Comparator,否则会在运行时抛出 java.lang.ClassCastException 类型的异常,需要对有序的key进行遍历的时候考虑使用treeMap。
LinkHashMap hashMap的子类,有序的

ConcurrentHashMap

Node数组(里面的每一个Node都是一个锁,Node可以是链表或红黑树)+链表(元素个数小于8)+红黑树(同Key元素个数大于8)。
锁分段技术,当一个节点被访问从而被锁住的时候,其他节点依旧可以被访问,从而提高了访问速度。并行度16。

CopyOnWriteArrayList

写时复制容器。适合读多写少。读时无锁。写时复制。缺点明显,占用内存,容易引起GC。

CopyOnWriteArraySet

写时复制容器。适合读多写少。读时无锁。写时复制。缺点明显,占用内存,容易引起GC。

ConcurrentSkipListSet

通过concurrentSkipListMap实现,线程安全,有序,只用了concurrentSkipListMap的key来存储数据。内部有一个concurrentSkipListMap的对象。

ConcurrentSkipListMap

使用跳表实现 空间换时间,线程安全。
key是有序的 ConcurrentHashMap的key是无序的。
无锁实现 CAS操作保证线程安全(两层for循环多次验证)。所以并发量特别大的时候,性能更好。
ConcurrentHashMap的并发量为16,超过16线程的时候,性能会下降

排序

继承Comparator接口。传进去一个比较器就可以,侵入性小,不需要修改代码。外部比较器。
继承Comparable,自然排序,从小到大。侵入性高。需要修改代码。覆盖compare()方法。

如何保证集合不能被修改

Collections.unmodifiableMap();等
final
ImmutableMap<>; //谷歌的包

创建单例链表

List<Object> list= Collections.singletonList(item);//只需要一行代码,并且item不需要包装

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值