IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> java进阶—List -> 正文阅读

[数据结构与算法]java进阶—List

上节回顾
List 是一个有序的,允许重复的Collection,其下的子类主要有 ArrayList LinkedList,Vector(这个官方不推荐使用)

那么同为list的子类,ArrayList 跟 LinkedList 有什么区别呢?

这里就涉及到了list的底层两种实现方式:

- 一种是数组 (ArayList)

在这里插入图片描述
数组的角标从0 开始 这个我们之前已经知道了,数组的好处查询快,有角标直接定位就好了,但是增删的效率比较慢

当进行删除一个元素操作时,其他元素需要向前或者向后移动

当进行增加一个元素操作时,需要考虑是否需要扩容(集合满了,要创建一个新的更大的数组,把旧数据复制进去)

所以增删比较慢

  • 一种是链表 (LinkedList)
    链表每个元素就不像数组了,它没有自己的角标

链表里面又有单向链表 跟 双向链表

先来看看单向链表

在这里插入图片描述
指针指向元素,每个元素分为两个域,一个是存储元素的 数据域,另一个是指向下一个元素的指针域

再来看看双向链表

在这里插入图片描述
双向链表就分为三个区域了,元素不用说,pre 是指向前一个元素,next: 是指向下一个元素

由于链表没有角标,所以查询起来需要一个一个从头往下查,然而增删相对于数组结构就快的多,删除他只需要继续指向下一个就行了,增加也是,前一个指针指向增加的元素

总结一下:
ArrayList:数组结构,查询快,增删慢

LinkedList:链表结构,查询慢,增删快

那么怎么创建一个list集合呢?

很简单,万事万物皆对象,new一个,(按照具体需求来创建哪一个)

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

  List<Integer> myList = new linkedList<>();

可以看出这边就是多态的运用,向上转型

这边有些刚接触编程小伙伴会有疑惑了,这个 <> 是什么?

其实<> 代表泛型

官方是这样说的:泛型是 1.5中引入的一个新特性,其本质是参数化类型,也就是说所操作的数据类型被指定为一个参数(type parameter)这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。

看不懂,没关系,说人话:

在这边集合中,泛型指的就是你这个集合装什么类型的数据,就好像我们整理东西,这个箱子放衣服,这个箱子放书本,可以理解成贴的标签,下次看一眼这个标签就知道这里面装的是什么

就像这个例子,这个集合里面装的是int (Integer,int 类型的包装类)类型的数据

既然集合容器我们创造出来了,不装点东西那不就是浪费了,所以我们来看看有哪些操作集合的方法

1. 遍历 (读取集合)

先来学习遍历,方便我们后续进行打印输出,除了跟数组遍历方法一样java 基础——数组 ,集合还多了一种遍历方式,自带的迭代器 (基本不用,不建议使用,拿来混个眼熟,知道有这么个东西)

 List<Integer> myList = new ArrayList<>();
        myList.add(1);
        myList.add(3);
        myList.add(5);

        Iterator<Integer> it = myList.iterator();
        while (it.hasNext()) {
            Integer clone = it.next();
            System.out.println(clone);
        }

最主要我们还是使用 以下方式

ist<Integer> myList = new ArrayList<>();
        myList.add(1);
        myList.add(3);
        myList.add(5);

        //通过角标获取
        for (int i = 0; i < myList.size(); i++) {
            System.out.println(myList.get(i));
        }
        //增强for循环
        for (Integer item : myList) {
            System.out.println(item);
        }

        //java8 ,个人这种用的比较多
        myList.forEach(System.out::println);

jdk 1.8 新语法

输出结果:

在这里插入图片描述
1. 添加 (add)

添加是 直接添加数据

List<Integer> myList = new ArrayList<>();
        myList.add(1);
        myList.add(3);
        myList.add(5);
  1. 移除 (remove)

移除是 按照角标来移除

 List<Integer> myList = new ArrayList<>();
        myList.add(1);
        myList.add(3);
        myList.add(5);
        myList.remove(2);
     for (Integer item : myList) {
          System.out.println(item);
     }        

这里就是移除下标为2 的元素,下标为2 就是5 这个数据 ,结果:

在这里插入图片描述
3. 判断集合中是否有该元素(contains)

 List<Integer> myList = new ArrayList<>();
        myList.add(1);
        myList.add(3);
        myList.add(5);

        boolean contains = myList.contains(3);
        System.out.println(contains);

在这里插入图片描述
4. 获取集合的大小(size)

 List<Integer> myList = new ArrayList<>();
        myList.add(1);
        myList.add(3);
        myList.add(5);

        int size = myList.size();
        System.out.println(size);

在这里插入图片描述

5. 判断集合是否为空(isEmpty)

 List<Integer> myList = new ArrayList<>();
        myList.add(1);
        myList.add(3);
        myList.add(5);

        boolean empty = myList.isEmpty();
        System.out.println(empty);

在这里插入图片描述
6. 清空集合(clear)

  List<Integer> myList = new LinkedList<>();
        myList.add(1);
        myList.add(3);
        myList.add(5);
        
        myList.clear();

LinkedList 相对于ArrayList 用的比较少,有些方法自己留个印象

  • 返回此列表的第一个元素
 LinkedList<Integer> myList = new LinkedList<>();
        myList.add(1);
        myList.add(3);
        myList.add(9);

        Integer first = myList.getFirst();
        System.out.println(first);

输出结果:1

  • 返回此列表的最后一个元素

 LinkedList<Integer> myList = new LinkedList<>();
        myList.add(1);
        myList.add(3);
        myList.add(9);

        Integer first = myList.getLast();
        System.out.println(first);

输出结果:9

我们最后来简单看一下Vector, 这个东西在开发中不要用,Vector是线程安全的,这也是一个优点,但是它的效率低,其次Vector满了之后,扩容是一倍,ArrayList 仅仅是一半,面试中要是有问到,回答这些就好,java官方都不建议用这东西

最后我们来一个例子,来增强一下对List的理解

需求:有三个学生,学生对象存放在list中,他们呢都有自己的属性(学号,姓名,考试分数),然后把他们遍历打印出来

分析: 有个类,Student , 有三个私有属性(id,name,score)

public class Student {

    private  Integer id;
    private  String  name;
    private  Double  score;
    
    // 提供公共方法
    public Student(Integer id, String name, Double score) {
        this.id = id;
        this.name = name;
        this.score = score;
    }
    //以字符串形式输出
    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", score=" + score +
                '}';
    }
}

public static void main(String[] args) {
        //创建一个集合,泛型里面声明装的是学生对象
        List<Student> stuList = new ArrayList<>();
        //创建学生对象1
        Student stu1 = new Student(1, "stu1", 100.0);
        //创建学生对象2
        Student stu2 = new Student(2, "stu2", 95.5);
        //创建学生对象3
        Student stu3 = new Student(3, "stu3", 90.0);
        //将学生对象添加到集合中
        stuList.add(stu1);
        stuList.add(stu2);
        stuList.add(stu3);
        //遍历雪上对象,打印到控制台
        for (Student student : stuList) {
            System.out.println(student);
        }


    }

在这里插入图片描述

推荐阅读

java进阶—集合

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-12-25 11:33:24  更:2022-12-25 11:35:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/26 20:17:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计