Java面经(3)—集合篇

Java面经总结—集合篇

1.Collection集合和Map集合

Collection集合,是集合类的顶级类,List,Set,Queue集合都是继承自Collection集合的子类
Map集合,实现类用键值对的形式保存数据

2.List,Map,Set集合

List:链表存储结构的集合,元素可重复
Set:存储的元素不能重复,无序集合
Map:Map集合是key-value形式,key值是不可重复的,value值可重复

3. List:ArrayList集合和Vector集合

ArrayList data = new ArrayList<> ();
初始化一个初始容量为10的空list(开始时长度为0),当往集合中添加数据时才会判断是否超过10,若没有超过则返回10,否则返回一个添加长度。当添加数据超过1.5倍时,扩充长度1.5倍。

Vector集合 Vector data = new Vector<>();
Vector线程安全,但不经常用

4.LinkedList

链表结构的List

//模仿双向链表
data.addFirst(100);
data.addFirst(200);
Integer i = data.removeFirst();
Integer i = data.getFirst();
//模仿栈
data.push(100);
data.push(200);
Integer i = data.pop();
//模仿双向链表
data.addLast();
data.getLast();
Integer i = data.removeLast();
Integer i = data.getLast();

5.Iterator迭代器和ListIterator

ArrayList<Integer> data = new ArrayList<>();
data.add(1);

//ListIterator可以有add(),next(),set(),size(),previous()等
ListIterator<Integer> iterator = data.listIterator();
iterator.add(100); //此时是迭代器add,指针初始位置在add集合外
iterator.next();
iterator.set(200);
iterator.size();

//当只使用Iterator时,只有next()方法了
Iterator<Integer> iterator2 = new Iterator<>();
iterator2.next();

6. set集合和List集合的有序性

单值存储不重复

从本质上讲,List和Set内元素有序/无序的核心区别

List的元素有序是因为它的底层是线性结构的数组(或者链表),元素的存取是和add的先后(时间)次序有关的——本质上与时间相关

Set的元素无序是因为它的底层是非线性结构的哈希表/二叉树,元素的存取是和add的先后(时间)顺序无关的——你先add还是后add,都是存在Hash表中的同一个位置/在二叉树中,无论你先add还是后add,最后都输出的是排序(默认自然排序)后的数组——本质上和时间无关

7.Map集合

mapping映射,存储的是键值对数据,将键存储到set集合里,通过set集合来显示

8.HashMap,HashTable,ConcurrentHashMap

hashmap采用数组加链表形式进行存储,首先通过hashcode()判断key值的hash来决定其在数组中的存储位置,然后通过equals()来比较key是否为空或是否和数组中原有key值相等,如相等则覆盖,如不等则链表后添加,当存储数组达到散列因子数时,则数组*2扩容,重新进行散列,当链表数大于一个数(7/8)时则链表转换为红黑树进行存储,然后就是问红黑树的一些特点,比如根节点为黑,黑红相间,红的不能相邻,叶子节点必为黑。

CocurrentHashmap 一个线程安全的数据结构,通过分段锁机制实现,原本是通过segment继承自reentrantLock锁实现,后改成CAS+synchronized实现,1.会问乐观锁和悲观锁,典型乐观锁有CAS(compare and swap),即默认到来的所有读取查询操作都是单线程不冲突的,那么就不需要进行加锁进行预防,但是会在操作发生冲突时,进行冲突处理,典型的数据库中采用CAS机制发生冲突时,通过版本管理来进行冲突处理。
2.再问reentrantLock 可重入锁,可以允许一个线程多次重复进入统一代码块,再问是如何进行加锁(通过计数器来计算加锁次数)和最后什么时候会释放锁(当计数器为0时)

HashTable和HashMap和CocurrentHashMap: HashTable就相当于退伍老兵,上世纪的产物,它的取代者是CocurrentHashMap。所以把HashTable看作低配版CocurrentHashMap即可,(如保证线程安全,对全局加锁)。 HashMap则是线程不安全的那么要想让他实现线程安全,就要对他的get(),set()方法进行加锁。CocurrentHashMap说起来才是江湖老大的地位呀,比HashMap安全还比HashTable高效(分段锁,每次只锁数据所在段,效率更高)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值