接口让 TreeMap
有了对集合中的元素根据键排序的能力 。 默认是按 key 的升序排序 , 不过我们也可以指定排序的比较器 。
示例代码如下:
/**
* @author xppll
* @date 2022/1/1 21:35
*/
public class Person {
private Integer age;
public Person(Integer age) {
this.age = age;
public Integer getAge() {
return age;
public static void main(String[
args) {
TreeMap<Person String> treeMap = new TreeMap<>((o1 o2) -> {
return Integer.compare(o1.getAge() - o2.getAge() 0);
);
treeMap.put(new Person(2) \"person1\");
treeMap.put(new Person(42) \"person2\");
treeMap.put(new Person(22) \"person3\");
treeMap.put(new Person(10) \"person4\");
treeMap.forEach((key value) -> System.out.println(value));
//输出:
person1
person4
person3
person2
可以看出 ,TreeMap
中的元素已经是按照 Person
的 age 字段的升序来排列了 。
综上 , 相比于 HashMap
来说 TreeMap
主要多了对集合中的元素根据键排序的能力以及对集合内元素的搜索的能力
27.为什么HashMap中String、Integer这样的包装类适合作为Key?
- 这些包装类都是
final
修饰 , 是不可变性的 , 保证了key的不可更改性 , 不会出现放入和获取时哈希值不同的情况 。
- 它们内部已经重写过
hashcode()
,equal()
等方法 。
- 重写
hashcode()
方法 ,因为需要计算hash值确定存储位置
- 重写
equals()
方法 ,因为需要保证key的唯一性
可以 , 但要注意以下两点:
- 如果类重写了
equals()
方法 , 也应该重写hashcode()
方法 。
- 最好定义key类是不可变的 , 这样key对应的
hashcode()
值可以被缓存起来 , 性能更好 , 这也是为什么string特别适合作为HashMap 的key。
Queue
是 单端队列 , 只能从一端插入元素 , 另一端删除元素 , 实现上一般遵循 先进先出(FIFO) 规则 。 Queue 扩展了 Collection
的接口 , 根据 因为容量问题而导致操作失败后处理方式的不同 可以分为两类方法: 一种在操作失败后会抛出异常 , 另一种则会返回特殊值 。Queue 接口 | \t\t\t抛出异常 | \t\t\t返回特殊值 |
---|---|---|
插入队尾 | \t\t\tadd(E e) | \t\t\toffer(E e) |
删除队首 | \t\t\tremove() | \t\t\tpoll() |
查询队首元素 | \t\t\telement() | \t\t\tpeek() |
Deque
是 双端队列 , 在队列的两端均可以插入或删除元素 。 Deque 扩展了 Queue
的接口 增加了在队首和队尾进行插入和删除的方法 , 同样根据失败后处理方式的不同分为两类: