Arraylist源码分析
放到elementData里面
Comparable
VS Comparator
Comparable 接口
- 位置:
Comparable
接口位于java.lang
包。 - 方法:实现了
Comparable
接口的类需要定义一个compareTo(Object obj)
方法。这个方法用于指定对象的自然排序逻辑。 - 用途:当一个类实现了
Comparable
接口,表示这个类的对象支持自然排序。例如,字符串(String
)和包装类(如Integer
)都已经实现了Comparable
接口,所以可以直接使用Arrays.sort()
或Collections.sort()
进行排序,而无需额外指定比较器。
Comparator 接口
- 位置:
Comparator
接口位于java.util
包。 - 方法:此接口有一个
compare(Object obj1, Object obj2)
方法,用于定义两个对象之间的比较逻辑。 - 用途:如果你的对象类没有实现
Comparable
接口,或者你想提供除自然排序之外的其他排序方式,可以使用Comparator
。使用Comparator
可以在不修改原始类的情况下,为集合定义多种排序逻辑。
实际应用示例
假设我们有一个 Person
类,其中包括姓名和年龄两个字段。我们想按照年龄排序 Person
对象:
public class Person implements Comparable<Person> {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 实现 Comparable 接口的 compareTo 方法
@Override
public int compareTo(Person other) {
return Integer.compare(this.age, other.age);
}
}
这里,Person
类实现了 Comparable
接口,定义了一个自然排序逻辑,即按照年龄从小到大排序。
使用 Comparator 实现自定义排序
如果我们想要在不同的情况下使用不同的排序逻辑,例如按照名字的字典顺序排序,我们可以创建一个 Comparator
:
Collections.sort(personList, new Comparator<Person>() {
@Override
public int compare(Person p1, Person p2) {
return p1.getName().compareTo(p2.getName());
}
});
这个例子中,我们没有修改 Person
类,而是传递了一个自定义的 Comparator
到 Collections.sort()
方法,以实现按姓名排序。
总结:
- 使用
Comparable
时,你在类的定义中直接实现排序逻辑,适用于有明确的自然排序方式的情况。 - 使用
Comparator
时,你可以在调用排序方法时外部提供排序逻辑,适用于需要多种排序方式,或者不想修改类定义的情况。
Vector
vector源码分析
Vector VS. ArrayList
LinkedList
linkedlist底层结构
LinkedList源码分析
ArrayList VS LinkedList
插⼊和删除是否受元素位置的影响:
ArrayList 采⽤数组存储,所以插⼊和删除元素的时间复杂度受元素位置的影响。 ⽐如:
执⾏ add(E e) ⽅法的时候, ArrayList 会默认在将指定的元素追加到此列表的末尾,这种
情况时间复杂度就是 O(1)。但是如果要在指定位置 i 插⼊和删除元素的话( add(int index, E
element) )时间复杂度就为 O(n-i)。因为在进⾏上述操作的时候集合中第 i 和第 i 个元素之
后的(n-i)个元素都要执⾏向后位/向前移⼀位的操作。
LinkedList 采⽤链表存储,所以,如果是在头尾插⼊或者删除元素不受元素位置的影响
( add(E e) 、 addFirst(E e) 、 addLast(E e) 、 removeFirst() 、 removeLast() ),时间复杂
度为 O(1),如果是要在指定位置 i 插⼊和删除元素的话( add(int index, E
element) , remove(Object o) ), 时间复杂度为 O(n) ,因为需要先移动到指定位置再插
⼊。
是否⽀持快速随机访问: LinkedList 不⽀持⾼效的随机元素访问,⽽ ArrayList ⽀持。快速随
机访问就是通过元素的序号快速获取元素对象(对应于 get(int index) ⽅法)。
内存空间占⽤: ArrayList 的空 间浪费主要体现在在 list 列表的结尾会预留⼀定的容量空间,
⽽ LinkedList 的空间花费则体现在它的每⼀个元素都需要消耗⽐ ArrayList 更多的空间(因为要
存放直接后继和直接前驱以及数据)。
我们在项⽬中⼀般是不会使⽤到 LinkedList 的,需要⽤到 LinkedList 的场景⼏乎都可以使⽤
ArrayList来代替,并且,性能通常会更好!就连 LinkedList 的作者约书亚 · 布洛克(Josh
Bloch)⾃⼰都说从来不会使⽤ LinkedList 。