Java中的集合List - 入门篇
前言
大家好啊,我是汤圆,今天给大家带来的是《Java中的集合List - 入门篇》,希望对大家有帮助,谢谢
简介
说实话,Java中的集合有很多种,但是这里作为入门级别,先简单介绍第一种集合List,如下图所示

正文
List是一种有序集合,和数组的行为非常相似,但是比数组灵活;
因为数组是长度固定的,而List的长度是动态分配的。
数组的概览
既然LIst是基于数组实现的,那么在介绍List之前,我们先来熟悉一下Java的数组吧(简单过一下,毕竟用的不多了)
数组对象有一个length属性来获取数组的长度,和一个"[]"方法来访问元素
数组也是一个对象,通过直接打印数组可以看出来,比如
[Ljava.lang.String;@1b6d3586
如下所示,我们先初始化一个数组,并通过length访问了数组的长度,[]语法访问数组内的元素
// 初始化数组
String[] arr = {"1", "2", "3"};
// 数组长度
int length = arr.length;
// 数组第一个元素
String a1 = arr[0];
// 数组转为字符串,需借助Arrays工具类
String res = Arrays.toString(arr);
System.out.println(length);
System.out.println(a1);
System.out.println(res);
其中我们用到了Arrays这个工具类,因为数组的toString方法不能直接拼接内部的元素,而是打印数组对象的地址
List可以,直接调用List.toString()即可输出所有元素拼接后的字符串
数组的优点:
随机访问快,也是仅存的一个优点(其他地方都没ArrayList好)
数组的缺点:
长度固定,插入慢
好了,数组先说到这里,下面开始说List
List的接口方法
下面是几个常用的List接口方法:
boolean add(E e):在列表末尾插入元素Evoid add(int index, E element):在指定位置 index 插入元素 EE get(int index):查询指定位置 index 的元素boolean contains(Object o):查询列表是否包含指定的对象boolean remove(Object o):删除指定的对象int size():查询列表的元素个数
ArrayList和LinkedList的区别
用表格对比结果如下:
| ArrayList | LinkedList | |
|---|---|---|
| 内部结构 | 数组,有序 | 双向链表,无序 |
| 随机访问 | 快 | 慢 |
| 插入、修改 | 慢(如果是末尾插入,则很快) | 快 |
可以看到,ArrayList适合随机访问,LinkedList适合插入和修改(如果是尾插,则区别不大)
为什么ArrayList随机访问很快呢?
ArrayList是基于数组实现的,而数组又是基于整数索引(下标)来查询数据的,所以ArrayList的查询效率很高
为什么ArrayList插入又很慢?
插入很慢,是因为ArrayList内部基于数组实现,内存都是连续的,因此插入时要移动后面的数据;
如果是直接在末尾插入,则不需要移动任何数据,也就快了(默认添加元素时,就是在尾部插入)
但是如果我要在中间位置插入,那么后面的数据都需要移动
比如下图,我想把 "Cat 005" 插入到 "Cat 001" 后面,那么后面的 "Cat 002"、"Cat 003"、 "Cat 004"都要移动,这就导致效率很低

为什么LinkedList随机访问慢?
因为LinkedList内部是双向链表结构,即每个元素都包含一个前引用和后引用,如下图所示

这就导致了一个问题,每次不管我访问哪个元素,都需要从头开始一个个索引;
结果就是访问速度很慢。
那么为什么LinkedList随机插入很快呢?
正所谓"成也萧何败萧何",虽然随机访问慢,但是正因为有了这些链表结构,使得插入的时候很方便了
因为现在不需要移动任何元素,只需要修改前后元素的引用就可以了
比如下图,我想把 "Dog 005" 插入到 "Dog 001" 后面,那么只需要修改 "Dog 001"的后引用和"Dog 002"的前引用,其他元素都不用动的

细心的你们可能发现了,ArrayList图中的元素都是顺序排列的,而LinkedList图中的元素都是随机排列的;
这个其实就是为了说明他们俩的内部结构特征,ArrayList内存空间有序,LinkedList内存空间无序
那么LinkedList这样设计,除了插入快,还有其他好处吗?
当然有啊,因为LinkedList内部的数据都是通过引用来连接到一起的,所以就可以很好的利用零散的内存空间,从而提高内存利用率
代码
下面我们用代码来实践下
// 初始化
List<String> list = new ArrayList<>();
// 插入数据
list.add("hello world 1");
// 在指定位置插入数据
list.add(0, "hello world 2");
// 查询数据
String s1 = list.get(0);
// 查询List是否包含指定对象
boolean isContain = list.contains(s1);
// 查询列表的元素个数
int size = list.size();
// 打印list内部元素:
String res = list.toString();
结果如下所示,可以看到,List.toString()会自动拼接内部元素

总结
List是一种有序集合,和数组的行为非常相似,但是比数组灵活;
最常用的是ArrayList,它适用于大部分场景;
但是在插多查少的情况下,建议用LinkedList,可以提高插入的效率;
后记
最后,感谢大家的观看,谢谢
Java中的集合List - 入门篇的更多相关文章
- Java中的集合Set - 入门篇
前言 大家好啊,我是汤圆,今天给大家带来的是<Java中的集合Set - 入门篇>,希望对大家有帮助,谢谢 简介 前面介绍了集合List,映射Map,最后再简单介绍下集合Set,相关类如下 ...
- Java中的映射Map - 入门篇
前言 大家好啊,我是汤圆,今天给大家带来的是<Java中的映射Map - 入门篇>,希望对大家有帮助,谢谢 简介 前面介绍了集合List,这里开始简单介绍下映射Map,相关类如下图所示 正 ...
- Java中的IO流 - 入门篇
前言 大家好啊,我是汤圆,今天给大家带来的是<Java中的IO流-入门篇>,希望对大家有帮助,谢谢 由于Java的IO类有很多,这就导致我刚开始学的时候,感觉很乱,每次用到都是上网搜,结果 ...
- Java中的集合框架-Collections和Arrays
上一篇<Java中的集合框架-Map>把集合框架中的键值对容器Map中常用的知识记录了一下,本节记录一下集合框架的两个工具类Collections和Arrays 一,Collections ...
- Java中的集合框架-Map
前两篇<Java中的集合框架-Commection(一)>和<Java中的集合框架-Commection(二)>把集合框架中的Collection开发常用知识点作了一下记录,从 ...
- Java中的集合框架-Collection(二)
上一篇<Java中的集合框架-Collection(一)>把Java集合框架中的Collection与List及其常用实现类的功能大致记录了一下,本篇接着记录Collection的另一个子 ...
- Java中的集合(四)PriorityQueue常用方法
Java中的集合(四)PriorityQueue常用方法 PriorityQueue的基本概念等都在上一篇已说明,感兴趣的可以点击 Java中的集合(三)继承Collection的Queue接口 查看 ...
- 万字长文深入理解java中的集合-附PDF下载
目录 1. 前言 2. List 2.1 fail-safe fail-fast知多少 2.1.1 Fail-fast Iterator 2.1.2 Fail-fast 的原理 2.1.3 Fail- ...
- Java 中的集合接口——List、Set、Map
Java 中的集合接口——List.Set.Map 什么叫集合:集合就是Java API所提供的一系列类的实例,可以用于动态存放多个对象.这跟我们学过的数组差不多,那为什么我们还要学集合,我们看看数组 ...
随机推荐
- 从GitHub Jobs! 看技术发展趋势! 程序员进阶必备!
0. https://jobs.github.com/positions GitHub Jobs: 1. https://jobs.github.com/positions/38bb8dc8-b5b4 ...
- Linux 学习笔记分享: Linux 用户组的权限: drwx------ 700权限(d 目录 ,r=4,w=2,x=1:rwx=7;---=0;---=0)
Linux 用户组的权限: drwx------ 700权限(d 目录 ,r=4,w=2,x=1:rwx=7;---=0;---=0) 1 1 Linux 用户组的权限: drwx------ 700 ...
- CSS3 & Flex Layout All In One
CSS3 & Flex Layout All In One demos https://www.cnblogs.com/xgqfrms/p/10769302.html .flex-contai ...
- Flutter: 监听App显示,隐藏
关键代码 class _MyAppState extends State<MyApp> with WidgetsBindingObserver { @override void initS ...
- Win10安装VSCode并配置Python环境 完整版超详细简单【原创】
我们分为三个步骤进行: 一.下载VSCode 二.配置Python环境 三.测试Python 一.下载VSCode 1.打开国内镜像vscode下载地址,即可自动下载:https://vscode.c ...
- Jupyter notebook操作技巧
学习笔记:Jupyter notebook操作技巧 一.jupyter notebook简介.用途.优势和缺点 二. 单元Cell: 三.操作技巧 - 给Jupyter换主题 - 笔记本扩展(nbex ...
- 按键显示器(判断键盘监听器获得的值为普通Key还中modifiers)
1 import sys 2 from PyQt5 import QtWidgets,QtCore 3 from PyQt5.QtCore import Qt 4 from PyQt5.uic.pro ...
- 如何用Eggjs从零开始开发一个项目(2)
在上一篇文章,我们已经使用Sequelize连接上了数据库,并能进行简单的数据库操作,在此基础上,我们试着来开发一个完整的项目.这篇文章我们从用户的注册.登录着手,试着开发用户模块的相关的代码. 用户 ...
- docker封装Spring Cloud(单机版)
一.概述 微服务统一在一个git项目里面,项目的大致结构如下: ./ ├── auth-server │ ├── pom.xml │ └── src ├── common │ ├── pom.xml ...
- Mybatis初步认识
分三层 第一章 1.三层架构 界面层:和用户打交道,接收用户的请求参数明显是处理结果的(jsp,html,servlet) 业务逻辑层:接收了界面层传递的数据,计算逻辑,调用数据库,获取数据 数据访问 ...