开发者

Java集合(含List、Map、Set和Queue)超详细讲解

目录
  • Java 集合框架全解析
    • 集合框架的整体结构
    • List:有序可重复的集合
      • ArrayList ( 动态数组)
      • LinkedList ( 双向链表)
      • Vector & Stack(历史遗留)
    • Set:无序且元素唯一
      • HashSet ( 基于 HashMap)
      • LinkedHashSet (有序 HashSet)
      • TreeSet ( 有序去重集合)
    • Queue:队列
      • ArrayDeque ( 高效双端队列)
      • LinkedList (可作队列使用)
      • PriorityQueue — 优先级队列
    • Map:键值对集合
      • HashMap (哈希表实现)
      • LinkedHashMap (有序 HashMap)
      • TreeMap ( 红黑树实现)

Java集合(含List、Map、Set和Queue)超详细讲解

Java 集合框架全解析

Java 集合框架是 Java 编程中最基础、最常用的部分之一。它为我们提供了一整套标准化的数据结构和算法实现,包括 List、Set、Queue、Map 等,用于高效地存储、访问和操作对象集合。

集合框架的整体结构

Java 集合大体分为两条主线:

Collection(单值集合)
│
├── List(有序,可重复)
│     ├── ArrayList
│     ├── LinkedList
│     └── Vector / Stack
│
├── Set(无序,不可重复)
│     ├── HashSet
│     ├── LinkedHashSet
│     └── TreeSet
│
└── Queue(队列)
      ├── ArrayDeque
      ├── LinkedList
      └── PriorityQueue
Map(键值对集合)
├── HashMap
├── LinkedHashMap
└── TreeMap

List:有序可重复的集合

ArrayList ( 动态数组)

ArrayList<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
  • 底层是 动态数组
  • 支持随机访问(时间复杂度 O(1));
  • 中间插入、删除代价高(涉及数组移动);
  • 自动扩容(通常 1.5 倍)。
import java.util.ArrayList;
import java.util.Collections;
public class Main {
    public static void main(String[] args) {
        int n = 10;
        // 初始化 ArrayList,大小为 10,元素值都为 0
        ArrayList<Integer> nums = new ArrayList<>(Collections.nCopies(n, 0));
        // 输出:false
        System.out.println(nums.isEmpty());
        // 输出:10
        System.out.println(nums.size());
        // 在数组尾部插入一个元素 20
        nums.add(20);
        // 输出:11
        System.out.println(nums.size());
        // 得到数组最后一个元素
        // 输出:20
        System.out.println(nums.get(nums.size() - 1));
        // 删除数组的最后一个元素
        nums.remove(nums.size() - 1);
        // 输出:10
        System.out.println(nums.size());
        // 可以通过索引直接取值或修改
        nums.set(0, 11);
        // 输出:11
        System.out.println(nums.get(0));
        // 在索引 3 处插入一个元素 99
        nums.add(3, 99);
        // 删除索引 2 处的元素
        nums.remove(2);
        // 交换 nums[0] 和 nums[1]
        Collections.swap(nums, 0, 1);
        // 遍历数组
        // 输出:0 11 99 0 0 0 0 0 0 0
        for(int num : nums) {
            System.out.print(num + " ");
        }
        System.out.println();
    }
}

适用于 查找频繁、插入较少 的场景。

LinkedList ( 双向链表)

LinkedList<String> list = new LinkedList<>();
list.add("1");
list.add("2");
list.add("3");

特征:

  • 底层是 双向链表
  • 不支持随机访问(时间复杂度 O(n));
  • 任意位置插入、删除高效;
  • 每个节点多存前后指针,内存开销更大。

适用于 插入、删除频繁 的场景。

import java.util.Arrays;
import java.util.LinkedList;
public class Main {
    public static void main(String[] javascriptargs) {
        // 初始化链表
        LinkedList<Integer> lst = new LinkedList<>(Arrays.asList(1, 2, 3, 4, 5));
        // 检查链表是否为空,输出:false
        System.out.println(lst.isEmpty());
        // 获取链表的大小,输出:5
        System.out.println(lst.size());
        // 在链表头部插入元素 0
        lst.addFirst(0);
        // 在链表尾部插入元素 6
        lst.addLast(6);
        // 获取链表头部和尾部元素,输出:0 6
        System.out.println(lst.getFirst() + " " + lst.getLast());
        // 删除链表头部元素
        lst.removeFirst();
        // 删除链表尾部元素
        lst.removeLast();
        // 在链表中插入元素
        // 移动到第三个位置
        lst.add(2, 99);
        // 删除链表中某个元素
        lst.remove(1);
        // 遍历链表
        // 输出:1 99 3 4 5
        for(int val : lst) {
            System.out.print(val + " ");
        }
        System.out.println();
    }
}

Vector & Stack(历史遗留)

  • Vector 是线程安全的 ArrayList
  • 每个方法都加了 synchronized,性能较低;
  • 已被 ArrayList 替代;
  • Stack 继承自 Vector,实现 LIFO(后进先出) 栈结构;
  • 推荐使用 ArrayDeque 替代。

Set:无序且元素唯一

HashSet ( 基于 HashMap)

HashSet<String> set = new HashSet<>();
set.add("一");
set.add("二");
set.add("三");
  • 底层由 HashMap 实现;
  • 元素作为 key,value 为固定对象;
  • 自动去重;
  • 不保证顺序。

适用于 去重、快速查找

import java.util.Arrays;
import java.util.HashSet;
public class Main {
    public static void main(String[python] args) {
        // 初始化哈希集合
        HashSet<Integer> hashset = new HashSet<>(Arrays.asList(1, 2, 3, 4));
        // 检查哈希集合是否为空,输出:false
        System.out.println(hashset.isEmpty());
        // 获取哈希集合的大小,输出:4
        System.out.println(hashset.size());
        // 查找指定元素是否存在
        // 输出:Element 3 found.
        if(hashset.contains(3)) {
            System.out.println("Elemandroident 3 found.");
        } else {
            System.out.println("Element 3 not found.");
        }
        // 插入一个新的元素
        hashset.add(5);
        // 删除一个元素
        hashset.remove(2);
        // 输出:Element 2 not found.
        if(hashset.contains(2)) {
            System.out.println("Element 2 found.");
       php } else {
            System.out.println("Element 2 not found.");
        }
        // 遍历哈希集合
        // 输出(顺序可能不同):
        // 1
        // 3
        // 4
        // 5
        for(int element : hashset) {
            System.out.println(element);
        }
    }
}

LinkedHashSet (有序 HashSet)

LinkedHashSet<String> set = new LinkedHashSet<>();
set.add("一");
set.add("二");
set.add("三");
  • 继承 HashSet
  • 底层由 LinkedHashMap 实现;
  • 保持插入顺序
  • 查找性能与 HashSet 相近。

适用于 既想去重又保留插入顺序 的场景。

TreeSet ( 有序去重集合)

TreeSet<String> set = new TreeSet<>();
set.add("一");
set.add("二");
set.add("三");
  • 基于 红黑树 实现;
  • 元素自动排序;
  • 不允许 null
  • 可自定义排序规则(Comparator)。

适用于 需要自动排序 的场景。

Queue:队列

ArrayDeque ( 高效双端队列)

ArrayDeque<String> deque = new ArrayDeque<>();
deque.add("一");
deque.add("二");
deque.add("三");
  • 基于循环数组;
  • 可在两端插入/删除;
  • 性能优于 LinkedList
  • 替代 StackQueue

LinkedList (可作队列使用)

LinkedList<String> queue = new LinkedList<>();
queue.offer("一成");
queue.poll();
  • 同时实现了 ListDeque
  • 适合频繁插入删除;
  • 支持队首、队尾操作;
  • 内存占python用高于 ArrayDeque

PriorityQueue — 优先级队列

PriorityQueue<Student> queue = new PriorityQueue<>(new StudentComparator());
  • 底层是 堆结构
  • 出队顺序由优先级决定;
  • 元素需实现 Comparable 或传入 Comparator

适用于 任务调度、最小/最大堆 场景。

import java.util.Queue;
import java.util.LinkedList;
public class Main {
    public static void main(String[] args) {
        // 初始化一个空的整型队列 q
        Queue<Integer> q = new LinkedList<>();
        // 在队尾添加元素
        q.offer(10);
        q.offer(20);
        q.offer(30);
        // 检查队列是否为空,输出:false
        System.out.println(q.isEmpty());
        // 获取队列的大小,输出:3
        System.out.println(q.size());
        // 获取队列的队头元素
        // 输出:10
        System.out.println(q.peek());
        // 删除队头元素
        q.poll();
        // 输出新的队头元素:20
        System.out.println(q.peek());
    }
}

Map:键值对集合

HashMap (哈希表实现)

HashMap<String, String> map = new HashMap<>();
map.put("一成", "yicheng");
map.put("在成长", "zaichengzhang");
  • 键唯一,值可重复;
  • 查找/插入效率高;
  • 默认容量 16,负载因子 0.75;
  • 可存 null 键与 null 值;
  • 无序。
import java.util.HashMap;
import java.util.Map;
public class Main {
    public static void main(String[] args) {
        // 初始化哈希表
        HashMap<Integer, String> hashmap = new HashMap<>();
        hashmap.put(1, "one");
        hashmap.put(2, "two");
        hashmap.put(3, "three");
        // 检查哈希表是否为空,输出:false
        System.out.println(hashmap.isEmpty());
        // 获取哈希表的大小,输出:3
        System.out.println(hashmap.size());
        // 查找指定键值是否存在
        // 输出:Key 2 -> two
        if(hashmap.containsKey(2)) {
            System.out.println("Key 2 -> " + hashmap.get(2));
        } else {
            System.out.println("Key 2 not found.");
        }
        // 获取指定键对应的值,若不存在会返回 null
        // 输出:null
        System.out.println(hashmap.get(4));
        // 获取指定键对应的值,若不存在则返回默认值
        // 输出:defaultVal
        System.out.println(hashmap.getOrDefault(4, "defaultVal"));
        // 插入一个新的键值对
        hashmap.put(4, "four");
        // 获取新插入的值,输出:four
        System.out.println(hashmap.get(4));
        // 删除键值对
        hashmap.remove(3);
        // 检查删除后键 3 是否存在
        // 输出:Key 3 not found.
        if(hashmap.containsKey(3)) {
            System.out.println("Key 3 -> " + hashmap.get(3));
        } else {
            System.out.println("Key 3 not found.");
        }
        // 遍历哈希表
        // 输出(顺序可能不同):
        // 1 -> one
        // 2 -> two
        // 4 -> four
        for(Map.Entry<Integer, String> pair : hashmap.entrySet()) {
            System.out.println(pair.getKey() + " -> " + pair.getValue());
        }
    }
}

LinkedHashMap (有序 HashMap)

LinkedHashMap<String, String> linkedMap = new LinkedHashMap<>();
linkedMap.put("一成", "yicheng");
linkedMap.put("在成长", "zaichengzhang");
  • 保留插入顺序;
  • 可设置访问顺序;
  • 常用于实现 LRU 缓存

TreeMap ( 红黑树实现)

TreeMap<String, String> treeMap = new TreeMap<>();
treeMap.put("a", "apple");
treeMap.put("b", "banana");
treeMap.put("c", "cat");
  • 键有序;
  • 基于红黑树;
  • 查找、插入、删除为 O(log n)。

适用于 需要有序 Map 的场景。

需求推荐集合说明
有序且可重复ArrayList动态数组,随机访问快
插入删除多LinkedList链表结构,插入删除快
去重但无序HashSet由 HashMap 实现
去重且有序LinkedHashSet保留插入顺序
自动排序TreeSet / TreeMap基于红黑树
双端队列ArrayDeque替代 Stack/Queue
按优先级取出PriorityQueue堆结构
键值映射HashMap最常用的 Map
有序 MapLinkedHashMap / TreeMap插入或自然顺序
Java 集合框架
│
├── Collection
│   ├── List → ArrayList / LinkedList / Vector / Stack
│   ├── Set → HashSet / LinkedHashSet / TreeSet
│   └── Queue → ArrayDeque / LinkedList / PriorityQueue
│
└── Map
    ├── HashMap
    ├── LinkedHashMap
    └── TreeMap

到此这篇关于Java集合(含List、Map、Set和Queue)超详细讲解的文章就介绍到这了,更多相关java list map set queue内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新开发

开发排行榜