三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

假期学习18

假期学习18

第18天:Java集合(下)—— Map体系
对应章节:第8章(后半部分)
(1)今天做了什么: Map存key-value键值对,key不可重复。HashMap——O(1)查询插入(散列均匀时),允许null键值,线程不安全。JDK 1.8重大优化:单个桶链表长度≥8且数组长度≥64时,链表→红黑树,查询O(n)→O(log n),防哈希碰撞攻击。LinkedHashMap维护双向链表记录插入/访问顺序。TreeMap基于红黑树按key排序。Hashtable为线程安全的古老版本(全方法synchronized),不允许null,已被ConcurrentHashMap取代。put()返回被覆盖的旧值。三种遍历:entrySet()效率最高(一次取键值对)。Collections工具类:sort、shuffle、synchronizedXxx、unmodifiableXxx。练习:词频统计(Map经典场景);继承LinkedHashMap重写removeEldestEntry()实现LRU缓存。
(2)明天准备做什么: 进入第9章泛型——泛型类、泛型接口、泛型方法的定义;类型通配符?、? extends T、? super T以及PECS原则;类型擦除的底层原理。设计泛型DAO基类练习。
(3)遇到的问题: HashMap的key如果是可变对象且hashCode依赖可变字段,修改字段后hashCode变化导致找不到原来的entry——应该用不可变对象做key。源码中HashMap容量始终是2的n次方,hash & (capacity-1)替代取模运算更快。LinkedHashMap的accessOrder参数设为true时,按访问顺序排序而非插入顺序,是实现LRU的基础。

← 返回列表