前言
大家好啊,我是汤圆,明天给大家带来的是《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
,能够进步插入的效率;
后记
最初,感激大家的观看,谢谢