Java的LinkedList、HashSet与TreeSet

一、LinkedList

LinkedList是Java集合框架中的一个重要类,它实现了List接口。与ArrayList不同,

(1)LinkedList是基于双向链表的数据结构,因此它在进行插入、删除操作时通常比ArrayList更快,但在随机访问元素时可能会比较慢。

(2)LinkedList 不是线程安全的。如果需要在多线程环境中使用,可以使用 Collections.synchronizedList 方法来创建一个同步的列表。
添加元素

add(E e): 在链表末尾添加元素。

add(int index, E element): 在指定位置插入元素。

addFirst(E e): 在链表开头添加元素。

addLast(E e): 在链表末尾添加元素(与 add(E e) 等效)。
删除元素

remove(): 删除并返回链表的第一个元素。

remove(int index): 删除指定位置的元素。

remove(Object o): 删除链表中第一个出现的指定元素。

removeFirst(): 删除并返回链表的第一个元素。

removeLast(): 删除并返回链表的最后一个元素。
获取元素

get(int index): 获取指定位置的元素。

getFirst(): 获取链表的第一个元素。

getLast(): 获取链表的最后一个元素。
检查元素

contains(Object o): 检查链表中是否包含指定的元素。

indexOf(Object o): 返回链表中第一次出现的指定元素的索引。

lastIndexOf(Object o): 返回链表中最后一次出现的指定元素的索引。
其他操作

size(): 返回链表中元素的数量。

isEmpty(): 检查链表是否为空。

clear(): 移除链表中的所有元素。

poll(): 获取并移除链表的第一个元素,如果链表为空则返回 null。

peek(): 获取链表的第一个元素但不移除它,如果链表为空则返回 null。

使用上与ArrayList类似:

java 复制代码
import java.util.LinkedList;

public class LinkedListExample {
    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<>();

        // 添加元素
        list.add("Apple");
        list.addFirst("Banana");
        list.addLast("Cherry");

        // 获取元素
        System.out.println("First element: " + list.getFirst());
        System.out.println("Element at index 1: " + list.get(1));
        System.out.println("Last element: " + list.getLast());

        // 删除元素
        list.removeFirst();
        list.remove("Cherry");

        // 遍历链表
        for (String fruit : list) {
            System.out.println(fruit);
        }

        // 检查元素
        System.out.println("Contains 'Apple': " + list.contains("Apple"));

        // 获取链表大小
        System.out.println("Size of list: " + list.size());
    }
}

输出结果如下:

java 复制代码
First element: Banana
Element at index 1: Apple
Last element: Cherry
Apple
Size of list: 1
Contains 'Apple': true
Size of list: 0

补充ArrayList

(1)ArrayList 是基于动态数组的数据结构。当创建 ArrayList 实例时,它会在内部创建一个固定大小的数组。如果数组满了,ArrayList 会自动创建一个更大的数组,并将现有元素复制到新数组中。这种动态扩容机制使得 ArrayList 在添加和删除元素时(特别是在数组中间位置)可能需要移动大量的元素。

(2)ArrayList 和 LinkedList 都不是线程安全的。如果需要在多线程环境中使用,应该使用同步机制(如 Collections.synchronizedList)或选择线程安全的替代方案(如 CopyOnWriteArrayList 或 ConcurrentLinkedQueue)。

二、HashSet

(1)HashSet是Set接口的一个实现,其底层实际上使用了HashMap来存储元素。

(2)HashSet不是线程安全的,如果多个线程同时访问和修改同一个HashSet实例,可能会导致不确定的结果。

示例:使用HashSet去重

java 复制代码
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class HashSetExample {
    public static void main(String[] args) {
        List<String> listWithDuplicates = new ArrayList<>();
        listWithDuplicates.add("Apple");
        listWithDuplicates.add("Banana");
        listWithDuplicates.add("Apple"); // 重复项
        listWithDuplicates.add("Cherry");

        // 使用HashSet去除重复项
        Set<String> uniqueSet = new HashSet<>(listWithDuplicates);

        // 将去重后的结果转换回List(如果需要)
        List<String> uniqueList = new ArrayList<>(uniqueSet);

        // 输出结果
        System.out.println("Original list: " + listWithDuplicates);
        System.out.println("Unique list: " + uniqueList);
    }
}

补充HashMap

(1)HashMap是一种基于哈希表实现的Map接口的。HashMap的内部是一个数组加链表(或红黑树)的结构。数组中的每个位置称为一个桶(Bucket),每个桶中可能包含一个链表或红黑树,用来处理哈希冲突。

三、TreeSet

TreeSet 是 Java 集合框架中的一个类,它实现了 NavigableSet 接口,并且基于 TreeMap 实现。TreeSet 中的元素是唯一的,并且会根据元素的自然顺序(或者通过提供的比较器进行排序)进行排序。

相关推荐
龙虾PRO1 小时前
能源与股票量化核心差异,AI全链路落地实操手册
java·面试·职场和发展
Marst Code1 小时前
Python 3.9 已停止维护!从 3.9 到 3.14 全版本深度对比,生产环境该选哪个?
开发语言·python
llwszx1 小时前
【Java/Go后端手撸原生Agent(第九篇):Plan-and-Execute规划模式——从“走一步看一步“到“先谋后动“】
java·python·golang·agent开发·plan模式·规划执行模式
七牛云行业应用2 小时前
Ollama 本地部署 DeepSeek 完全指南:macOS / Windows / Linux 三端安装 + GPU 配置 + API 调用
linux·windows·macos
ZJH__GO2 小时前
网络编程v2--多客户端互通
java·运维·服务器·开发语言·计算机网络
霸道流氓气质2 小时前
SpringBoot中基于 AES-GCM + KMS 密钥管理的数据加解密 Starter 实践
java·数据库·spring boot
Code Man2 小时前
Windows 下使用 Appium
android·windows·appium
Gofarlic_OMS2 小时前
NX浮动许可调度黑名单机制,对比两款谁更合理
java·大数据·运维·开源·制造
万岳科技系统开发2 小时前
智慧医院小程序开发推动医疗服务流程全面线上化
大数据·开发语言·人工智能
一只小灿灿2 小时前
C++ 修饰符全面详解
开发语言·c++