前言

大家好啊,我是汤圆,明天给大家带来的是《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):在列表开端插入元素E
  • void add(int index, E element):在指定地位 index 插入元素 E
  • E get(int index):查问指定地位 index 的元素
  • boolean contains(Object o):查问列表是否蕴含指定的对象
  • boolean remove(Object o):删除指定的对象
  • int size():查问列表的元素个数

ArrayList和LinkedList的区别

用表格比照后果如下:

ArrayListLinkedList
内部结构数组,有序双向链表,无序
随机拜访
插入、批改慢(如果是开端插入,则很快)

能够看到,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,能够进步插入的效率;

后记

最初,感激大家的观看,谢谢