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所提供的一系列类的实例,可以用于动态存放多个对象.这跟我们学过的数组差不多,那为什么我们还要学集合,我们看看数组 ...
随机推荐
- set CSS style in js solutions All In One
set CSS style in js solutions All In One css in js set each style property separately See the Pen se ...
- css variables & CSS 变量
css variables & CSS 变量 https://gist.github.com/xgqfrms-GitHub/5d022a13292c615d2730e84d909e1aba c ...
- 如何使用 js 检测控制台被用户打开了
如何使用 js 检测控制台被用户打开了 js solutions 监听 F12 事件 监听键盘快捷键组合 Ctrl + Shift + I Option + Command + I Object.to ...
- styled-components all in one
styled-components all in one CSS in JS https://www.styled-components.com/ https://github.com/styled- ...
- gradient text & gradient background
gradient text & gradient background -webkit-text-fill-color & -webkit-gradient https://wesbo ...
- Inspect Network Activity In Chrome DevTools
Inspect Network Activity In Chrome DevTools https://developers.google.com/web/tools/chrome-devtools/ ...
- [转]ROS Q&A | How to read LaserScan data
http://www.theconstructsim.com/read-laserscan-data/ Step 1. Open a project on ROS Development Studio ...
- Github Packages和Github Actions实践之CI/CD
概述 Github在被微软收购后,不忘初心,且更大力度的造福开发者们,推出了免费私有仓库等大更新.近期又开放了packages和actions两个大招,经笔者试用后感觉这两个功能配合起来简直无敌. G ...
- Java基础语法:final修饰符
一.final类 描述: 用'final'修饰的类不能被继承,没有子类. 例如,我们是无法写一个类去继承String类,然后对String类型扩展的,因为API中已经将String类定义为'final ...
- 后端程序员之路 27、LogStash
访谈与书评:<LogStash,使日志管理更简单>http://www.infoq.com/cn/articles/review-the-logstash-book/ [Logstash] ...