Java 集合(List与LinkedList)接口详解

本文详细介绍了 Java 中 List 接口的概念及其两种主要实现:ArrayList 和 LinkedList 的特性与应用场景。对比了这两种实现方式在查询、插入等操作上的效率差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

List接口

List接口的定义
List interface List extends Collection
通过观察List接口的定义发现其继承得是Collection接口
List、Set、Queue接口继承的都是Collection接口
Collection接口常用方法

1. public boolean add(E e);  //添加元素到集合
2. public boolean addAll(Collection<? extends E> c); //存放一个集合
3. public boolean contains(Object o);  //查找集合中的元素
4. public boolean isEmpty();  //判断一个集合是否为空
5. public boolean remove(Object 0);//删除一个集合中的元素
6. public int size();//返回集合的长度

List接口中的方法
List接口拓展了Collection接口中的方法

1. public E get(int index); //根据索引取得元素
2. public E set(int index,E element);//替换元素,index为要替换元素下标 element为要替换元素
3. public ListIterator<E> listIterator() List //List自己的迭代器

List 接口的特点是:可重读的,有序的

使用List list本身是一个接口,如果想要使用一个接口则可以使用该接口的实现类完成
重点实现类:ArrayList LinkedList Vector

package java8_7.Collection.List;

import java.util.ArrayList;
import java.util.List;

public class ArrayListDemo {
    public static void main(String[] args) {
        List<Integer> list =new ArrayList<>();
        list.add(4);
        list.add(5);
        list.add(6);
        list.add(4);

        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }
}

运行结果为

4
5
6
4

可见,ArrayList 的特点是可重复的,有序的,顺序就是储存添加时候的数据
通过一个add 添加到集合,通过get(index)取出集合中的元素 下标的位置从0开始

其他的一些方法

 package java8_7.Collection.List;

import java.util.ArrayList;
import java.util.List;

public class ListDemo2_function {
    public static void main(String[] args) {
        List<Integer> array = new ArrayList<>();
        System.out.println("array是否为空:"+array.isEmpty());
        array.add(4);
        array.add(5);
        array.add(5);
        System.out.println(array.remove(1));
        array.add(1);
        System.out.println(array.isEmpty());
        System.out.println(array);
    }
}

执行结果为

array链表是否为空:true
5
false
[4, 5, 1]

可见ArrayList是一个对象数组,每次增加的时候,会给数组扩容,数组长度是不能改变的,每次扩容数组内容拷贝工作,但是一个ArrayList如果频繁添加内容,效率不高。但是查询的时候由于底层是数组,所以查询效率很高。
并期添加数组都是从链表后方加,不会添加到链表中间位子

public class Person {
    private String name;
    private int age;
    public Person(String name ,int age){
        this.name=name;
        this.age=age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "name:"+name+"age"+age;
    }

    @Override
    public boolean equals(Object obj) {    // 传进来要比较的内容
        // TODO Auto-generated method stub

        Person per=null;   
        if(obj instanceof Person) {

            per=(Person)obj;  // Object 向下转型 为 Person类型
        }
        // this 当前的对象 Person  和 传进来的Person比较
        if(this==per) {  //内存地址 一样肯定是同样对象 

            return true;
        }

        if(this.age==per.age&&this.name.equals(per.name)) {

            return true;
        }

        return false;
    }
}

重写Object中的equals方法 判断两个对象是否相同的语句为per=(Person)obj
若相同再比较this==per this里面有两个属性,即name age
写一个测试类

import java.util.ArrayList;
import java.util.List;

public class TestPerson {
    public static void main(String[] args) {
        List<Person> list = new ArrayList<>();
        list.add(new Person("和尚",20));
        list.add(new Person("jacky",30));
        list.add(new Person("Sanny",40));
        System.out.println(list.remove(new Person("Sanny",40)));
        System.out.println(list.contains(new Person("和尚",20)));
        for (Person per:list
             ) {
            System.*out*.println(per);
        }

    }
}

结果:

true
true
name:和尚,age20
name:jacky,age30

通过代码,发现自定义类的时候,必须覆写equals()方法才能完成集合中对对象查找和删除,主要是在于进行对象删除的时候,集合中会判断传入的元素和集合本身是否是内容相同的元素,只有相同才会删除或者查找


LinkedList接口

这个子类是基于链表的体现 指针节点的形式 指针-节点->>
LinkedList也是可重复的有序的,顺序是储存顺序
以下为LinkedList类的定义
public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>,Cloneable,Serializable
接口定义:标准、能力、对外暴露方法
Cloneable 进行对象克隆的时候,必须实现接口,才有克隆的能力
Serializable:要实现序列化的类,必须实现接口才能能有序列化的的能力

特点: 插入方便,任意节点之间都可以插入,但是查询并不方便,效率不高
LinkedList的常用方法
1. public void addFirst(E e);
2. public void addList(E e);

import java.util.LinkedList;

public class LinkedListDemo1 {
    public static void main(String[] args) {
        LinkedList<String> list =new LinkedList<>() ;
        list.add("hello");
        list.add("world");
        list.add("java");
        list.addFirst("first");
        list.addLast("last");
        for (String str:list){
            System.*out*.println(str);
        }
    }

}

经过对比,ArrayList和LinkedList有什么区别?
1. ArrayList 是基于数组开发的,查询效率很高,但是修改数据效率会低一些
2. LinkedList 是基于链表开发的,两端插入的时候效率很高,但是查询效率会低一些

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值