主要根据集合的特点来选用,
比如我们需要根据键值获取到元素值时就选用 Map 接口下的集合,
需要排序时选择 TreeMap, 不需要排序时就选择 HashMap,
需要保证线程安全就选用 ConcurrentHashMap。
当我们只需要存放元素值时,就选择实现 Collection 接口的集合,
需要保证元素唯一时选择实现 Set 接口的集合比如 TreeSet 或 HashSet,
不需要保证唯一就选择实现 List 接口的比如 ArrayList 或 LinkedList,
然后再根据实现这些接口的集合的特点来选用。
当我们需要保存一组类型相同的数据的时候,我们应该是用一个容器来保存,这个容器就是数组,
但是,使用数组存储对象具有一定的弊端,因为我们在实际开发中,存储的数据的类型是多种多样的,于是,就出现了“集合”,集合同样也是用来存储多个数据的。
数组的缺点是一旦声明之后,长度就不可变了:同时,声明数组时的数据类型也决定了该数组存储的数据的类型:而且,数组存储的数据是有序的、可重复的,特点单一。
但是集合提高了数据存储的灵活性,Java 集合不仅可以用来存储不同类型不同数量的对象,还可以保存具有映射关系的数据。
是否保证线程安全:
ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全;
底层数据结构:
Arraylist 底层使用的是 Object 数组:LinkedList 底层使用的是 双向链表数据结构
插入和删除是否受元素位置的影响:
是否支持快速随机访问:
LinkedList 不支持高效的随机元素访问,而ArrayList 支持。
快速随机访问就是通过元素的序号快速获取元素对象(对应于 get(int index)方法)。
内存空间占用:
ArrayList 的空间浪费主要体现在在 list 列表的结尾会预留一定的容量空间,
而 LinkedList 的空间花费则体现在它的每一个元素都需要消耗比 ArrayList 更多的空间(因为要存放直接后继和直接前驱以及数据)。
comparable 接口实际上是出自 java.lang 包它有一个compareTo(Object obj)方法用来排序
comparator 接口实际上是出自 java.util 包它有一个compare(Object obj1,Object obj2)方法用来排序
一般我们需要对一个集合使用自定义排序时,我们就要重写 compareTo(方法或 compare()方法,当我们需要对某一个集合实现两种排序方式,
比如一个 song 对象中的歌名和歌手名分别采用一种排序方法的话,我们可以重写 compareTo(方法和使用自制的 Comparator 方法或者以两个 Comparator 来实现歌名排序和歌星名排序,第二种代表我们只能使用两个参数版的Collections.sort().
什么是无序性?
无序性不等于随机性 ,无序性是指存储的数据在底层数组中并非按照数组索引的顺序添加 ,而是根据数据的哈希值决定的。
什么是不可重复性?
不可重复性是指添加的元素按照 equals()判断时 ,返回 false,需要 同时重写 equals()方法和 HashCode()方法。
公众号:浩说编程
面试题 | 安装包 | 大厂技术资料
欢迎扫码交流