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(扩容机制)

相关文章
|
3月前
|
数据采集 JSON Java
Java爬虫获取1688店铺所有商品接口数据实战指南
本文介绍如何使用Java爬虫技术高效获取1688店铺商品信息,涵盖环境搭建、API调用、签名生成及数据抓取全流程,并附完整代码示例,助力市场分析与选品决策。
|
1月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
86 4
|
1月前
|
Java Go 开发工具
【Java】(9)抽象类、接口、内部的运用与作用分析,枚举类型的使用
抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修饰符来修饰,抽象方法不能有方法体。抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类(接 口、枚举)5种成分。抽象类的构造器不能用于创建实例,主要是用于被其子类调用。抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类abstract static不能同时修饰一个方法。
200 1
|
2月前
|
算法 安全 Java
除了类,Java中的接口和方法也可以使用泛型吗?
除了类,Java中的接口和方法也可以使用泛型吗?
134 11
|
3月前
|
存储 缓存 安全
Java集合框架(二):Set接口与哈希表原理
本文深入解析Java中Set集合的工作原理及其实现机制,涵盖HashSet、LinkedHashSet和TreeSet三大实现类。从Set接口的特性出发,对比List理解去重机制,并详解哈希表原理、hashCode与equals方法的作用。进一步剖析HashSet的底层HashMap实现、LinkedHashSet的双向链表维护顺序特性,以及TreeSet基于红黑树的排序功能。文章还包含性能对比、自定义对象去重、集合运算实战和线程安全方案,帮助读者全面掌握Set的应用与选择策略。
257 23
|
2月前
|
缓存 Java 开发者
Java 开发者必看!ArrayList 和 LinkedList 的性能厮杀:选错一次,代码慢成蜗牛
本文深入解析了 Java 中 ArrayList 和 LinkedList 的性能差异,揭示了它们在不同操作下的表现。通过对比随机访问、插入、删除等操作的效率,指出 ArrayList 在多数场景下更高效,而 LinkedList 仅在特定情况下表现优异。文章强调选择合适容器对程序性能的重要性,并提供了实用的选择法则。
186 3
|
3月前
|
安全 Java 开发者
Java集合框架:详解Deque接口的栈操作方法全集
理解和掌握这些方法对于实现像浏览器后退功能这样的栈操作来说至关重要,它们能够帮助开发者编写既高效又稳定的应用程序。此外,在多线程环境中想保证线程安全,可以考虑使用ConcurrentLinkedDeque,它是Deque的线程安全版本,尽管它并未直接实现栈操作的方法,但是Deque的接口方法可以相对应地使用。
236 12
|
3月前
|
存储 安全 Java
Java集合框架(一):List接口及其实现类剖析
本文深入解析Java中List集合的实现原理,涵盖ArrayList的动态数组机制、LinkedList的链表结构、Vector与Stack的线程安全性及其不推荐使用的原因,对比了不同实现的性能与适用场景,帮助开发者根据实际需求选择合适的List实现。
|
安全 Java
java线程之List集合并发安全问题及解决方案
java线程之List集合并发安全问题及解决方案
1341 1
|
运维 关系型数据库 Java
PolarDB产品使用问题之使用List或Range分区表时,Java代码是否需要进行改动
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
下一篇
oss云网关配置