进阶JAVA篇-深入了解 List 系列集合

news2024/10/5 13:37:18

目录

        1.0 List 类的说明

         1.1 List 类的常用方法

        1.2 List 集合的遍历方式

        2.0 ArrayList 集合的底层原理

       2.1 从 ArrayList 集合的底层原理来了解具有该特性的原因:

         2.2 ArrayList 集合的优缺点

        3.0 LinkedList 集合的底层原理

        3.1 从 LinkedList 集合的底层原理来了解具有该特性的原因:

        3.2 LinkedList 集合的优缺点

        3.3 LinkedList 集合的特有方法


        1.0 List 类的说明

        在 Java 中,List 类是 Java 集合框架中的一种接口,它是一种有序的可重复的集合,用于存储多个元素。List 接口Collection 接口子接口它定义了一系列方法来操作和访问列表中的元素,所以 List 接口继承了 Collection 接口的方法。

有关的 Collection 接口的常用 API 介绍在以下链接:

进阶JAVA篇- Collection 类的常用的API与 Collection 集合的遍历方式-CSDN博客

         1.1 List 类的常用方法

以代码的形式来介绍这些方法:

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

public class Text_List {
    public static void main(String[] args) {

        //由于 List 是一个接口,不能直接去创建对象,
        //所以用 List 的实现类来创建一个对象,比如 ArrayList
        List<String> list = new ArrayList<>();//这是一行经典的代码!!!
        list.add("张三");
        list.add("李四");
        list.add("王五");
        System.out.println(list);
        //输出结果为:[张三, 李四, 王五]

        //1. add(index, element):在指定位置插入一个元素。
        list.add(1,"张麻子");
        System.out.println(list);
        //输出结果为:[张三, 张麻子, 李四, 王五]

        //2. remove(index):移除并返回指定位置的元素。
        list.remove(1);
        System.out.println(list);
        //输出结果为:[张三, 李四, 王五]

        //3. set(index, element):将指定位置的元素替换为新的元素。
        list.set(1,"张麻子");
        System.out.println(list);
        //输出结果为:[张三, 张麻子, 王五]

        //4. get(index):返回指定位置的元素。
        String a = list.get(1);
        System.out.println(a);
        //输出结果为:张麻子
        
    }
}

运行结果为:

        1.2 List 集合的遍历方式

        除了 List 系列集合继承 Collcetion类的三个遍历方式之外,还支持普通的带索引的 for 循环。

 有关的 Collection 类的三个遍历方式的介绍在以下链接:

进阶JAVA篇- Collection 类的常用的API与 Collection 集合的遍历方式-CSDN博客

        由于 List 系列集合支持支持有序的,所以可以使用普通带索引的 for 循环。

代码如下:

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

public class Text_List {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();//这是一行经典的代码!!!!
        list.add("张三");
        list.add("李四");
        list.add("王五");
        System.out.println(list);

        //用普通的 for 循环来遍历以上集合
        for (int i = 0; i < list.size(); i++) {
            String a = list.get(i);
            System.out.println(a);
        }
    }
}

运行结果如下:

        

        2.0 ArrayList 集合的底层原理

        由于 ArrayListList 的实现类,所以 ArrayList 特性与 List 接口是一致的,有序、可重复、有索引的特性。

       2.1 从 ArrayList 集合的底层原理来了解具有该特性的原因:

        ArrayList 集合是基于数组实现的,简单来说,ArrayList 集合就是一个可变长度的数组。因此可以解释为什么 ArrayList 集合具有有序、可重复、有索引的特性,是因为数组都具备这些特性。

        创建的 ArrayList 集合的对象在底层的过程:

        

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

public class Text_List {
    public static void main(String[] args) {

        //首先,利用无参构造器创建的集合,会在底层创建一个默认长度为0的数组
        List<String> list = new ArrayList<>();//这是一行经典的代码!!!!

        //当添加第一个元素的时候,会创建一个新的默认长度为10的数组
        list.add("a");
    }
}

        需要注意的是:

        1. 假如数组存满的时候会创建一个新的已扩容1.5倍的数组,然后将原来旧的数组里面的数据,迁移到新的已扩容的数组中来。

        2. 如果一次添加多个元素,1.5倍还是放不下,则新创建数组的长度以实际为准。

         2.2 ArrayList 集合的优缺点

        因为 ArrayList 是基于数组实现的,所以可以根据数组的特性来了解该集合的优缺点,由于数组是支持索引查找元素的,所以该集合的优点是很明显,查找元素特别的快。但是对于增添、删除、修改的操作来说是很慢的。

        所以 ArrayList 适合:根据索引查询数据。不适合:频繁对元素进行操作。

        3.0 LinkedList 集合的底层原理

        由于 LinkedListList 的实现类,所以 LinkedList 特性与 List 接口是一致的,有序、可重复、有索引的特性,但是与 ArrayList 在底层的原理是不一样的。

        3.1 从 LinkedList 集合的底层原理来了解具有该特性的原因:

        LinkedList 集合是基于双链表实现的。

简答介绍以下双链表:

        链表中的每一个节点都是独立的对象,也就是说内存不是连续的,每一个节点都包含记录上一个节点的地址还有下一个节点的地址、数值。

        3.2 LinkedList 集合的优缺点

        根据该集合的数据结构为双链表,每查询一个元素是从头或者尾一步一步地去查询的,而不能直接去找到其中的元素,所以查询是很慢的。对于增加、删除、修改元素的速度相对来说是快的。但是有两个节点很特殊,对于头、尾节点无论查询还是增加、删除、修改元素速度都很快的。

        所以 LinkedList 集合适合:频繁对元素操作的。不合适:大量的查找元素。

        3.3 LinkedList 集合的特有方法

以代码的形式来介绍:

import java.util.LinkedList;
public class Text_LinkedList {

    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<>();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        System.out.println(list);
        //输出结果为:[张三, 李四, 王五]

        //1. addFirst() :在该列表开头插入指定的元素
        list.addFirst("王麻子");
        System.out.println(list);
        //输出结果为:[王麻子, 张三, 李四, 王五]

        //2. addLast() :将指定的元素追加到此列表的末尾
        list.addLast("张麻子");
        System.out.println(list);
        //输出结果为:[王麻子, 张三, 李四, 王五, 张麻子]

        //3. getFirst() :返回此列表中的第一个元素
        String a = list.getFirst();
        System.out.println(a);
        //输出结果为:王麻子

        //4. getLast() :返回此列表中的最后一个元素
        String b = list.getLast();
        System.out.println(b);
        //输出结果为:张麻子

        //5. removeFirst() :从此列表中删除并返回第一个元素
        list.removeFirst();
        System.out.println(list);
        //输出结果为:[张三, 李四, 王五, 张麻子]

        //6. removeLast() :从此列表中删除并返回最后一个元素
        list.removeLast();
        System.out.println(list);
        //输出结果为:[张三, 李四, 王五]
    }
}

运行结果如下:

        根据 LinkedList 集合的数据结构的特性,其应用场景可以是用设计队列(先进先出,后进后出),还可以用来设计(先进后出,后进先出)。



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1118051.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

卷积神经网络CNN学习笔记-卷积计算Conv2D函数的理解

目录 1.全连接层存在的问题2.卷积运算3.填充(padding)3.1填充(padding)的意义 4.步幅(stride)5.三维数据的卷积运算6.结合方块思考7.批处理8.Conv2D函数解析9.conv2d代码9.1 stride19.2 stride2 参考文章 1.全连接层存在的问题 在全连接层中&#xff0c;相邻层的神经元全部连接…

多线程-进阶

常见的锁策略 乐观锁和悲观锁 这不是两把具体的锁, 这是两类锁 乐观锁: 预测锁的竞争不是很激烈 悲观锁: 预测锁的竞争会很激烈 乐观和悲观说的都不是绝对的, 唯一的区分就是看预测锁竞争激烈程度的结论, 这两种锁的背后工作是截然不同的, 轻量级锁和重量级锁 轻量级锁加锁解…

浅谈人工智能视频分析技术的原理及行业场景应用

人工智能视频分析技术是利用计算机视觉、模式识别和深度学习算法等技术&#xff0c;对视频数据进行自动化处理和分析的过程。其基本工作原理包括以下几个步骤&#xff1a; 视频采集&#xff1a;通过摄像头或其他视频设备获取源视频数据。 视频预处理&#xff1a;对视频进行去噪…

如何更改eclipse的JDK版本

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、有时候导入一些网上的资源需要更换JDK二、使用步骤1. 总结 一、有时候导入一些网上的资源需要更换JDK 具体操作如下 二、使用步骤 1. 在eclipse上方工具栏找…

使用列表实现向量运算

向量内积 from operator import mul x [4, 6, 9] y [2, 2, 7] print(sum(map(mul, x, y)))相当于 x [4, 6, 9] y [2, 2, 7] print(sum((i*j for i, j in zip(x, y))))两个等长的向量对应元素相加 from operator import add x [4, 6, 9] y [2, 2, 7] print(list(map(ad…

一些经典的神经网络(第20天)

1. 经典神经网络&#xff08;LeNet&#xff09; LeNet是早期成功的神经网络&#xff1b; 先使用卷积层来学习图片空间信息 然后使用全连接层来转到到类别空间 【通过在卷积层后加入激活函数&#xff0c;可以引入非线性、增加模型的表达能力、增强稀疏性和解决梯度消失等问题…

基于RSSI的室内wifi定位系统 计算机竞赛

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; wifi室内定位系统 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;…

【经历】在职8个月->丰富且珍贵

在职8个月->丰富且珍贵 2021-3~2021-11&#xff1a;面试进入一家做400电话的公司&#xff0c;我进入公司时&#xff0c;加上我只有四个人(老板、人事、业务)&#xff0c;开发只有我&#xff0c;所以&#xff1a;产品~设计~前端~后端~测试~上线~维护~培训&#xff0c;只有我自…

并发性Socket通信源码(基于linux环境下多线程)

服务器端&#xff1a;server.c 1 #include <stdio.h>2 #include <stdlib.h>3 #include <unistd.h>4 #include <string.h>5 #include <arpa/inet.h>6 #include <pthread.h>7 void* working(void *arg);8 //信息结构体9 struct sockinfo10 …

烘焙蛋糕外卖小程序商城的作用是什么

随着经营成本上升及电商业态的冲击&#xff0c;传统烘焙蛋糕门店商家经营止步不前&#xff0c;加之口罩原因更是雪上加霜&#xff0c;引流拓客、经营转化复购大幅度降低&#xff0c;而线上又因外卖平台间的激烈竞争&#xff0c;导致中小烘焙蛋糕商家进退两难。 烘焙蛋糕店经营…

PO模式在selenium自动化测试框架的优势

大家都知道po模式可以提高代码的可读性和减少了代码的重复&#xff0c;但是相对的缺点还有&#xff0c;今天通过本文一起学习下PO模式在selenium自动化测试框架的优势&#xff0c;需要的朋友可以参考下 PO模式简介 1.什么是PO模式 PO模型是:Page Object Model的简写 页面对象…

使用 Sealos 一键私有化部署 Serverless 框架 Laf

太长不看&#xff1a;Laf 上架了 Sealos 的模板市场&#xff0c;通过 Laf 应用模板即可一键部署&#xff01; Laf 是一个完全开源的项目&#xff0c;除了使用公有云之外&#xff0c;还有大量的用户选择私有化部署 Laf。然而&#xff0c;私有化部署通常伴随着更多的复杂性和门槛…

java 实现定时任务

1、EnableScheduling spring自带的定时任务功能&#xff0c;使用比较简单方便&#xff1a; 1、需要定时执行的方法上加上Scheduled注解&#xff0c;这个注解中可以指定定时执行的规则&#xff0c;稍后详细介绍。 2、Spring容器中使用EnableScheduling开启定时任务的执行&…

解决找不到VCRUNTIME140_ 1.dll问题的5个方法分享

近日&#xff0c;许多用户在运行某些软件时遇到了“由于找不到VCRUNTIME140_1.dll无法继续执行此代码”的问题。这个错误通常出现在运行某些软件或游戏时&#xff0c;提示找不到必要的动态链接库文件。本文将详细VCRUNTIME140_ 1.dll文件是什么&#xff0c;并分享如何解决这个问…

1658.将x减到0的最小操作数(滑动窗口)

目录 一、题目 二、分析代码 一、题目 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 二、分析代码 class Solution { public:int minOperations(vector<int>& nums, int x) {int _MaxLength INT_MIN;int _sum 0;int tmp 0;for (aut…

数据回归算法 | Python逻辑回归

逻辑回归是一种经典的机器学习算法,用于解决二分类问题。 它常被用于预测某个事件发生的概率,通过将输入特征映射到一个概率值来进行分类。 简单聊聊 逻辑回归就像一位智能的侦探,根据一些线索(输入特征)判断某件事情是否会发生。 它将这些线索组合起来,计算出一个关于…

洛谷 P1216 [USACO1.5] [IOI1994]数字三角形题解

观察题目我们发现从前往后推会有条件判断&#xff0c;不容易写出来。所以就从后往前推。 也就是说后面的状态已经是推出来了&#xff0c;保证是最大值。 //数字三角形 #include<iostream> using namespace std; const int N 510; int f[N][N], n;int main() {ios::sync…

利用Bootstrap的面包屑组件实现面包屑层次分级导航效果

目录 01-相关基础知识02-一个简单的示例03-改变面包悄中的层级分隔符 01-相关基础知识 可以用类breadcrumb实现面包屑层次导航效果。 当使用 Bootstrap 构建网页时&#xff0c;breadcrumb 类用于创建面包屑导航&#xff08;breadcrumb navigation&#xff09;&#xff0c;这是…

在 RN 中构建自适应 UI

移动开发的世界在不断变化&#xff0c;随之而来的是对能够适应任何设备或方向的用户界面的需求。React Native 提供了一套丰富的工具来构建这样的需求。 在本文中&#xff0c;我们将探讨如何在 React Native 中设计响应式和自适应 UI&#xff0c;重点关注不同的设备尺寸、方向…

yakit使用爆破编码明文_dnslog使用

yakit使用爆破编码密码 文章目录 yakit使用爆破编码密码yakit使用1 yakit编码密码进行爆破2 准备eval.php文件放入web3 访问http://192.168.225.206/eval.php,使用bp抓包,测试后环境准本好4 使用yakit4.1 进入页面&#xff0c;点击这里进行配置默认端口80834.2 发送到模糊测试4…