今天就来讲一下面试经常遇到的面试题,List,Set,Queue都继承了Collection接口,而Collection接口继承了Iterable接口,并且Map不需要继承谁,因为它自己就是老大。
先来讲一下继承Collection的集合。
集合关系图
Iterable接口
实现iterable接口的类可以拥有增强for循环 实现iterable接口的类必须提供iterable()方法,返回值为Iterable类型Collection接口
Collection是集合类的上级接口,继承与他的接口主要有Set 和List.List集合
特点:
- 值可重复
- 有序
遍历方式:
- for循环
- foreach
- 迭代
List接口中包括ArrayList和LinkedList
Set集合
Set集合中包括HashSet,TreeSet,LinkedHashSet。
特点:
- 无序
- 不能重复
遍历方式:
- 迭代
- forech
Queue集合
队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
在队列这种数据结构中,最先插入的元素将是最先被删除的元素;反之最后插入的元素将是最后被删除的元素,因此队列又称为“先进先出”(FIFO—first in first out)的线性表
简单来讲:先进先出
ArrayList和LinkedList区别
(1)如果需要遍历集合,ArrayList通过随机访问的方式比较好,LinkedList通过迭代器的方式比较好;
(2)需要经常执行插入、删除操作时,使用LinkedList比较好,因为他用链表实现,ArrayList内部会扩容动态分配大小,耗费时间;
HashSet,TreeSet,LinkedHashSet的区别
-
HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode()方法返回值相等
-
TreeSet类型是J2SE中唯一可实现自动排序的类型
-
TreeSet判断两个对象不相等的方式是两个对象通过equals方法返回false,或者通过CompareTo方法比较没有返回0
-
使用链表维护元素的次序
-
当遍历该集合时候,LinkedHashSet将会以元素的添加顺序访问集合的元素
以上是继承Collection的集合,下面我们讲一下Map集合。
Map集合
Map中包括:HashMap,TreeMap,LinkedHaspMap。
特点:
key在Map里面是唯一的但是value可以重复,一个key对应一个value
遍历方式:
- 通过keyset二次取值,比较经常使用
- 通过entrySet使用迭代器遍历key和value
- 通过Map.entrySet遍历key和value(推荐容量大时使用)
- 通过Map.values()遍历所有的value,但不能遍历key
HashMap,TreeMap,LinkedHashMap区别
相同点:
HashMap,LinkedHashMap,TreeMap都属于集合Map接口的子类。都是键值对集合。线程都不安全,效率高。
不同点:
(1)HashMap键是哈希表结构,可以保证键的唯一性,key能null,值也可为null。
(2)LinkedHashMap是HashMap的子类,内部依赖哈希表和链表列实现。由hash保证键的唯一性,由LinkedList保证有序性(存取顺序一致)。key能为null,value也能为null。
(3)TreeMap类,键是红黑树结构,可以保证键的排序(自然排序),并且不能重复。key不能为null,value可以为null
Arrays数组
arrays:是Java中的数组。
arrayList:是动态数组,可以说是arrays的复杂版本。
Array和ArrayList有何区别?什么时候更适合用Array?
Array可以容纳基本类型和对象,而ArrayList只能容纳对象。
Array是指定大小的,而ArrayList大小是固定的。
Array没有提供ArrayList那么多功能,比如addAll、removeAll和iterator等。尽管ArrayList明显是更好的选择,但也有些时候Array比较好用。
(1)如果列表的大小已经指定,大部分情况下是存储和遍历它们。
(2)对于遍历基本数据类型,尽管Collections使用自动装箱来减轻编码任务,在指定大小的基本类型的列表上工作也会变得很慢。
(3)如果你要使用多维数组,使用[][]比List<List<>>更容易。
Collection中的remove方法和Iterable中remove方法区别:- Collection的remove方法带参,Iterable反之。
- Collection中的remove()方法删除的话,是一个一个的去找,找到后,就删除,而Iterable反之。
- Collection中remove方法删除了它找到的对象或者数据的话,删除完成就会报错,是因为对象或者数据的位置发生变化,后面的对象或者数据就会往前补,比如:下标本应该是为1的,删除之前的元素,而之前下标为1的却变成了0,就会导致程序报错。
大家可以关注下面公众号: 《巧克力酱编程》
有时其他知识会在公众号更新的哦🤞