java 容器 快速删除_Java容器(List、Set、Map)知识点快速复习手册(下)

前言

本文快速回顾了Java中容器的知识点,用作面试复习,事半功倍。

上篇:容器概览,容器中用到的设计模式,List源码

中篇:Map源码

下篇:Set源码,容器总结

其它知识点复习手册

Java基础知识点面试手册(上)

Java基础知识点面试手册(下)

Java容器(List、Set、Map)知识点快速复习手册(上)

Java容器(List、Set、Map)知识点快速复习手册(中)

HashSet

关键词:

默认容量16,扩容两倍,加载因子0.75

允许元素为null

实现Set接口

不保证迭代顺序

非同步

初始容量非常影响迭代性能

底层实际上是一个HashMap实例

public HashSet() {map = new HashMap<>();}

如果添加的是在 HashSet 中不存在的,则返回 true;如果添加的元素已经存在,返回 false。

对于 HashSet 中保存的对象,请注意正确重写其 equals 和 hashCode 方法,以保证放入的对象的唯一性。

HashSet 和 HashMap 的区别

重要:

HashMap中使用键对象来计算hashcode值

HashSet使用成员对象来计算hashcode值,对于两个对象来说hashcode可能相同,所以equals()方法用来判断对象的相等性,如果两个对象不同的话,那么返回false

b9c117884c274f9539052ce32548cdc3.png

在这里插入图片描述

TreeSet

关键词

实现NavigableSet接口

可以实现排序功能

底层实际上是一个TreeMap实例

非同步

不允许为null

LinkedHashSet

关键词

迭代是有序的

允许为null

底层实际上是一个HashMap+双向链表实例(其实就是LinkedHashMap)

非同步

性能比HashSet差一丢丢,因为要维护一个双向链表

初始容量与迭代无关(与LinkedHashMap相同),因为LinkedHashSet迭代的是双向链表

总结Set

HashSet:

无序,允许为null,底层是HashMap(散列表+红黑树),非线程同步

TreeSet:

有序,不允许为null,底层是TreeMap(红黑树),非线程同步

LinkedHashSet:

迭代有序,允许为null,底层是HashMap+双向链表,非线程同步

WeekHashMap

存储结构

WeakHashMap 的 Entry 继承自 WeakReference,被 WeakReference 关联的对象在下一次垃圾回收时会被回收。

WeakHashMap 主要用来实现缓存,通过使用 WeakHashMap 来引用缓存对象,由 JVM 对这部分缓存进行回收。

1private static class Entry extends WeakReference implements Map.Entry

2

ConcurrentCache

Tomcat 中的 ConcurrentCache 使用了 WeakHashMap 来实现缓存功能。

ConcurrentCache 采取的是分代缓存:

经常使用的对象放入 eden 中,eden 使用 ConcurrentHashMap 实现,不用担心会被回收(伊甸园);

不常用的对象放入 longterm,longterm 使用 WeakHashMap 实现,这些老对象会被垃圾收集器回收。

当调用 get() 方法时,会先从 eden 区获取,如果没有找到的话再到 longterm 获取,当从 longterm 获取到就把对象放入 eden 中,从而保证经常被访问的节点不容易被回收。

当调用 put() 方法时,如果 eden 的大小超过了 size,那么就将 eden 中的所有对象都放入 longterm 中,利用虚拟机回收掉一部分不经常使用的对象。

1public final class ConcurrentCache {

2

3 private final int size;

4

5 private final Map eden;

6

7 private final Map longterm;

8

9 public ConcurrentCache(int size) {

10 this.size = size;

11 this.eden = new ConcurrentHashMap<>(size);

12 this.longterm = new WeakHashMap<>(size);

13 }

14

15 public V get(K k) {

16 V v = this.eden.get(k);

17 if (v == null) {

18 v = this.longterm.get(k);

19 if (v != null)

20 this.eden.put(k, v);

21 }

22 return v;

23 }

24

25 public void put(K k, V v) {

26 if (this.eden.size() >= size) {

27 this.longterm.putAll(this.eden);

28 this.eden.clear();

29 }

30 this.eden.put(k, v);

31 }

32}

常见问题总结

Enumeration和Iterator接口的区别

Iterator替代了Enumeration,Enumeration是一个旧的迭代器了。

与Enumeration相比,Iterator更加安全,因为当一个集合正在被遍历的时候,它会阻止其它线程去修改集合。

区别有三点:

Iterator的方法名比Enumeration更科学

Iterator有fail-fast机制,比Enumeration更安全

Iterator能够删除元素,Enumeration并不能删除元素

ListIterator有什么特点

ListIterator继承了Iterator接口,它用于遍历List集合的元素。

ListIterator可以实现双向遍历,添加元素,设置元素

969dca77f4ec41864221cdba3b96eee5.png

在这里插入图片描述

与Java集合框架相关的有哪些最好的实践

如果是单列的集合,我们考虑用Collection下的子接口ArrayList和Set。

如果是映射,我们就考虑使用Map

是否需要同步:去找线程安全的集合类使用

迭代时是否需要有序(插入顺序有序):去找Linked双向列表结构的

是否需要排序(自然顺序或者手动排序):去找Tree红黑树类型的(JDK1.8)

估算存放集合的数据量有多大,无论是List还是Map,它们实现动态增长,都是有性能消耗的。在初始集合的时候给出一个合理的容量会减少动态增长时的消耗

使用泛型,避免在运行时出现ClassCastException

尽可能使用Collections工具类,或者获取只读、同步或空的集合,而非编写自己的实现。它将会提供代码重用性,它有着更好的稳定性和可维护性

参考

公众号:Java3y

Eckel B. Java 编程思想 [M]. 机械工业出版社, 2002.

Java Collection Framework

Iterator 模式

Java 8 系列之重新认识 HashMap

What is difference between HashMap and Hashtable in Java?

Java 集合之 HashMap

The principle of ConcurrentHashMap analysis

探索 ConcurrentHashMap 高并发性的实现机制

HashMap 相关面试题及其解答

Java 集合细节(二):asList 的缺陷

Java Collection Framework – The LinkedList Class

关注我

本人目前为后台开发工程师,主要关注Python爬虫,后台开发等相关技术。

原创博客主要内容

笔试面试复习知识点手册

Leetcode算法题解析(前150题)

剑指offer算法题解析

Python爬虫相关实战

后台开发相关实战

同步更新以下博客

Csdn

拥有专栏:Leetcode题解(Java/Python)、爬虫开发

知乎

拥有专栏:码农面试助攻手册

掘金

简书

个人公众号:Rude3Knife

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值