假期学习17
第17天:Java集合(中)—— Set与Queue
对应章节:第8章
(1)今天做了什么: HashSet底层就是HashMap(元素当key,固定Object当value),判断重复走hashCode→equals。致命规则:重写equals必须同时重写hashCode,否则HashSet出现"相同元素能重复加入"的bug。TreeSet底层红黑树,元素自动排序:自然排序让元素类实现Comparable的compareTo(),定制排序传Comparator匿名内部类。TreeSet判断重复不看equals而看compareTo/compare返回值是否为0。LinkedHashSet维护双向链表记录插入顺序。Queue接口FIFO,Deque双端队列两端进出,PriorityQueue按优先级(自然顺序或比较器)出队。练习:学生对象按成绩降序、相同成绩按年龄升序排序;PriorityQueue模拟任务调度器。
(2)明天准备做什么: 学完第8章Map体系——HashMap(JDK 1.8红黑树优化)、LinkedHashMap、TreeMap、Hashtable的区别,put返回值规则,三种遍历方式。Collections工具类。练习词频统计和LRU缓存实现。
(3)遇到的问题: 只重写equals没重写hashCode时,两个内容相同的对象hashCode不同,HashSet把它们放进不同桶导致重复存储。TreeSet在compareTo返回0时视为相等元素不会重复加入——即使equals返回false。PriorityQueue默认是最小堆(小的先出队),要改为最大堆需要传Comparator.reverseOrder()。LinkedHashSet按插入顺序遍历而不是自然排序,容易和TreeSet搞混。
浙公网安备 33010602011771号