Java集合精选常见面试题( 六 )

打印结果
原始数组:[-1 ,  3,3,-5,7,4,-9 ,  -7]Collections.reverse(arrayList):[-7, -9 ,  4, 7,-5,3, 3,-1]Collections.sort(arrayList):[-9 ,  -7, -5,-1,3,3,4,7]定制排序后:[7, 4,3,3,-1 ,  -5, -7,-9]重写 compareTo 方法实现按年龄来排序// person对象没有实现Comparable接口,所以必须实现 , 这样才不会出错 , 才可以使treemap中的数据按顺序排列// 前面一个例子的String类已经默认实现了Comparable接口,详细可以查看String类的API文档,另外其他// 像Integer类等都已经实现了Comparable接口,所以不需要另外实现了public class Person implements Comparable<Person> {private String name;private int age;public Person(String name,int age) {super();this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}/*** T重写compareTo方法实现按年龄来排序*/@Overridepublic int compareTo(Person o) {if (this.age > o.getAge()) {return 1;}if (this.age < o.getAge()) {return -1;}return 0;}}public static void main(String[] args) {TreeMap<Person ,  String> pdata = https://www.huyubaike.com/biancheng/new TreeMap();pdata.put(new Person("张三", 30),"zhangsan");pdata.put(new Person("李四",20),"lisi");pdata.put(new Person("王五",10),"wangwu");pdata.put(new Person("小红" ,  5), "xiaohong");// 得到key的值的同时得到key所对应的值Set<Person> keys = pdata.keySet();for (Person key : keys) {System.out.println(key.getAge() + "-" + key.getName());}}Output:
5-小红10-王五20-李四30-张三2. 无序性和不可重复性的含义是什么什么是无序性?无序性不等于随机性,无序性是指存储的数据在底层数组中并非按照数组索引的顺序添加,而是根据数据的哈希值决定的 。
什么是不可重复性?不可重复性是指添加的元素按照 equals()判断时 ,返回 false , 需要同时重写 equals()方法和 HashCode()方法 。
3. 比较 HashSet、LinkedHashSet 和 TreeSet 三者的异同

  • HashSetLinkedHashSetTreeSet 都是 Set 接口的实现类,都能保证元素唯一,并且都不是线程安全的 。
  • HashSetLinkedHashSetTreeSet 的主要区别在于底层数据结构不同 。
    • HashSet 的底层数据结构是哈希表(基于 HashMap 实现) 。
    • LinkedHashSet 的底层数据结构是链表和哈希表,元素的插入和取出顺序满足 FIFO(先进先出) 。
    • TreeSet 底层数据结构是红黑树 , 元素是有序的,排序的方式有自然排序和定制排序 。
  • 底层数据结构不同又导致这三者的应用场景不同 。HashSet 用于不需要保证元素插入和取出顺序的场景,LinkedHashSet 用于保证元素的插入和取出顺序满足 FIFO 的场景,TreeSet 用于支持对元素自定义排序规则的场景
4. Collection 子接口之 QueueQueue 与 Deque 的区别Queue 是单端队列,只能从一端插入元素 , 另一端删除元素,实现上一般遵循 先进先出(FIFO) 规则 。
Queue 扩展了 Collection 的接口 , 根据 因为容量问题而导致操作失败后处理方式的不同 可以分为两类方法: 一种在操作失败后会抛出异常,另一种则会返回特殊值 。
Queue 接口抛出异常返回特殊值插入队尾add(E e)offer(E e)删除队首remove()poll()查询队首元素element()peek()【Java集合精选常见面试题】Deque 是双端队列,在队列的两端均可以插入或删除元素 。
Deque 扩展了 Queue 的接口 ,  增加了在队首和队尾进行插入和删除的方法,同样根据失败后处理方式的不同分为两类:
Deque 接口抛出异常返回特殊值插入队首addFirst(E e)offerFirst(E e)插入队尾addLast(E e)offerLast(E e)删除队首removeFirst()pollFirst()删除队尾removeLast()pollLast()查询队首元素getFirst()peekFirst()查询队尾元素getLast()peekLast()事实上,Deque 还提供有 push()pop() 等其他方法 , 可用于模拟栈 。
ArrayDeque 与 LinkedList 的区别ArrayDequeLinkedList 都实现了 Deque 接口,两者都具有队列的功能,但两者有什么区别呢?