Java学习路线-35:List集合

简介: Java学习路线-35:List集合

第29 章 : List集合

125 List接口简介

允许保存重复数据


List新的方法


E get(int index);
E set(int index, E element);
ListIterator<E> listIterator();

三个常用子类


ArrayList  90%
Vector     8%
LinkedList 2%

定义


public class ArrayList<E> 
    extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable
public class Vector<E>
    extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable
public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable

126 ArrayList子类

继承结构


@Iterable
    -@Collection
        -@List
AbstractCollection(Collection)
    - AbstractList(List)
        -ArrayList(List, RandomAccess, Cloneable, java.io.Serializable)

List特征

1、保存顺序就是存储顺序

2、允许有重复数据


JDK >= 1.8 Iterable接口中有forEach方法


import java.util.ArrayList;
import java.util.List;
class Demo{
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("Hello");
        list.add("Hello");
        list.add("World");
        System.out.println(list);
        // [Hello, Hello, World]
        list.forEach((str)->{
            System.out.println(str);
        });
        /**
         * Hello
         * Hello
         * World
         */
        System.out.println(list.size());  // 3
        System.out.println(list.isEmpty());  // false
    }
}

ArrayList 实际包含一个对象数组

默认使用空数组

添加新元素时,如果长度不够,会开辟一个新的数组


版本不一样实现也不一样

JDK < 1.9 默认使用长度为10的数组

JDK >= 1.9 默认空数组


如果超过10个数据,考虑使用有参构造,避免垃圾数组的产生


127 ArrayList保存自定义类对象

如果需要remove,contains方法,要覆写equals方法


import java.util.ArrayList;
import java.util.List;
class Person {
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (obj == this) {
            return true;
        }
        if (!(obj instanceof Person)) {
            return false;
        }
        Person other = (Person) obj;
        return this.name.equals(other.name) && this.age == other.age;
    }
}
class Demo {
    public static void main(String[] args) {
        List<Person> list = new ArrayList<Person>();
        list.add(new Person("Tom", 23));
        list.add(new Person("Jack", 24));
        list.add(new Person("Steve", 25));
        System.out.println(list.contains(new Person("Tom", 23)));
        // true
    }
}

128 LinkedList子类

继承关系


@Iterable
    -@Collection
        -@List
AbstractCollection(Collection)
    -AbstractList(List)
        -AbstractSequentialList
            -LinkedList(List, Deque, Cloneable, java.io.Serializable)

代码实例

import java.util.LinkedList;
import java.util.List;
class Demo{
    public static void main(String[] args) {
        List<String> list = new LinkedList<String>();
        list.add("Hello");
        list.add("Hello");
        list.add("World");
        System.out.println(list);
        // [Hello, Hello, World]
        list.forEach(System.out::println);
        /**
         * Hello
         * Hello
         * World
         */
    }
}

LinkedList和ArrayList接口一致,实现不一样

区别:

ArrayList   数组实现 get查找复杂度为O(1) 
LinkedList  链表实现 get查找复杂度为O(n)

ArrayList默认初始化大小为10,长度会自动扩容,保存大数据会产生垃圾,这时使用LinkedList


129 Vector子类

Vector和ArrayList继承关系一致


Vector 的方法加了同步处理synchronized ,多线程安全,性能不如ArrayList


import java.util.List;

import java.util.Vector;


class Demo{
    public static void main(String[] args) {
        List<String> list = new Vector<String>();
        list.add("Hello");
        list.add("Hello");
        list.add("World");
        System.out.println(list);
        // [Hello, Hello, World]
        list.forEach(System.out::println);
        /**
         * Hello
         * Hello
         * World
         */
    }
}

总结


image.png

image.png

继承关系


@Iterable
    -@Collection
        -@List
AbstractCollection(Collection)
    - AbstractList(List)
        -ArrayList(List, RandomAccess, Cloneable, java.io.Serializable)
        -Vector(List, RandomAccess, Cloneable, java.io.Serializable)
        -AbstractSequentialList
            -LinkedList(List, Deque, Cloneable, java.io.Serializable)
相关文章
|
5月前
|
IDE Java 关系型数据库
Java 初学者学习路线(含代码示例)
本教程为Java初学者设计,涵盖基础语法、面向对象、集合、异常处理、文件操作、多线程、JDBC、Servlet及MyBatis等内容,每阶段配核心代码示例,强调动手实践,助你循序渐进掌握Java编程。
705 3
|
5月前
|
SQL Java 数据库
2025 年 Java 从零基础小白到编程高手的详细学习路线攻略
2025年Java学习路线涵盖基础语法、面向对象、数据库、JavaWeb、Spring全家桶、分布式、云原生与高并发技术,结合实战项目与源码分析,助力零基础学员系统掌握Java开发技能,从入门到精通,全面提升竞争力,顺利进阶编程高手。
1021 1
|
5月前
|
Java 大数据 API
Java Stream API:现代集合处理与函数式编程
Java Stream API:现代集合处理与函数式编程
332 100
|
5月前
|
Java API 数据处理
Java Stream API:现代集合处理新方式
Java Stream API:现代集合处理新方式
351 101
|
5月前
|
SQL 算法 Java
零基础到精通的史上最强 Java 学习路线图推荐
史上最全Java学习路线图,涵盖基础语法、面向对象、数据结构与算法、多线程、JVM、Spring框架、数据库及项目实战,助你从零基础到精通Java开发,附完整代码与工具推荐。
352 3
零基础到精通的史上最强 Java 学习路线图推荐
|
4月前
|
存储 算法 安全
Java集合框架:理解类型多样性与限制
总之,在 Java 题材中正确地应对多样化与约束条件要求开发人员深入理解面向对象原则、范式编程思想以及JVM工作机理等核心知识点。通过精心设计与周密规划能够有效地利用 Java 高级特征打造出既健壮又灵活易维护系统软件产品。
155 7
|
4月前
|
存储 Java 索引
(Python基础)新时代语言!一起学习Python吧!(二):字符编码由来;Python字符串、字符串格式化;list集合和tuple元组区别
字符编码 我们要清楚,计算机最开始的表达都是由二进制而来 我们要想通过二进制来表示我们熟知的字符看看以下的变化 例如: 1 的二进制编码为 0000 0001 我们通过A这个字符,让其在计算机内部存储(现如今,A 字符在地址通常表示为65) 现在拿A举例: 在计算机内部 A字符,它本身表示为 65这个数,在计算机底层会转为二进制码 也意味着A字符在底层表示为 1000001 通过这样的字符表示进行转换,逐步发展为拥有127个字符的编码存储到计算机中,这个编码表也被称为ASCII编码。 但随时代变迁,ASCII编码逐渐暴露短板,全球有上百种语言,光是ASCII编码并不能够满足需求
228 4
|
5月前
|
存储 Java Go
对比Java学习Go——函数、集合和OOP
Go语言的函数支持声明与调用,具备多返回值、命名返回值等特性,结合`func`关键字与类型后置语法,使函数定义简洁直观。函数可作为一等公民传递、赋值或作为参数,支持匿名函数与闭包。Go通过组合与接口实现面向对象编程,结构体定义数据,方法定义行为,接口实现多态,体现了Go语言的简洁与高效设计。
|
5月前
|
NoSQL Java 关系型数据库
超全 Java 学习路线,帮你系统掌握编程的超详细 Java 学习路线
本文为超全Java学习路线,涵盖基础语法、面向对象编程、数据结构与算法、多线程、JVM原理、主流框架(如Spring Boot)、数据库(MySQL、Redis)及项目实战等内容,助力从零基础到企业级开发高手的进阶之路。
432 1
|
5月前
|
SQL 算法 Java
适合自学的史上最强 Java 学习路线图分享
本路线图系统讲解Java从入门到进阶的学习路径,涵盖基础语法、面向对象编程、数据结构与算法、多线程、JVM原理、主流框架如Spring、数据库操作及项目实战,助你全面掌握Java开发技能,适合零基础及进阶学习。
1108 0