meta|Java集合面试题看这篇就够了( 八 )

 接口让 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?

  1. 这些包装类都是 final 修饰 , 是不可变性的 , 保证了key的不可更改性 , 不会出现放入和获取时哈希值不同的情况 。
  2. 它们内部已经重写过 hashcode()  ,equal() 等方法 。
???面试官追问:如果使用Object作为HashMap的Key , 应该怎么办呢?
  1. 重写 hashcode() 方法 ,因为需要计算hash值确定存储位置
  2. 重写 equals() 方法 ,因为需要保证key的唯一性
???面试官继续追问:能否使用任何类作为Map 的key?
可以 , 但要注意以下两点:
  1. 如果类重写了 equals() 方法 , 也应该重写 hashcode() 方法 。
  2. 最好定义key类是不可变的  , 这样key对应的 hashcode() 值可以被缓存起来 , 性能更好 , 这也是为什么string特别适合作为HashMap 的key。
28.说一下Queue 与 Deque 的区别?Queue 是 单端队列  , 只能从一端插入元素 , 另一端删除元素 , 实现上一般遵循 先进先出(FIFO) 规则 。 Queue 扩展了 Collection 的接口 , 根据 因为容量问题而导致操作失败后处理方式的不同 可以分为两类方法: 一种在操作失败后会抛出异常 , 另一种则会返回特殊值 。
\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t
Queue 接口抛出异常返回特殊值
插入队尾add(E e)offer(E e)
删除队首remove()poll()
查询队首元素element()peek()
Deque 是 双端队列  , 在队列的两端均可以插入或删除元素 。 Deque 扩展了 Queue 的接口 增加了在队首和队尾进行插入和删除的方法 , 同样根据失败后处理方式的不同分为两类:
\t\t\t\t\t\t


Deque 接口抛出异常返回特殊值