本文快速回顾了Java中容器的知识点,用作面试复习,事半功倍。
上篇:容器概览,容器中用到的设计模式,List源码
中篇:Map源码
下篇:Set源码,容器总结
http://wiki.jikexueyuan.com/project/java-collection/hashset.html
https://segmentfault.com/a/1190000014391402
如果添加的是在 HashSet 中不存在的,则返回 true;如果添加的元素已经存在,返回 false。
对于 HashSet 中保存的对象,请注意正确重写其 equals 和 hashCode 方法,以保证放入的对象的唯一性。
重要:
1. HashMap中使用键对象来计算hashcode值
2. HashSet使用成员对象来计算hashcode值,对于两个对象来说hashcode可能相同,所以equals()方法用来判断对象的相等性,如果两个对象不同的话,那么返回false
在这里插入图片描述
HashSet:
TreeSet:
LinkedHashSet:
WeakHashMap 的 Entry 继承自 WeakReference,被 WeakReference 关联的对象在下一次垃圾回收时会被回收。
WeakHashMap 主要用来实现缓存,通过使用 WeakHashMap 来引用缓存对象,由 JVM 对这部分缓存进行回收。
private static class Entry<K,V> extends WeakReference<Object> implements Map.Entry<K,V>
Tomcat 中的 ConcurrentCache 使用了 WeakHashMap 来实现缓存功能。
ConcurrentCache 采取的是分代缓存:
public final class ConcurrentCache<K, V> {
private final int size;
private final Map<K, V> eden;
private final Map<K, V> longterm;
public ConcurrentCache(int size) {
this.size = size;
this.eden = new ConcurrentHashMap<>(size);
this.longterm = new WeakHashMap<>(size);
}
public V get(K k) {
V v = this.eden.get(k);
if (v == null) {
v = this.longterm.get(k);
if (v != null)
this.eden.put(k, v);
}
return v;
}
public void put(K k, V v) {
if (this.eden.size() >= size) {
this.longterm.putAll(this.eden);
this.eden.clear();
}
this.eden.put(k, v);
}
}
Iterator替代了Enumeration,Enumeration是一个旧的迭代器了。
与Enumeration相比,Iterator更加安全,因为当一个集合正在被遍历的时候,它会阻止其它线程去修改集合。
区别有三点:
在这里插入图片描述
如果是单列的集合,我们考虑用Collection下的子接口ArrayList和Set。
如果是映射,我们就考虑使用Map
本人目前为后台开发工程师,主要关注Python爬虫,后台开发等相关技术。
Csdn
http://blog.csdn.net/qqxx6661
拥有专栏:Leetcode题解(Java/Python)、爬虫开发
知乎
https://www.zhihu.com/people/yang-zhen-dong-1/
拥有专栏:码农面试助攻手册
掘金
https://juejin.im/user/5b48015ce51d45191462ba55
简书
https://www.jianshu.com/u/b5f225ca2376
本人长期维护的个人项目,完全免费,请大家多多支持。
实现功能
网站地址
https://pricemonitor.online/