java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java list map set queue

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

作者:一成在成长

Java 集合框架是Java编程中最基础、最常用的部分之一,它为我们提供了一整套标准化的数据结构和算法实现,包括 List、Set、Queue、Map 等,用于高效地存储、访问和操作对象集合,本文介绍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");
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");

特征:

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

import java.util.Arrays;
import java.util.LinkedList;
public class Main {
    public static void main(String[] args) {
        // 初始化链表
        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(历史遗留)

Set:无序且元素唯一

HashSet ( 基于 HashMap)

HashSet<String> set = new HashSet<>();
set.add("一");
set.add("二");
set.add("三");

适用于 去重、快速查找

import java.util.Arrays;
import java.util.HashSet;
public class Main {
    public static void main(String[] 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("Element 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.");
        } 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("三");

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

TreeSet ( 有序去重集合)

TreeSet<String> set = new TreeSet<>();
set.add("一");
set.add("二");
set.add("三");

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

Queue:队列

ArrayDeque ( 高效双端队列)

ArrayDeque<String> deque = new ArrayDeque<>();
deque.add("一");
deque.add("二");
deque.add("三");

LinkedList (可作队列使用)

LinkedList<String> queue = new LinkedList<>();
queue.offer("一成");
queue.poll();

PriorityQueue — 优先级队列

PriorityQueue<Student> queue = new PriorityQueue<>(new StudentComparator());

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

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");
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");

TreeMap ( 红黑树实现)

TreeMap<String, String> treeMap = new TreeMap<>();
treeMap.put("a", "apple");
treeMap.put("b", "banana");
treeMap.put("c", "cat");

适用于 需要有序 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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文