前言

大家好啊,我是汤圆,今天给大家带来的是《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,可以提高插入的效率;

后记

最后,感谢大家的观看,谢谢

Java中的集合List - 入门篇相关推荐

  1. Java中的映射Map - 入门篇

    前言 大家好啊,我是汤圆,今天给大家带来的是<Java中的映射Map - 入门篇>,希望对大家有帮助,谢谢 简介 前面介绍了集合List,这里开始简单介绍下映射Map,相关类如下图所示 正 ...

  2. java list 前100个_实现java 中 list集合中有几十万条数据,每100条为一组取出

    解决"java 中 list集合中有几十万条数据,每100条为一组取出来如何实现,求代码!!!"的问题. 具体解决方案如下: /** * 实现java 中 list集合中有几十万条 ...

  3. java去重复的集合_如何去除Java中List集合中的重复数据

    1.循环list中的所有元素然后删除重复 public class duplicatRemoval { public static List removeDuplicate(List list){ f ...

  4. 万字长文深入理解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 Fai ...

  5. Java中List集合介绍(炒鸡详细呦)

    Java中List集合介绍 文章目录 Java中List集合介绍 1,Java集合介绍 2,List介绍 2.1 ArrayList集合 2.2 LinkedList集合 3,List常用方法 3.1 ...

  6. Java中Set集合是如何实现添加元素保证不重复的?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | 公众号「武培轩」 Java中Set集合是如何实 ...

  7. (转)java中对集合对象list的几种循环访问总结

    Java集合的Stack.Queue.Map的遍历 在集合操作中,常常离不开对集合的遍历,对集合遍历一般来说一个foreach就搞定了,但是,对于Stack.Queue.Map类型的遍历,还是有一些讲 ...

  8. java中的集合框架_JAVA中的集合框架(上)List

    第一节 JAVA中的集合框架概述 集合的概念,现实生活中:很多事物凑在一起就是一个集合:数学中的集合:具有相同属性事物的总体:JAVA中的集合:是一种工具类,就像是容器,储存任意数量的具有共同属性的对 ...

  9. java中各种集合的用法和比较

    一,java中各种集合的关系图 Collection       接口的接口     对象的集合  ├ List           子接口         按进入先后有序保存   可重复  │├ L ...

最新文章

  1. GCB:西农韦革宏团队-土壤多营养级网络的复杂度增强农田系统生物多样性和多功能性的联系...
  2. Python基础教程(第3版) 笔记(一)
  3. blockhouses
  4. Ordering Tasks
  5. do还是doing imagine加to_imagine doing还是todo
  6. OpenCV imwrite
  7. 江小白包装设计原型_雪碧和江小白的品牌跨界合作之旅可谓是一场品牌包装的视觉盛宴...
  8. 字段类型:mysql中int(3)与int(11)有什么区别吗?优化数据库字段占据磁盘的大小
  9. linux 网口名称变了_CentOS7修改网卡名称为eth0及一些基本设置
  10. AFNnetworking详解
  11. python接口自动化(十五)--参数关联接口(详解)
  12. 如何在 Simulink 中使用 PID Tuner 进行 PID 调参?
  13. web player php,unity web player是什么软件
  14. 微信公众号新手运营指南——公众号后台常用功能介绍
  15. 房产经纪人拿楼市新政炒作涨价
  16. 斯托克斯公式(三维中两类曲面和第二类曲线互相转换)
  17. 双卡4G路由器_4G双卡双模路由器_4G双网双待路由器
  18. 导数求函数最大值和最小值习题
  19. 360视频:金字塔棱台投影TSP
  20. Arduino UNO AT24C32进行字符串数据读写

热门文章

  1. 机器学习DGA域名检测
  2. 短视频挺进在线音乐腹地
  3. 初等数论的一部分结论
  4. 2022.3.12 绍兴文理学院元培学院第十五届大学生程序设计竞赛
  5. 北京融汇数联科技实习面试
  6. 转:微信营销思路分析及执行要素!
  7. 基于eNSP的小型企业网(附ensp源文件)
  8. blender 常用修改器
  9. Multisim 14.0安装教程---图文讲解
  10. python抢鞋nike,snkrs怎么抢鞋 nike snkrs抢鞋步骤