Java基础快速入门: List集合、数据结构与源码解析

Java零基础-集合:List接口 Java是一种广泛使用的编程语言,而集合是Java中非常重要的概念之一。本文将介绍Java集合框架中的List接口,以及其使用方法和应用场景。本文将从以下几个方面对Java集合框架中的List接口进行介绍:简介、源代码解析、应用场景案例、优缺点分析和类代码方法介绍。同时,我们将提供具体的Java代码测试用例来帮助读者更好地理解和应用List接口。List接口是Java集合框架中的一种常用接口,它定义了一组有序的元素集合,并且允许包含重复元素。 阅读详情

本文纲要

  1. List集合概述与基本使用
    1.1 List接口特点
    1.2 项目结构
    1.3 基本遍历方式
  2. List特有方法
    2.1 add(int index, E element)
    2.2 remove(int index) 与 remove(Object o)
    2.3 set(int index, E element)
    2.4 get(int index)
  3. 常见数据结构:栈和队列
    3.1 栈(Stack)
    3.2 队列(Queue)
  4. 数据结构:数组与链表
    4.1 数组
    4.2 链表
  5. ArrayList 底层原理与源码分析
    5.1 ArrayList 底层数据结构
    5.2 空参构造及首次添加元素
    5.3 扩容机制
    5.4 查询与遍历
  6. LinkedList 基本使用
  7. LinkedList 特有方法
  8. LinkedList 源码解析

List集合概述与基本使用

1 )List接口特点

List是单列集合Collection的子接口,代表一个有序、有索引、可重复的元素序列。

  • 有序:指的是存取顺序一致,即按什么顺序存入,就按什么顺序取出。
  • 有索引:可以通过整数索引(从0开始)精确操作每一个元素,包括获取、修改、删除。
  • 可重复:允许存储重复的元素。

常见的List实现类包括ArrayList和LinkedList,它们都实现了List接口的全部方法。由于List继承了Collection,所以Collection中的通用方法(如add、remove、contains等)在List中同样适用。

2 ) 项目结构

本文涉及的示例代码位于如下包结构中,后续讲解将围绕这些类展开:

mycollection/
└── src/
    └── com/
        └── wb/
            └── mylistdemo1/
                ├── MyListDemo1.java 
                ├── MyListDemo2.java 
                ├── MyLinkedListDemo3.java 
                └── MyLinkedListDemo4.java 

3 ) 基本遍历方式

下面通过 MyListDemo1演示List结合泛型的创建、添加元素以及两种常见的遍历方式:迭代器和增强for循环。

// MyListDemo1.java 
package com.wb.mylistdemo1;
 
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
 
public class MyListDemo1 {
    public static void main(String[] args) {
        // 创建List集合,使用多态,实际是ArrayList 
        List<String> list = new ArrayList<>();
 
        // 添加元素 
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
 
        // 方式一:迭代器遍历 
        Iterator<String> it = list.iterator();
        while (it.hasNext()) {
            String s = it.next();
            System.out.println(s);
        }
 
        System.out.println("---------------------");
 
        // 方式二:增强for遍历 
        for (String s : list) {
            System.out.println(s);
        }
    }
}

输出结果均为 a b c d,顺序与插入时一致。

List特有方法

List 接口中定义了一系列与索引相关的方法,这是Set集合所不具备的。包括:

  • void add(int index, E element) — 在指定位置插入元素
  • E remove(int index) — 删除指定索引的元素并返回被删除的元素
  • E set(int index, E element) — 修改指定索引的元素,返回被修改的元素
  • E get(int index) — 返回指定索引处的元素

此外,List中存在两个重载的remove方法,需要注意区分:

  • boolean remove(Object o) — 删除指定的元素,返回是否删除成功
  • E remove(int index) — 删除指定索引的元素,返回被删除的元素

下面的示例将它们拆分为独立的方法进行展示。

1 ) add(int index, E element)

// 方法 extract from MyListDemo2 
private static void method1(List<String> list) {
    // 在索引0处插入"qqq"
    list.add(0, "qqq");
    System.out.println(list);
}

注意事项:原来该位置及其后的元素会依次后移一个索引。

2 ) remove(int index) 与 remove(Object o)

private static void method2(List<String> list) {
    // 按索引删除 
    String removed = list.remove(0);    // 删除0索引的元素,返回被删除的元素 
    System.out.println(removed);
    System.out.println(list);
 
    // 按元素对象删除 
    boolean success = list.remove("bbb"); // 删除指定的元素"bbb",返回是否成功 
    System.out.println("删除bbb成功:" + success);
    System.out.println(list);
}

两个remove方法的参数类型不同,调用时根据参数类型自动匹配。当传入int时调用索引删除,传入Object时调用元素删除。

3 ) set(int index, E element)

private static void method3(List<String> list) {
    // 将索引0处的元素修改为"qqq"
    String oldValue = list.set(0, "qqq");
    System.out.println("被替换的元素:" + oldValue);
    System.out.println(list);
}

注意:被替换的元素在集合中不再存在,返回的是旧值。

4 ) get(int index)

private static void method4(List<String> list) {
    // 获取0索引的元素 
    String s = list.get(0);
    System.out.println(s);
}

get方法常与普通for循环结合,遍历整个集合:

for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i));
}

整合后的MyListDemo2完整代码:

package com.wb.mylistdemo1;
 
import java.util.ArrayList;
import java.util.List;
 
public class MyListDemo2 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
 
        // 逐一演示各个方法(取消注释即可运行对应方法)
        method1(list);
        method2(list);
        method3(list);
        method4(list);
    }
 
    private static void method1(List<String> list) {
        System.out.println("--- add(index, element) ---");
        list.add(0, "qqq");
        System.out.println(list);
    }
 
    private static void method2(List<String> list) {
        System.out.println("--- remove(index) & remove(object) ---");
        // 按索引删除 
        String removedByIndex = list.remove(0);
        System.out.println("删除索引0的元素: " + removedByIndex);
        System.out.println(list);
        // 按对象删除 
        boolean removedByObject = list.remove("bbb");
        System.out.println("删除元素bbb是否成功: " + removedByObject);
        System.out.println(list);
    }
 
    private static void method3(List<String> list) {
        System.out.println("--- set(index, element) ---");
        String old = list.set(0, "qqq");
        System.out.println("被替换的元素: " + old);
        System.out.println(list);
    }
 
    private static void method4(List<String> list) {
        System.out.println("--- get(index) ---");
        String first = list.get(0);
        System.out.println(first);
    }
}

常见数据结构:栈和队列

数据结构是计算机存储和组织数据的方式,不同的数据结构直接影响程序的运行和存储效率。
下面介绍两种经典模型:栈与队列。

1 ) 栈(Stack)

栈是一种先进后出(FILO,First In Last Out)的结构。数据从一端(栈顶)进入,称为压栈/进栈,也从同一端出去,称为弹栈/出栈。

出栈顺序

数据D

数据C

数据B

数据A

压栈顺序

数据A

数据B

数据C

数据D

类比:手枪弹夹,先压入的子弹最后打出。

2 ) 队列(Queue)

队列是一种先进先出(FIFO,First In First Out)的结构。数据从后端进入(入队列),从前端离开(出队列)。

出队列方向

数据D

数据C

数据B

数据A

入队列方向

数据A

数据B

数据C

数据D

类比:排队购票,后来的人排在队尾,队首的人先完成离开。

数据结构:数组与链表

1 ) 数组

数组在内存中是一块连续的空间,通过基地址加索引可以快速定位任意元素,因此查询速度快。但增删元素时需要移动大量数据,效率较低。

  • 删除元素:删除位置后的所有元素依次前移
  • 插入元素:插入位置后的所有元素依次后移

因此,数组是一种 查询快、增删慢 的模型。

2 ) 链表

链表由一个个节点(Node)组成,每个节点独立存储,通过记录相邻节点的地址值形成链状结构。

  • 单向链表:每个节点记录自己的值和下一个节点的地址。
  • 双向链表:每个节点记录自己的值、前一个节点的地址、下一个节点的地址。既能从前向后查找,也能从后向前查找,查询效率更高。

链表在增删时只需修改相邻节点的指向,无需移动大量数据,因此 增删快;但查询时必须从头(或尾)开始遍历,因此 查询慢(相对数组)。

ArrayList底层原理与源码分析

1 ) ArrayList底层数据结构

ArrayList底层是一个动态数组,名为 elementData,类型为 Object[]。其特点为查询快、增删慢。同时维护一个 size 变量,表示当前元素个数,也指向下一次添加操作的索引位置。

2 ) 空参构造及首次添加元素

使用空参构造创建ArrayList时,底层会创建一个长度为0的数组:

// 源码片段(简化理解)
private static final Object[] DEFAULTCAPACITYEMPTYELEMENTDATA = {};
public ArrayList() {
    this.elementData = DEFAULTCAPACITYEMPTYELEMENTDATA;
}

当第一次调用 add(E e) 时,会触发扩容,创建一个默认容量为 10 的新数组,并将元素存入 size 指向的位置,随后 size 自增为1

3 ) 扩容机制

当数组已满(size == elementData.length)时,继续添加元素会触发扩容,流程如下:

  1. 计算新容量:newCapacity = oldCapacity + (oldCapacity >> 1),即扩容至原来的1.5倍。
  2. 使用 Arrays.copyOf 将原数组的元素拷贝到新数组中。
  3. 在 size 位置插入新元素,size 自增。

是

否

添加元素

数组容量足够?

直接赋值 elementData[size++] = e

计算新容量 1.5倍

Arrays.copyOf 复制到新数组

更新 elementData 引用

4 )查询与遍历

get(int index) 方法直接返回 elementData[index],前提是检查 index 是否小于 size,否则抛出异常。size() 方法返回 size 变量的值,因此普通for循环遍历时直接从0遍历到 size-1即可。

LinkedList基本使用

LinkedList 底层是双向链表,实现了List和Deque接口。它的特点是增删快、查询慢(与ArrayList相反)。由于实现了List接口,ArrayList 中使用的遍历方法在这里完全通用。

// MyLinkedListDemo3.java 
package com.wb.mylistdemo1;
 
import java.util.Iterator;
import java.util.LinkedList;
 
public class MyLinkedListDemo3 {
    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
 
        // 普通for遍历 
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
        System.out.println("-------------------------");
 
        // 迭代器遍历 
        Iterator<String> it = list.iterator();
        while (it.hasNext()) {
            String s = it.next();
            System.out.println(s);
        }
        System.out.println("--------------------------");
 
        // 增强for遍历 
        for (String s : list) {
            System.out.println(s);
        }
    }
}

LinkedList特有方法

LinkedList 除实现List接口的方法外,还提供了大量针对头尾操作的特有方法:

方法描述
addFirst(E e)在列表开头插入指定元素
addLast(E e)在列表末尾追加指定元素
getFirst()返回此列表的第一个元素
getLast()返回此列表的最后一个元素
removeFirst()删除并返回第一个元素
removeLast()删除并返回最后一个元素

示例代码:

// MyLinkedListDemo4.java 
package com.wb.mylistdemo1;
 
import java.util.LinkedList;
 
public class MyLinkedListDemo4 {
    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
 
        // 分别演示四组方法,取消注释即可运行 
        // method1(list);  // addFirst 
        // method2(list);  // addLast 
        // method3(list);  // getFirst & getLast 
        // method4(list);  // removeFirst & removeLast 
    }
 
    private static void method1(LinkedList<String> list) {
        // 在开头插入元素 
        list.addFirst("qqq");
        System.out.println(list); // [qqq, aaa, bbb, ccc]
    }
 
    private static void method2(LinkedList<String> list) {
        // 在末尾追加元素 
        list.addLast("www");
        System.out.println(list); // [aaa, bbb, ccc, www]
    }
 
    private static void method3(LinkedList<String> list) {
        // 获取第一个和最后一个元素 
        String first = list.getFirst();
        String last = list.getLast();
        System.out.println(first); // aaa 
        System.out.println(last);  // ccc 
    }
 
    private static void method4(LinkedList<String> list) {
        // 移除第一个和最后一个元素 
        String first = list.removeFirst();
        String last = list.removeLast();
        System.out.println(first); // aaa 
        System.out.println(last);  // ccc 
        System.out.println(list);  // [bbb]
    }
}

注意:getFirst / getLast 在集合为空时会抛出 NoSuchElementException;而 removeFirst / removeLast 同样如此。实际开发中可使用 pollFirst / pollLast 方法,它们在集合为空时返回 null 而非抛异常。

LinkedList源码解析

LinkedList 底层基于双向链表实现,由一个个 Node(节点)对象连接而成。每个节点包含三个部分:

  • item:存储本节点的数据
  • next:指向下一个节点的引用(地址值)
  • prev:指向前一个节点的引用(地址值)

Node

-E item

-Node next

-Node prev

LinkedList 本身维护了两个核心成员变量:

  • Node first:指向链表的头节点
  • Node last:指向链表的尾节点

1 ) 空参构造

// LinkedList 内部 
transient Node<E> first;
transient Node<E> last;
 
public LinkedList() {
    // 没有任何赋值,first 和 last 均为 null 
}

此时,链表为空,first == null 且 last == null

2 ) 添加元素(add方法)

调用 add(E e) 默认将元素追加到链表末尾,内部实际调用 linkLast(e)。下面通过添加 "aaa"、"bbb"、"ccc" 三个元素的过程来剖析源码。

添加第一个元素 “aaa”

  1. 当前 last == null,l = null
  2. 创建新节点 newNode = new Node<>(l, "aaa", null),此时 prev = null,item = "aaa",next = null,
    last = newNode,尾指针指向新节点
  3. 判断 l == null 成立,因此 first = newNode,头指针也指向该节点

此时链表状态:

first

aaa

last

A.prev

null

A.next

null

添加第二个元素 “bbb”

  1. 当前 last 指向 "aaa" 节点,l = "aaa" 节点
  2. 创建新节点 newNode = new Node<>(l, "bbb", null),prev 指向 "aaa" 节点
    last = newNode,尾指针后移
  3. l != null,执行 l.next = newNode,将原来尾节点的 next 域指向新节点

此时链表状态:

first

aaa

A.next

bbb

B.prev

last

B.next

null

添加第三个元素 “ccc”

  1. 当前 last 指向 "bbb" 节点,l = "bbb" 节点
  2. 创建新节点 newNode = new Node<>(l, "ccc", null)
  3. last = newNode
  4. l.next = newNode

最终链表结构:

first

aaa

A.next

bbb

B.prev

B.next

ccc

C.prev

last

C.next

null

核心源码片段(linkLast):

void linkLast(E e) {
    final Node<E> l = last;
    final Node<E> newNode = new Node<>(l, e, null);
    last = newNode;
    if (l == null)
        first = newNode;      // 首次添加,头结点也指向新节点 
    else 
        l.next = newNode;     // 将原尾节点的next指向新节点 
    size++;
}

3 ) 获取元素(get方法)

get(int index) 方法根据索引查找元素,内部调用 node(int index)。

node(int index) 方法利用二分思维,判断索引离头还是尾更近,以提升效率:

  • 如果 index < (size >> 1),从 first 开始向后遍历
  • 否则从 last 开始向前遍历
Node<E> node(int index) {
    if (index < (size >> 1)) {
        Node<E> x = first;
        for (int i = 0; i < index; i++)
            x = x.next;
        return x;
    } else {
        Node<E> x = last;
        for (int i = size - 1; i > index; i--)
            x = x.prev;
        return x;
    }
}

例如查询索引为2的元素(在长度为5的链表中),因为 2 < (5 >> 1) (即2.5)成立,会选择从 first 向后遍历3步。若查询索引为3,则从 last 向前遍历。

4 ) 删除元素(remove方法)

LinkedList 既支持按索引删除,也支持按元素删除,还提供了 removeFirst() / removeLast() 等特有方法。删除的核心操作是修改前后节点的指针,并将当前节点的 item、prev、next 置 null 以便GC回收。

以删除第一个元素为例:

  1. 获取 first 节点 f
  2. 获取下一个节点 next = f.next
  3. 将 first 指向 next
  4. 若 next == null,说明链表已空,last 也置 null;否则 next.prev = null
  5. size-- 并返回被删除的 item
private E unlinkFirst(Node<E> f) {
    final E element = f.item;
    final Node<E> next = f.next;
    f.item = null;
    f.next = null; // help GC 
    first = next;
    if (next == null)
        last = null;
    else 
        next.prev = null;
    size--;
    return element;
}

5 ) 对比 ArrayList

ArrayList:底层数组,查询快(O(1)),增删慢(需要移动元素)
LinkedList:底层双向链表,增删快(只需修改指针),查询慢(需要遍历)

开发者应根据实际场景选择合适的数据结构。

总结

至此,关于 Java 集合中 List 接口及其典型实现类的介绍已全部完成。

通过理解数据结构(数组、链表、栈、队列)以及阅读底层源码,能够更好地掌握集合的特性,为后续高级开发打下扎实的基础。

Java集合框架源码解析与实现 Java集合框架,作为Java的核心库之一,为数据结构的操作提供了一套丰富的接口和实现。它提供了一组表示数据的集合,例如列表、集合、映射等,以及一套统一的算法来操作这些集合。集合框架的目的是为了提供一种快速、高效的存储和检索数据的方式。 阅读详情

相关推荐

从原理到实践:详解双目散斑结构光的生成与优化

本文深入解析了双目散斑结构光的生成原理与优化实践,详细介绍了散斑结构光的抗干扰性、空间编码技术及其在三维视觉中的应用。通过对比不同生成方法和技术路线,提供了参数调优指南和工程实现细节,帮助开发者掌握高效、精准的散斑生成技术。

weixin_42521856的博客 596

Java集合框架解析:从基础到底层源码

单线程环境快速查询:ArrayList/HashMap频繁增删:LinkedList需要排序:TreeSet/TreeMap高并发场景读多写少:CopyOnWriteArrayList写多读少:ConcurrentHashMap严格一致性:Collections.synchronized系列函数式编程使用Stream API进行链式处理优先选择不可变集合(Guava/Java9+)彩蛋知识点。

Hello World!你好世界! 2866

Lenovo 拯救者15ISK硬件升级实战:从内存到固态硬盘的全面优化

本文详细介绍了为联想拯救者15ISK笔记本电脑进行硬件升级的完整实战指南。通过评估升级可行性,指导如何挑选兼容的内存条与NVMe固态硬盘,并提供详细的拆机安装步骤与系统安装避坑技巧。升级后,笔记本的开机速度、软件加载及多任务处理能力获得飞跃式提升,让老旧设备重获新生。

weixin_29310631的博客 557

Java基础-List常用集合源码解析

本文摘要: 本文对Java集合框架中的List接口及其常见实现类进行了源码分析。主要包括五个部分:1) List接口概述,介绍其核心方法;2) ArrayList源码解析,分析其数组实现、线程不安全特性、1.5倍扩容机制及深浅拷贝问题;3) LinkedList源码解析,探讨其双向链表结构、Deque接口实现及性能特点;4) Vector源码解析;5) CopyOnWriteArrayList源码解析。文章重点对比了ArrayList和LinkedList在数据结构、性能特点上的差异,并通过代码示例详细说明

m0_61345049的博客 831

从Excel到‘一张图’办案:手把手教你用AbutionGraph构建公安经侦知识图谱(含数据建模避坑指南)

本文详细介绍了如何利用AbutionGraph时序图数仓技术,将公安经侦领域的Excel、银行流水等碎片化数据转化为可交互的知识图谱。通过数据清洗、实体关系模型设计、时序数据处理等步骤,实现高效智能分析,提升办案效率。特别包含数据建模避坑指南和实战案例,助力公安金融案件侦破。

weixin_33702545的博客 343

Yolov8-pose关键点检测:loss优化 | LRM loss困难样本挖掘,提升难样本、遮挡物等检测精度

LRM loss应用到能够大幅提升pose遮挡物性能

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1716

Java集合面试题

Java集合面试题 Java 集合框架的基础接口有哪些? Collection ,为集合层级的根接口。一个集合代表一组对象,这些对象即为它的元素。Java 平台不提供这个接口任何直接的实现。 Set ,是一个不能包含重复元素的集合。这个接口对数学集合抽象进行建模,被用来代表集合,就如一副牌。 List ,是一个有序集合,可以包含重复元素。你可以通过它的索引来访问任何元素。List 更像长度动态...

木村的博客 2万+

南方cass9.1【Frame主框架程序没有加载】解决方法(附安装包)

南方cass9.1【Frame主框架程序没有加载】解决方法。

weixin_46066938的博客 3万+

Java 中 List 源码解析:深度剖析与实现

在 Java 集合框架中,List是一个有序的集合接口,表示一个元素序列,允许重复元素。与Set不同,List允许按照插入顺序访问元素,并提供了元素插入和删除的灵活操作。Java 中的List接口提供了多种实现方式,常见的有ArrayList和LinkedList。ArrayList:适合随机访问元素,性能较好,但在中间插入和删除时性能较差。LinkedList:适合频繁进行插入和删除操作,尤其是中间位置的插入和删除,但访问元素时性能较差。理解List。

q68686的博客 1421

网络工程师教程第6版(2024年最新版)

本书 根据《网络工程师考试大纲》(2024年审定通过)编写,对网络工程师岗位所要求的主要知 识及应用技术进行了阐述。本书主要内容包括数据通信、局域网、无线通信网、网络互连、网络安全、网络操作系统与应用服务器、组网技术、网络管理、网络规划和设计。本书是参加网络工程师考试的必备教材,也可作为网络工程从业人员学习网络技术的教材或日常工作的参考用书。王涛和严体华编写了第2章、第3章和第4章;网络工程师教程(第6版)由清华大学出版社出版,由工业和信息化部教育与考试中心组编,张永刚、王涛、高振江任主编,具体介绍如下。

鹿鸣天涯 6908

汽车电子 静态电流

**静态电流(Static Current 或 Quiescent Current, IQ)** 是指汽车在 **熄火 / 关机 / 睡眠模式** 下,电子控制单元(ECU)或电子元件仍然保持基本功能(RTC、存储保持、Wake-up 监测、CAN/LIN 监听等)所消耗的微弱电流。

天赐好车的博客 815

Java基础-List集合系列

全文使用JDK11 本篇目录 List接口的继承关系 ArrayList继承关系 ArrayList底层数据结构 LinkedList继承关系 LinkedList底层数据结构 Vector集合 可以看到有74个不同的类和接口实现了List这个接口,如果每一个都要学习的话,会很乏力。 更好的方法是学习我们常用的,以后有更多的时间再去慢慢拓展。 List接口的继承关系 由它的继承关系可以看到List接口继承至Collection接口,所以Collection中有的方法,Li.

二饭的博客 1412

Python爬虫-爬取猫眼演出数据

本文是该专栏的第53篇,后面会持续分享python爬虫干货知识。猫眼平台除了有影院信息之外,它还涵盖了演出信息,比如说“演唱会,音乐节,话剧音乐剧,脱口秀,音乐会,戏曲艺术,相声”等等各种演出相关信息。而本文,笔者将以猫眼平台为例,基于Python爬虫实现获取各种演出信息的数据。废话不多说,具体细节部分以及详细思路逻辑,笔者将在正文结合完整代码进行详细说明。(附带完整代码)

Python进阶专栏《爬虫实战进阶》,《Pyppeteer从入门到精通》原创作者 572

Java集合之List集合与核心源码解析

Java集合之List集合1、ArrayList、LinkedList、Vector异同点2、核心源码解析2.1、ArrayList核心源码解析2.1.1、ArrayList数据结构2.1.2、ArrayList的add(E e)方法2.1.3、ArrayList的get(int index)方法2.1.4、ArrayList的remove(int index)方法2.1.5、ArrayList的set(int index, E element)方法2.2、LinkedList核心源码解析2.2.1、数据结

dws789456123的博客 352

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Java集合List用法总结

转自:https://www.jianshu.com/p/25aa92f8d681 Java集合 作为一个Developer,Java集合类是我们在工作中运用最多的、最频繁的类。相比于数组(Array)来说,集合类的长度可变,更加适合于现代开发需求; Java集合就像一个容器,可以存储任何类型的数据,也可以结合泛型来存储具体的类型对象。在程序运行时,Java集合可以动态的进行扩展,随着元素的增加而扩大。在Java中,集合类通常存在于java.util包中。 Java集合主要由2大体系构成,分别是Co

别说话写代码的博客 3649

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Java集合源码解析之List

文章目录概述ListArrayList解析构造方法添加元素addadd(E e)add(int index, E element)remove⽅法细节须知VectorLinkedList解析addremoveget方法set方法List总结 概述 在日常开发工作中,使用集合是很普遍的,接下来就让我们了解一下Java中的集合元素吧,本篇主要讲解一些重要的基础点,有一些基础方法可能并未讲解到,本篇JDK源码是基于1.8版本。Java集合源码解析分为List、Map、Set三部分,可能后续会再做补充。 List

weixin_43863895的博客 484

Java中List集合与Set集合

给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保证HashSet集合中的对象唯一。创建Person类,在类中重写 hashCode 方法和 equals 方法return age;//重写hashCode方法//重写equals方法在main中调用,由于重写了 hashCode 和 equals 方法,所以相同类型元素将不会打印出//创建存储Person类的哈希表。

2401_84152126的博客 829

Java 集合源码详解

本篇不适合初学者,及使用方法,适合 面试者 观看借鉴; 本人在尚硅谷看的,整理的笔记。 不正确的地方,多多指教。 Java 集合源码详解 集合和数组: 数组声明了它容纳的元素的类型,而集合不声明存储Object类型 可以通过泛型进行规范! 数组是静态的,一个数组实例具有固定的大小,一旦创建了就无法改变容量了。 集合是可以动态扩展容量,可以根据需要动态改变大小,集合提供更多的成员方法,能满足更多的需求。 集合: 和数组一样Java中用来存储数据的作用,弥补了数组长度固定的缺点更灵活 Java 集合框架.

慈様 2931

Java之List集合底层解析

介绍了Java中数组的原理,ArrayList的构造函数讲解,ArrayList的add方法添加数据流程,以及ArrayList与LinkedList的对不,List与Set的对比,以及数组与List之间的相互转换,Arrays.asList会出现的一些问题

LycLhsYYY的博客 1194

(二十一)Java集合框架源码深度解析

Java集合框架是Java语言中最重要、最常用的API之一。通过深入理解其源码实现,我们可以:更高效地使用集合类根据场景选择最合适的实现避免常见的陷阱和性能问题编写更健壮、更高效的代码从设计角度看,集合框架体现了多种优秀的设计原则和模式:接口与实现分离算法与数据结构分离迭代器模式策略模式模板方法模式随着Java版本的演进,集合框架也在不断优化和改进,如Java 8引入的Stream API和Lambda表达式使集合操作更加简洁和强大。

MeyrlNotFound的博客 1134

一文了解 Java 集合框架:List、Set、Map 谁该选?

Java集合框架是开发中常用的工具,但容易误用。本文从底层实现、使用语义和性能差异三个维度全面解析了List、Set和Map。List如ArrayList和LinkedList适用于不同场景,Set如HashSet和TreeSet用于去重和排序,Map如HashMap和TreeMap用于键值对存储。文章还对比了不同集合的适用场景,指出了开发者常见的误区,并解析了ArrayList、HashSet和HashMap的核心源码。此外,提供了集合类线程安全改造方案,如使用Collections.synchroniz

小健学Java的博客 887

Java集合List接口详解——含源码分析

在Java编程中,可以使用数组来保存多个对象,但数组长度不可变化,一旦在初始化数组时指定了数组长度,这个数组长度就是不可变的。首先我们要明白要用普通for循环,就要有索引方法,来获取元素,而List继承Collection,多出的get方法,使得我们可以获取索引,继而使用普通for循环。为啥突然换成jdk17了?前几天电脑崩了,脑子一糊涂,c盘删了10个g的文件,被迫用笔记本来看源码了,hh。不难看出,初始数组为0,只有当你添加对象的时候,才重新赋值为新的数组,且初始赋值为长度为10的数组。

秋名山码民的技术小屋 8355

Java集合 List实现类 ArrayList<E> 源码浅析

Java集合 List实现类 ArrayList 实现浅析 #List 简述 List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于 Vector 类,除了此类是不同步的。) ##ArrayList 源码实现基于 jdk 1.8

程序猿-Jojo 3568

java集合之ArrayList源码解析(java8)

说明:确保set的位置小于当前数组的长度(size)并且大于0,获取指定位置(index)元素,然后放到oldValue存放,将需要设置的元素放到指定的位置(index)上,然后将原来位置上的元素oldValue返回给用户。Vector是线程安全的,但是性能不及ArrayList,它们俩的底层实现都是数组。接口中全都是抽象的方法,而抽象类中可以有抽象方法,还可以有具体的实现方法,正是利用了这一点,让AbstractList是实现接口中一些通用的方法,而具体的类还可以添加自己独特的方法。

2501_90392287的博客 975

【Java集合源码分析】关于Java集合你需要知道的是什么

前言 Java集合估计是我们开发过程中,用的最多的API了,它位于java.util包下,同时支持多线程的集合类位于java.util.concurrent包下。 我们都知道各种数据结构最底层的组成都是数组或者链表,其实各种集合类也是基于最基本的数据结构进行封装,便于各种场景直接使用。 我们可以把集合想象成一个容器,它可以存储各种对象,扩展和封装了数组和链表。 有了这些认识,是不是集合也变了...

wudingmei1023 1万+

数据结构与集合

写在前边:本文是个人学习笔记。(我是根据自己知识体系来做的,未必适合别人阅读) 本文整理自《码出高效:java开发手册》 目录 本文整理自《码出高效:java开发手册》 List集合 集合初始化 数组集合 集合与泛型 元素的比较: JDK中使用的排序方法TimSort hashCode 和equals fail-fast机制 Map类集合: 关于树: 平衡二...

Angus 4869
上一篇: Java基础快速入门:集合入门
下一篇: Java基础快速入门:泛型
Wang's Blog
博客等级 码龄12年 7434粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值