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