Java(14)集合,List

本文详细介绍了Java集合框架中的List接口,包括接口概述、数据结构比较、ArrayList的存储和读取、泛型在集合中的应用、实例化List的不同方式、可变与不可变集合的概念,以及如何使用for循环和迭代器遍历List。还提到了LinkedList的特点和使用。
摘要由CSDN通过智能技术生成

01 接口概括

java所有的集合类都位于java.util包下,提供了一个表示和操作对象集合的统一构架,包含大量集合接口,以及这些接口的实现类和操作它们的算法。

集合类和数组不一样,数组元素既可以是基本类型的值,也可以是对象(实际上保存的是对象的引用变量),而集合里只能保存对象(实际上只是保存对象的引用变量,但通常习惯上认为集合里保存的是对象)。

Java集合类型分为单列集合Collection和双列结合Map,Collection和Map是集合的根接口,这两个接口又包含了一些子接口和实现类

在这里插入图片描述

02 数据结构简介

01 数组Array

可以在内存中连续存储多个元素的结构,在内存中的分配也是连续,数组中的元素通过下标进行访问,数组下标从零开始

优点:

  1. 按照索引查询元素速度快
  2. 按照索引遍历数组方便

缺点:

  1. 数组的长度固定后无法扩容
  2. 数组只能存储单一数据类型

02 栈Stack

栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。

特点:先进后出或者说后进先出

03 队列Queue

队列与栈样也是一中线性表,不同是,队列可以在一端添加元素在另一端取出元素;

也就是先进先出。

队列从过一端放入元素称为入队,另一端取出元素称为出队

04 链表LinkedList

链表是物理存储非连续、非顺序存储结构,数据元素的逻辑顺序,是通过指针地址实现的。

每个元素有两个结点,一个存储元素的数据域(内存空间),另一个指向下一个结点地址的指针域。
在这里插入图片描述
从上图可以可出链表形成不同结构如单向链表和双向链表。
05 图Graph
06 散列表Hash
07 树Tree
08 堆Heap

List
特点:有序可重复

  • 有序指的是下标
  • 可重复指的是的可以存储相同元素,将相同元素存储在不同下标位置上实现

03 ArrayList存储读取数据

package;

public class Person {
}
public class ArrayListTest {
    @Test
    public void test() {
        List<String> list = new ArrayList<>(List.of("0", "1", "2", "3", "4"));
        System.out.println(list);
        // 末尾追加
        list.add("5");
        System.out.println(list);
        // 向指定index位置添加
        list.add(3, "33");
        System.out.println(list);
        // 将指定idnex位置上的元素从集合中删除
        list.remove(6);
        System.out.println(list);
        // 在集合中删除指定元素
        list.remove("33");
        System.out.println(list);
        list.add("哇");
        list.add("哇");
        System.out.println(list);
        list.remove("哇");
        System.out.println(list);
        // 更新指定index位置上元素的值
        list.set(3, "三");
        System.out.println(list);
        // 查询指定ndex位置上元素的值
        System.out.println(list.get(3));
    }
    /*
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 5]
[0, 1, 2, 33, 3, 4, 5]
[0, 1, 2, 33, 3, 4]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 哇, 哇]
[0, 1, 2, 3, 4, 哇]
[0, 1, 2, 三, 4, 哇]
三
    */
}

04 集合中的泛型

public class linkedListTest {
   @Test
    public void test() {
        // List<String> list = new ArrayList<String>();
        // List<String> list = new ArrayList<>();
        // List<String> list = new ArrayList();
        List<String> list = new ArrayList<>();
        list.add("lll");
        list.add(String.valueOf(1));
    }

}

05 实例化List并赋值的两中方法

public class linkedListTest {
    @Test
    public void test() {
        List<Integer> list01 = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            list01.add(i);
        }
        System.out.println(list01);
        list01.add(6);
        System.out.println(list01);
        
        List<Integer> list02 = new ArrayList<>() {{
            for (int i = 0; i < 5; i++) {
                add(i);
            }
        }};
        System.out.println(list02);
        list02.add(6);
        System.out.println(list02);
    }
    /*
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 6]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 6]
     */
}

06 List可变集合与不可变集合

public class linkedListTest {
    @Test
    public void test01() {
        // 不可变集合
        List<Integer> list = List.of(0, 1, 2, 3, 4);
        System.out.println(list);
        list.add(6);
        list.set(2, 20);
        // System.out.println(list);
    }
//[0, 1, 2, 3, 4]
    @Test
    public void test02() {
        // 不可变集合转为可变集合
        List<Integer> list = new ArrayList<>(List.of(0, 1, 2, 3, 4));
        System.out.println(list);
        list.add(6);
        System.out.println(list);
        list.set(2, 20);
        System.out.println(list);
    }
/*
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 6]
[0, 1, 20, 3, 4, 6]
 */

}

07 使用for循环和foreach遍历集合List

public class linkedListTest {
    @Test
    public void test() {
        List<Integer> list = new ArrayList<>(List.of(0, 1, 2, 3, 4));
        for (int i = 0; i < 5; i++) {
            System.out.println(list.get(i));
        }
        System.out.println("元素的数量 >>> " + list.size());
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
        System.out.println("++++++++++++++++++++++++++++");
        // for(集合中元素的数据类型 集合中每一个元的是变量 : 被遍历的结合)
        for (int num : list) {
            System.out.println(num);
        }
    }
    /*
0
1
2
3
4
元素的数量 >>> 5
0
1
2
3
4
++++++++++++++++++++++++++++
0
1
2
3
4
     */

}

08 使用迭代器遍历集合List

public class linkedListTest {
    @Test
    public void test() {
        List<Integer> list = new ArrayList<>(List.of(0, 1, 2, 3, 4));
        Iterator<Integer> it = list.listIterator();
        while (it.hasNext()){
            Integer next = it.next();
            System.out.println(next);
        }
        System.out.println("第一次遍历完成");
        while (it.hasNext()){
            Integer next = it.next();
            System.out.println(next);
        }
        System.out.println("第二次遍历完成");
    }
    /*
0
1
2
3
4
第一次遍历完成
第二次遍历完成
     */
}

09 LinkedList

package;

public class Person {
}
package Test;

import Person;
import org.junit.jupiter.api.Test;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

/**
 * 数组:只能存储单一数据类型
 * 优点:线性存储 查询速度快
 * 缺点:数组一旦声明长度不可修改
 * List:有序可重复
 * 泛型:限定数据类型
 * <>钻石操作符
 */
public class linkedListTest {

    @Test
    public void test01() {
        List list = new LinkedList();
        byte a = 1;
        short b = 2;
        int c = 3;
        long d = 4L;
        double e = 5.0d;
        float f = 6.0f;
        char g = 'a';
        boolean h = false;
        String i = "lll";
        Person person = new Person();
        list.add(a);
        list.add(b);
        list.add(c);
        list.add(d);
        list.add(e);
        list.add(f);
        list.add(g);
        list.add(h);
        list.add(i);
        list.add(person);
        System.out.println(list.size());
    }
//10
    @Test
    public void test02() {
        List list = new LinkedList();
        list.add("xm");
        list.add("x");
        list.add("xm");
        System.out.println(list.get(0));
        System.out.println(list.get(1));
        System.out.println(list.get(2));
    }
/*
xm
x
xm
 */
    @Test
    public void test03() {
        // List<String> list = new LinkedList<String>();
        // List<String> list = new LinkedList<>();
        // List<String> list = new LinkedList();
        List<String> list = new LinkedList<>();
        list.add("lll");
        list.add(String.valueOf(1));
    }

    @Test
    public void test04() {
        List<Integer> list01 = new LinkedList<>();
        for (int i = 0; i < 5; i++) {
            list01.add(i);
        }
        System.out.println(list01);
        list01.add(6);
        System.out.println(list01);
        List<Integer> list02 = new LinkedList<>() {{
            for (int i = 0; i < 5; i++) {
                add(i);
            }
        }};
        System.out.println(list02);
        list02.add(6);
        System.out.println(list02);
    }
/*
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 6]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 6]
 */
    @Test
    public void test05() {
        // 不可变集合
        List<Integer> list = List.of(0, 1, 2, 3, 4);
        System.out.println(list);
        // list.add(6);
        // list.set(2, 20);
        // System.out.println(list);
    }
//[0, 1, 2, 3, 4]
    @Test
    public void test06() {
        // 不可变集合转为可变集合
        List<Integer> list = new LinkedList<>(List.of(0, 1, 2, 3, 4));
        System.out.println(list);
        list.add(6);
        System.out.println(list);
        list.set(2, 20);
        System.out.println(list);
    }
/*
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 6]
[0, 1, 20, 3, 4, 6]
 */
    @Test
    public void test07() {
        List<String> list = new LinkedList<>(List.of("0", "1", "2", "3", "4"));
        System.out.println(list);
        // 末尾追加
        list.add("5");
        System.out.println(list);
        // 向指定index位置添加
        list.add(3, "33");
        System.out.println(list);
        // 将指定idnex位置上的元素从集合中删除
        list.remove(6);
        System.out.println(list);
        // 在集合中删除指定元素
        list.remove("33");
        System.out.println(list);
        list.add("李");
        list.add("李");
        System.out.println(list);
        list.remove("李");
        System.out.println(list);
        // 更新指定index位置上元素的值
        list.set(3, "三");
        System.out.println(list);
        // 查询指定ndex位置上元素的值
        System.out.println(list.get(3));
    }
/*
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 5]
[0, 1, 2, 33, 3, 4, 5]
[0, 1, 2, 33, 3, 4]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 李, 李]
[0, 1, 2, 3, 4, 李]
[0, 1, 2, 三, 4, 李]
三
 */
    @Test
    public void test08() {
        List<Integer> list = new LinkedList<>(List.of(0, 1, 2, 3, 4));
        for (int i = 0; i < 5; i++) {
            System.out.println(list.get(i));
        }
        System.out.println("元素的数量 >>> " + list.size());
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
        System.out.println("++++++++++++++++++++++++++++");
        // for(集合中元素的数据类型 集合中每一个元的是变量 : 被遍历的结合)
        for (int num : list) {
            System.out.println(num);
        }
    }
/*
0
1
2
3
4
元素的数量 >>> 5
0
1
2
3
4
++++++++++++++++++++++++++++
0
1
2
3
4
 */
    @Test
    public void test09() {
        List<Integer> list = new LinkedList<>(List.of(0, 1, 2, 3, 4));
        Iterator<Integer> it = list.listIterator();
        while (it.hasNext()) {
            Integer next = it.next();
            System.out.println(next);
        }
        System.out.println("第一次遍历完成");
        while (it.hasNext()) {
            Integer next = it.next();
            System.out.println(next);
        }
        System.out.println("第二次遍历完成");
    }
/*
0
1
2
3
4
第一次遍历完成
第二次遍历完成
 */
    @Test
    public void test10() {
        List<Integer> list = new LinkedList<>(List.of(0, 1, 2, 3, 4));
        list.stream().forEach(System.out::println);
    }
    /*
0
1
2
3
4
     */
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值