Java—List接口(ArrayList)

简介: 今天来看看Java集合中的List集合,为什么List集合中元素能重复?为什么List集合是有序的?我们来共同交流交流

今天来看看Java集合中的List集合,为什么List集合中元素能重复?为什么List集合是有序的?我们来共同交流交流


e1c0495fcd073400de85538991defb01.png


List集合基础概念


List是什么?


Collection子接口,实现List接口的容器类中的元素是有顺序的,可以重复


根据List这个单词我们也可以发现List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素,像一个列表一样,里面有一条一条的记录


容器类


  • ArrayList
  • LinkedList


List集合有什么特点吗?


  • 元素有序(有序实际上是说存进去是这个顺序,取出来还是这个顺序。这里说的顺序不是说按照大小排序)
  • 可以重复
  • 默认按元素添加顺序设置元素的索引,以1递增


List底层是什么结构存储的?


底层是Object类型的数组结构。线性表顺序存储结果


List和数组有什么区别?


  • List大小不固定,容量自动增长,可以随意添加;
  • 数组元素在内存中连续存放、长度固定、每个元素占用的内存相同、可以通过下标迅速访问数组中的元素,检索效率高。如果想要增加数组长度,需要复制。但如果想要增加一个元素,需要移动大量元素,删除也一样(元素以此向左移动一个元素位置,以填补删除操作造成的空缺)


为什么数组在末尾添加元素效率高?


数组不需要遍历,通过下标就可以直接找到位置,速度很快


为什么数组检索速度快(为什么ArrayList检索速度快)?


ArrayList底层是用数组结构进行存储的,数组的存储空间是连续的,这样我们就可以通过下标来访问元素。所以ArrayList之所以检索效率比较高,不单出是因为下标的原因,是因为底层数组发挥的作用。他们是相辅相成的关系。


那使用的时候如何选用是用ArrayList还是数组呢?


如果查找使用很多,删除和插入很少可以使用数组;


插入删除涉及可以使用ArrayList


方法有哪些?


  • Object get(int index):通过索引下标获取指定位置的集合元素
  • Object set(int index, Object element):根据指定的索引下标修改元素
  • void add(int index, Object element):在指定索引下标位置插入数据
  • Object remove(int index)根据指定的索引下标移除数据
  • int indexOf(Object o):获取指定元素在集合中第一次出现的索引下标
  • int lastIndexOf(Object o):获取指定元素在集合中最后一次出现的索引下标
  • addAll(小标,集合):在指定索引下标的位置插入集合
  • subList(2,4):取索引下标在大于等于2小于等于4的元素
  • size():集合的长度


List常用算法


类java.util.Collections提供了一些静态方法实现了给予List容器的一些常用算法:


  • void sort(List) 对List容器内的元素排序
  • vid shuffle(List) 对List容器内的对象进行随机排列
  • void reverse(List) 对List容器内的对象进行逆序排列
  • 用一个特定的对象重写整个List容器
  • void copy (List dest,List src) 将src List容器内容拷贝到dest List容器
  • int binarySearch(List,Object) 对于顺序的List容器,采用折半查找的方法查找特定对象


import java.util.List;
import java.util.LinkedList;
import java.util.Collections;
public class ListTest2 {
    List l1 = new LinkedList();
    List l2 = new LinkedList();
    for(int i =0 ; i<=9 ; i++){
       l1.add("a"+i);
    }
    System.out.println(l1);
    Collections.shuffle(l1);   //随机排列
    System.out.println(l1);
    Collections.reverse(l1);    //逆续
    System.out.println(l1);
    Collections.sort(l1);     //排序
    System.out.println(l1);
    System.out.println(Collections.binarySearch(l1,"a5"));   //折半查找
}


LinkedList


单向链表及图


c8e9fb46f418b1d6e30380774d72c58c.png


LinkedList的特点:


  • LinkedList的底层采用了双向链表数据结构(好处是随即增删改元素快速,不涉及到元素位移)
  • 检索效率低(每次需要节点开始逐个往下进行检索,直到找到位置)
  • 在空间存储上内存地址不连续


链表的优缺点


链表的优点


增删效率比较高。由于链表上的元素在空间存储上内存地址不连续,所以随即增删元素的时候不会有大量元素位移,只需要修改元素指针域指向的位置就行


链表的缺点


检索效率低。不能通过数学表达式计算被查找元素的内存地址,所以每次查找的时候都是从头节点开始遍历,直到找到位置


List接口相关集合:


Java—ArrayList(扩容机制)

相关文章
|
11天前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
|
15天前
|
Java 索引 容器
Java ArrayList扩容的原理
Java 的 `ArrayList` 是基于数组实现的动态集合。初始时,`ArrayList` 底层创建一个空数组 `elementData`,并设置 `size` 为 0。当首次添加元素时,会调用 `grow` 方法将数组扩容至默认容量 10。之后每次添加元素时,如果当前数组已满,则会再次调用 `grow` 方法进行扩容。扩容规则为:首次扩容至 10,后续扩容至原数组长度的 1.5 倍或根据实际需求扩容。例如,当需要一次性添加 100 个元素时,会直接扩容至 110 而不是 15。
Java ArrayList扩容的原理
|
2天前
|
Java
在Java中,接口之间可以继承吗?
接口继承是一种重要的机制,它允许一个接口从另一个或多个接口继承方法和常量。
16 1
|
12天前
|
Java
java线程接口
Thread的构造方法创建对象的时候传入了Runnable接口的对象 ,Runnable接口对象重写run方法相当于指定线程任务,创建线程的时候绑定了该线程对象要干的任务。 Runnable的对象称之为:线程任务对象 不是线程对象 必须要交给Thread线程对象。 通过Thread的构造方法, 就可以把任务对象Runnable,绑定到Thread对象中, 将来执行start方法,就会自动执行Runable实现类对象中的run里面的内容。
27 1
|
18天前
|
存储 Java 索引
Java中的数据结构:ArrayList和LinkedList的比较
【10月更文挑战第28天】在Java编程世界中,数据结构是构建复杂程序的基石。本文将深入探讨两种常用的数据结构:ArrayList和LinkedList,通过直观的比喻和实例分析,揭示它们各自的优势与局限,帮助你在面对不同的编程挑战时做出明智的选择。
|
17天前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
44 4
|
22天前
|
Java
Java基础(13)抽象类、接口
本文介绍了Java面向对象编程中的抽象类和接口两个核心概念。抽象类不能被实例化,通常用于定义子类的通用方法和属性;接口则是完全抽象的类,允许声明一组方法但不实现它们。文章通过代码示例详细解析了抽象类和接口的定义及实现,并讨论了它们的区别和使用场景。
|
22天前
|
Java 测试技术 API
Java零基础-接口详解
【10月更文挑战第19天】Java零基础教学篇,手把手实践教学!
21 1
|
5月前
|
安全 Java
java线程之List集合并发安全问题及解决方案
java线程之List集合并发安全问题及解决方案
932 1
|
4月前
|
Java API Apache
怎么在在 Java 中对List进行分区
本文介绍了如何将列表拆分为给定大小的子列表。尽管标准Java集合API未直接支持此功能,但Guava和Apache Commons Collections提供了相关API。
下一篇
无影云桌面