Java进阶06List集合&泛型

下面给你整理一份 Java进阶06:List集合 & 泛型(Generics) 的系统学习笔记,适合 Java 进阶阶段复习或学习。内容包括:概念、常见实现类、常用方法、泛型使用与注意事项。


一、List集合概述

在 Java 中,List 是 有序、可重复元素的集合,属于 Collection 体系。

继承结构:

Iterable
   ↑
Collection
   ↑
List

常见实现类:

  • ArrayList
  • LinkedList
  • Vector(基本不用)

特点:

特性说明
有序按添加顺序存储
可重复可以存储重复元素
有索引可以通过下标访问

示例:

import java.util.*;

public class Demo {
    public static void main(String[] args) {
        List list = new ArrayList();

        list.add("A");
        list.add("B");
        list.add("A");

        System.out.println(list);
    }
}

输出:

[A, B, A]

二、List常用方法

List 除了 Collection 方法,还增加了 索引操作

1 添加元素

list.add("Java");
list.add(1,"Python"); // 指定位置添加

2 获取元素

String s = list.get(0);

3 修改元素

list.set(0,"C++");

4 删除元素

list.remove(0);      // 按索引删除
list.remove("Java"); // 按对象删除

5 获取长度

list.size();

6 遍历List

方法1:for循环

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

方法2:增强for

for(String s : list){
    System.out.println(s);
}

方法3:迭代器

Iterator<String> it = list.iterator();

while(it.hasNext()){
    System.out.println(it.next());
}

三、ArrayList

ArrayList 是 最常用的 List 实现类

底层结构:

动态数组

特点:

特点说明
查询快通过索引
增删慢需要移动元素
线程不安全效率高

示例:

List<String> list = new ArrayList<>();

list.add("Java");
list.add("Python");
list.add("C++");

四、LinkedList

底层结构:

双向链表

特点:

特点说明
查询慢需要遍历
增删快不需要移动元素

示例:

LinkedList<String> list = new LinkedList<>();

list.add("A");
list.add("B");
list.add("C");

LinkedList特有方法

addFirst(E e)   // 头部添加
addLast(E e)    // 尾部添加

getFirst()
getLast()

removeFirst()
removeLast()

示例:

LinkedList<String> list = new LinkedList<>();

list.addFirst("A");
list.addLast("B");

System.out.println(list);

五、ArrayList vs LinkedList

对比ArrayListLinkedList
底层结构动态数组双向链表
查询
增删
内存较少较多

面试口诀:

查询多用ArrayList
增删多用LinkedList

六、泛型(Generics)

泛型是 JDK5 引入的类型安全机制

作用:

1️⃣ 限制集合存储的数据类型
2️⃣ 避免强制类型转换
3️⃣ 提高代码安全性


1 不使用泛型

List list = new ArrayList();

list.add("Java");
list.add(100);

问题:

类型不安全

取值需要强转:

String s = (String)list.get(0);

2 使用泛型

List<String> list = new ArrayList<>();

list.add("Java");
list.add("Python");

优点:

  • 编译期检查
  • 不需要强制类型转换

3 泛型语法

集合类型<数据类型>

示例:

List<Integer> list = new ArrayList<>();

list.add(10);
list.add(20);

七、泛型类

自定义泛型类:

class Box<T> {

    private T data;

    public void set(T data){
        this.data = data;
    }

    public T get(){
        return data;
    }
}

使用:

Box<String> box = new Box<>();

box.set("Java");

System.out.println(box.get());

八、泛型方法

定义:

public <T> void show(T t){
    System.out.println(t);
}

示例:

public class Demo {

    public static <T> void print(T t){
        System.out.println(t);
    }

    public static void main(String[] args){

        print("Java");
        print(100);
    }
}

九、泛型通配符

?

表示 任意类型

List<?> list

示例:

public static void print(List<?> list){
    for(Object o : list){
        System.out.println(o);
    }
}

2 上界

<? extends 类型>

表示:

该类型 或 子类

示例:

List<? extends Number>

可以是:

Integer
Double
Float

3 下界

<? super 类型>

表示:

该类型 或 父类

示例:

List<? super Integer>

可以是:

Integer
Number
Object

十、面试高频题

1 ArrayList 和 LinkedList 区别

答:

ArrayList 底层是动态数组,查询快,增删慢
LinkedList 底层是双向链表,查询慢,增删快

2 泛型的作用

答:

1 提高代码安全性
2 避免类型强转
3 编译期检查类型

3 为什么集合要使用泛型

答:

避免 ClassCastException

十一、完整示例

import java.util.*;

public class Demo {

    public static void main(String[] args){

        List<String> list = new ArrayList<>();

        list.add("Java");
        list.add("Python");
        list.add("C++");

        for(String s : list){
            System.out.println(s);
        }
    }
}

输出:

Java
Python
C++

如果你需要,我可以继续帮你整理下一节 Java进阶07:Set集合 & HashSet & TreeSet(面试重点),那一章是 Java集合面试最核心内容之一

文章已创建 5021

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部