Java集合

1.Java 常见的集合容器有哪些

集合分为单列集合和双列集合

单列集合下面有 List 和 Set

List 常用的有 ArrayList LinkedList

Set 有 HashSet 和TreeSet

双列集合是Map 常见的有 HashMap TreeMap Hashtable

2.List Set Map 之间的区别是什么

List属于单列集合,存储的是一个一个的元素

List存在重复元素

List的存取顺序一致

List每一个元素都有对应的索引,可以根据索引获得元素

Set也属于单列集合,存储的也都是一个一个的元素

Set里面的元素唯一,不可重复

Set的存取无序

Set没有索引,不能根据索引获取元素

Map属于双列集合 以键值对的形式存储元素

3.ArrayList 和 LinkedList 的区别

ArrayList 的底层数据结构是 数组, 它在内存中开辟一段连续的内存地址,所以它的查询效率比较快 ,增删比较慢 ;

扩容: 默认长度为10 , 如果当前数组已使用长度加一后大于当前数组长度,则调用grow 方法进行扩容,扩容为原来的1.5倍

LinkedList 的底层数据结构是双向链表, 它在内存中的内存地址不是连续的, 所以它在查询到的时候比较慢, 但是它可以通过头插法和尾插法进行数据的增删,所以增删比较快

Vector 线程安全

currountHashMap 线程安全 采用分段式锁

4.HashMap

HashMap的数据结构: 底层使用hash表数据结构,即数组和链表或红黑树

  1. 当我们往HashMap中put元素时,利用key的hashCode重新hash计算出当前对象的元素在数组中的下标

  2. 存储时,如果出现hash值相同的key,此时有两种情况。

    a. 如果key相同,则覆盖原始值;

    b. 如果key不同(出现冲突),则将当前的key-value放入链表或红黑树中

  3. 获取时,直接找到hash值对应的下标,在进一步判断key是否相同,从而找到对应值。

  4. 链表的长度大于8并且 数组的长度大于64 就转换为红黑树 ,以减少搜索时间。 如果红黑树拆分的树的结点数小于等于临界值6个的时候,则退化为链表

扩容: 默认初始化数组长度是16,每次扩容达到扩容阈值 0.75 的话 他就扩容为之前容量的两倍

5.HashTable和HashMap的区别

HashTable是不允许出现重复元素的

HashTable 是线程安全的 ,它使用到的锁是 Synchronized 但是这个锁太重了, 多线程环境下一般使用ConcurrentHashMap 它的锁是分段式的锁, 性能更高

6.红黑树

TODO:

BlockingQueue是什么?

请谈谈BIO,NIO,AIO.

BIO:是同步阻塞IO,每个连接就占用一个线程.以网上一个经典的烧开水的例子,帮助理解:假设有一排水壶都在烧开水,BIO的工作模式就是让一个线程停留在一个水壶上,直到这个水壶的水烧开了,再去处理下一个水壶,实际上在线程等待水壶水烧开的这段时间,啥也没做,浪费了资源,所以BIO比较慢.

NIO:同时支持同步阻塞/非阻塞IO,每一个请求占用一个线程.还以烧开水为例,NIO是让一个线程去轮询每个水壶的状态,看看是否有水壶的状态发生了改变,从而进行下一步操作.

AIO:异步非阻塞IO,每一个有效请求占用一个线程.继续以烧开水为例,AIO相当于在每个水壶上装了一个提示装置,当水烧开时自动通知线程来处理.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MingZhe1008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值