乐趣区

关于java: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):在列表开端插入元素 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 的区别

用表格比照后果如下:

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

后记

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

退出移动版