集合框架底层数据结构总结
1、List
- ArrayList:Object数组
- Vector:Object数组
- LinkedList:双向链表(JDK6之前为循环链表,JDK7取消了循环
2、Map
1):HashMap
JDK8之前,HashMap由数组 + 链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突存在的
JDK8之后,在解决哈希冲突时有了较大的变化,当链表长度大于阀值(默认为8)时,将链表转换为红黑树,以减少搜索时间
2):LinkedHashMap
LinkedHashMap继承自HashMap,所以它的底层仍然是基于拉链式散列结构即由数组和链表或红黑树组成。另外LinkedHashMap在上面结构的基础上,增加了一条双向链表,使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的操作,实现了访问顺序相关逻辑
3)Set
- HashSet :无序,唯一,基于 HashMap 实现的,底层采用 HashMap 来保存元素。
- LinkedHashSet :LinkedHashSet 继承自 HashSet,并且其内部是通过 LinkedHashMap 来实现的。有点类似于我们之前说的LinkedHashMap 其内部是基于 HashMap 实现一样,不过还是有一点点区别的。
- TreeSet :无序,唯一,红黑树(自平衡的排序二叉树)。
迭代器(Iterator)
Itrerator接口,提供了很多对集合元素进行迭代的方法,每一个集合类都包含了可以返回迭代器实例的迭代方法,迭代器可以在迭代的过程中删除底层集合元素,但是不可以直接调用集合的remove(object obj) 方法删除,可以通过迭代器 remove()方法删除。 如果在遍历集合数据时,使用集合的remove(object obj) 方法进行删除,会抛出异常
Iterator 和 ListIterator 的区别是什么?
Iterator可以用来遍历Set和List集合,但是ListIterator只能用来遍历List
Iterator对集合只能是向前遍历,ListIterator既可以向前也可以向后
ListIterator实现了 Iterator接口,并包含其他的功能。比如:增加元素,替换元素,获取前一个和后一个元素的索引等等。
Comparable 和 Comparator 的区别
Comparable接口,在Java.lang包下,用于当前对象和其他对象比较,所以它有一个 compareTo(Object obj) 方法用来排序,该方法只有一个参数
Comparator接口,在Java.util包下,用于传入的两个对象的比较,所以他有一个compare(Object obj1 Object obj2)方法来排序,该方法有两个参数
compareTo 方法的返回值表示的意思
- 大于 0 ,表示对象大于参数对象。
- 小于 0 ,表示对象小于参数对象
- 等于 0 ,表示两者相等。
对 Object 的 List 排序
- 对
Object[]
数组进行排序时,我们可以用Arrays#sort(...)
方法。 - 对
List<Object>
数组进行排序时,我们可以用Collections#sort(...)
方法。
Java 集合框架的选择
- 基于应用的需求来选择使用正确类型的集合,这对性能来说是非常重要的。例如,如果元素的大小是固定的,并且知道优先级,我们将会使用一个 Array ,而不是 ArrayList 。
- 一些集合类允许我们指定他们的初始容量。因此,如果我们知道存储数据的大概数值,就可以避免重散列或者大小的调整。
- 总是使用泛型来保证类型安全,可靠性和健壮性。同时,使用泛型还可以避免运行时的 ClassCastException 异常。
- 在 Map 中使用 JDK 提供的不可变类作为一个 key,这样可以避免 hashcode 的实现和我们自定义类的 equals 方法。
- 应该依照接口而不是实现来编程。
- 返回零长度的集合或者数组,而不是返回一个
null
,这样可以防止底层集合是空的。
Array 和 ArrayList 有何区别?什么时候更适合用 Array?
Array可以容纳基本数据类型和对象,而ArrayList只能容纳对象
Array是指定大小的,而ArrayList是固定大小的,可自动扩容
Array没有 addAll,removeAll等方法
如果列表大小固定,大部分情况是存储和遍历它们 -- Array
如果要使用多维数组,使用[][]会比List更方便
ArrayList 与 LinkedList 区别
ArrayList
优点:ArrayList是实现了基于动态数组的数据结构,所以地址是连续的,进而查询操作的效率会比较高
缺点:地址是连续的会导致ArrayList要移动数据的话,效率会比较低
LinkedList
优点:LinkedList是基于链表的数据结构,地址是任意的,因此 add remove的时候不用去移动数据,效率比较高,适用于要头尾操作或者插入指定位置的场景
缺点:要指定指针导致查询效率比较低
总体而言 :当需要对数据进行随机访问 -- ArrayList,当需要对数据进行多次更改--LinkedList