List接口(第三章)

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 类,而是传递了一个自定义的 ComparatorCollections.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 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值