【深入探究Java集合框架】从List到Map的完整指南

简介: 【深入探究Java集合框架】从List到Map的完整指南


🌟 Java集合框架

Java集合框架是Java编程语言提供的一组类和接口,用于表示集合,并提供了相关的操作和算法。在Java集合框架中,集合分为三种类型:ListSetMap。其中,List是有序的集合,允许重复元素;Set是无序且不允许重复元素的集合;而Map是一种映射关系,它将一个键与一个值相关联。这些集合提供了非常多的操作,比如添加、删除、查找、排序等。

🍊 Collection

Java集合框架中的根接口是Collection,它提供了基本的集合操作。在Collection接口中有两个子接口:ListSet

🎉 List

List接口是有序的集合,允许重复元素。List接口有三个主要的实现类:ArrayListVectorLinkedList。其中,ArrayList底层是一个数组,使用空间较少,线程不安全,因此性能较高。默认情况下,ArrayList的初始容量为10,当添加元素时,如果当前容量不足,则会进行扩容,扩容为原来的1.5倍。Vector是一个线程安全的List实现,它的底层也是一个数组,但是比ArrayList慢。LinkedList底层是双向链表,因此添加和删除元素的性能非常高,但是查找元素的性能较低。

示例代码如下:

import java.util.List;
import java.util.ArrayList;
import java.util.Vector;
import java.util.LinkedList;
public class ListExample {
    public static void main(String[] args) {
        // ArrayList示例
        List<String> arrayList = new ArrayList<>();
        arrayList.add("a");
        arrayList.add("b");
        arrayList.add("c");
        arrayList.add("a"); // 允许重复元素
        System.out.println("ArrayList示例:" + arrayList);
        // Vector示例
        List<String> vector = new Vector<>();
        vector.add("d");
        vector.add("e");
        vector.add("f");
        System.out.println("Vector示例:" + vector);
        // LinkedList示例
        List<String> linkedList = new LinkedList<>();
        linkedList.add("g");
        linkedList.add("h");
        linkedList.add("i");
        linkedList.add("g"); // 允许重复元素
        System.out.println("LinkedList示例:" + linkedList);
    }
}

🎉 Set

Set接口是无序并且不允许重复元素的集合。Set接口有三个主要的实现类:HashSetLinkedHashSetTreeSet。其中,HashSet底层实现是基于HashMap,使用哈希表来存储元素。当向HashSet中添加元素时,会根据元素的hashCode值来计算存储位置,如果该位置已经有元素,则将其链接在链表的末尾;如果链表长度达到8,则将链表转换为红黑树,以提高查找效率。LinkedHashSetHashSet的子类,底层实现也是基于HashMap,但是额外维护了一个链表,用于维护元素的插入顺序。TreeSet底层使用红黑树来存储元素,因此可以保证元素的有序性,并且提供了一些基于排序的操作。

示例代码如下:

import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.TreeSet;
public class SetExample {
    public static void main(String[] args) {
        // 创建一个HashSet集合
        HashSet<String> hashSet = new HashSet<>();
        // 添加元素到HashSet中
        hashSet.add("apple");
        hashSet.add("banana");
        hashSet.add("orange");
        hashSet.add("watermelon");
        hashSet.add("grape");
        hashSet.add("pineapple");
        // 遍历HashSet集合中所有元素
        for (String fruit : hashSet) {
            System.out.println(fruit);
        }
        // 创建一个LinkedHashSet集合
        LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>();
        // 添加元素到LinkedHashSet中
        linkedHashSet.add("apple");
        linkedHashSet.add("banana");
        linkedHashSet.add("orange");
        linkedHashSet.add("watermelon");
        linkedHashSet.add("grape");
        linkedHashSet.add("pineapple");
        // 遍历LinkedHashSet集合中所有元素
        for (String fruit : linkedHashSet) {
            System.out.println(fruit);
        }
        // 创建一个TreeSet集合
        TreeSet<String> treeSet = new TreeSet<>();
        // 添加元素到TreeSet中
        treeSet.add("apple");
        treeSet.add("banana");
        treeSet.add("orange");
        treeSet.add("watermelon");
        treeSet.add("grape");
        treeSet.add("pineapple");
        // 遍历TreeSet集合中所有元素
        for (String fruit : treeSet) {
            System.out.println(fruit);
        }
    }
}

🎉 Map

Map是一种映射关系,它将一个键与一个值相关联。Map接口中的键是无序、不可重复的,值是无序但可重复的。Map接口有四个主要的实现类:HashMapLinkedHashMapTreeMapHashTable。其中,HashMap底层实现是基于哈希表,它使用键的hashCode值来计算存储位置,并使用链表(JDK1.8之后,链表长度达到8时会自动转化为红黑树)来解决哈希冲突。LinkedHashMapHashMap的子类,它维护了一个双向链表来维护元素的插入顺序。TreeMap底层使用红黑树来存储元素,根据键的自然排序或指定的比较器来排序键。HashTable是一个线程安全的Map实现,它的底层实现与HashMap相似,但不允许键或值为空,且操作都是同步的。

示例代码如下:

import java.util.*;
public class MapExamples {
    public static void main(String[] args) {
        // 创建HashMap示例
        Map<String, Integer> hashMap = new HashMap<>();
        hashMap.put("Alice", 25);
        hashMap.put("Bob", 30);
        hashMap.put("Charlie", 35);
        System.out.println("HashMap: " + hashMap);
        // 创建LinkedHashMap示例
        Map<String, Integer> linkedHashMap = new LinkedHashMap<>();
        linkedHashMap.put("Alice", 25);
        linkedHashMap.put("Bob", 30);
        linkedHashMap.put("Charlie", 35);
        System.out.println("LinkedHashMap: " + linkedHashMap);
        // 创建TreeMap示例
        Map<String, Integer> treeMap = new TreeMap<>();
        treeMap.put("Alice", 25);
        treeMap.put("Bob", 30);
        treeMap.put("Charlie", 35);
        System.out.println("TreeMap: " + treeMap);
        // 创建HashTable示例
        Hashtable<String, Integer> hashTable = new Hashtable<>();
        hashTable.put("Alice", 25);
        hashTable.put("Bob", 30);
        hashTable.put("Charlie", 35);
        System.out.println("HashTable: " + hashTable);
    }
}

🍊 集合的选择

在Java集合框架中,集合的选择应该根据集合的特点和使用场景进行选择。例如,如果需要有序并且允许重复元素的集合,则应该选择List接口;如果需要无序并且不允许重复元素的集合,则应该选择Set接口;如果需要维护映射关系,则应该选择Map接口。但是,具体的实现类的选择应该根据集合的性能需求和使用场景进行选择。例如,如果需要高效的随机访问和修改元素,则应该选择ArrayList;如果需要高效的添加和删除元素,则应该选择LinkedList。如果需要维护元素的插入顺序,则应该选择LinkedHashSetLinkedHashMap。如果需要元素的自然排序或者指定的比较器进行排序,则应该选择TreeSetTreeMap。如果需要线程安全,则应该选择VectorHashTable

Java代码示例:

🎉 1. 有序并允许重复元素的集合 List

List<String> list=new ArrayList<String>();
list.add("Hello");
list.add("World");
list.add("Java");
System.out.println(list);

🎉 2. 无序并且不允许重复元素的集合 Set

Set<String> set=new HashSet<String>();
set.add("Hello");
set.add("World");
set.add("Java");
System.out.println(set);

🎉 3. 维护映射关系的集合 Map

Map<String,Integer> map=new HashMap<String,Integer>();
map.put("Hello",1);
map.put("World",2);
map.put("Java",3);
System.out.println(map);

🎉 4. 高效的随机访问和修改元素 ArrayList

List<String> list=new ArrayList<String>();
list.add("Hello");
list.add("World");
list.add("Java");
System.out.println(list.get(1));
list.set(1,"Python");
System.out.println(list);

🎉 5. 高效的添加和删除元素 LinkedList

List<String> list=new LinkedList<String>();
list.add("Hello");
list.add("World");
list.add("Java");
System.out.println(list);
list.addFirst("Python");
list.removeLast();
System.out.println(list);

🎉 6. 维护元素的插入顺序 LinkedHashSet

Set<String> set=new LinkedHashSet<String>();
set.add("Hello");
set.add("World");
set.add("Java");
System.out.println(set);

🎉 7. 元素的自然排序或者指定的比较器进行排序 TreeSet

Set<String> set=new TreeSet<String>();
set.add("Hello");
set.add("World");
set.add("Java");
System.out.println(set);

🎉 8. 线程安全 Vector

List<String> list=new Vector<String>();
list.add("Hello");
list.add("World");
list.add("Java");
System.out.println(list);

🎉 9. 线程安全 HashTable

Map<String,Integer> map=new Hashtable<String,Integer>();
map.put("Hello",1);
map.put("World",2);
map.put("Java",3);
System.out.println(map);


相关文章
|
1月前
|
人工智能 Java 开发者
阿里出手!Java 开发者狂喜!开源 AI Agent 框架 JManus 来了,初次见面就心动~
JManus是阿里开源的Java版OpenManus,基于Spring AI Alibaba框架,助力Java开发者便捷应用AI技术。支持多Agent框架、网页配置、MCP协议及PLAN-ACT模式,可集成多模型,适配阿里云百炼平台与本地ollama。提供Docker与源码部署方式,具备无限上下文处理能力,适用于复杂AI场景。当前仍在完善模型配置等功能,欢迎参与开源共建。
842 58
阿里出手!Java 开发者狂喜!开源 AI Agent 框架 JManus 来了,初次见面就心动~
|
10天前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
62 8
|
10天前
|
存储 算法 安全
Java集合框架:理解类型多样性与限制
总之,在 Java 题材中正确地应对多样化与约束条件要求开发人员深入理解面向对象原则、范式编程思想以及JVM工作机理等核心知识点。通过精心设计与周密规划能够有效地利用 Java 高级特征打造出既健壮又灵活易维护系统软件产品。
38 7
|
8天前
|
存储 Java 索引
(Python基础)新时代语言!一起学习Python吧!(二):字符编码由来;Python字符串、字符串格式化;list集合和tuple元组区别
字符编码 我们要清楚,计算机最开始的表达都是由二进制而来 我们要想通过二进制来表示我们熟知的字符看看以下的变化 例如: 1 的二进制编码为 0000 0001 我们通过A这个字符,让其在计算机内部存储(现如今,A 字符在地址通常表示为65) 现在拿A举例: 在计算机内部 A字符,它本身表示为 65这个数,在计算机底层会转为二进制码 也意味着A字符在底层表示为 1000001 通过这样的字符表示进行转换,逐步发展为拥有127个字符的编码存储到计算机中,这个编码表也被称为ASCII编码。 但随时代变迁,ASCII编码逐渐暴露短板,全球有上百种语言,光是ASCII编码并不能够满足需求
66 3
|
2月前
|
存储 缓存 安全
Java集合框架(二):Set接口与哈希表原理
本文深入解析Java中Set集合的工作原理及其实现机制,涵盖HashSet、LinkedHashSet和TreeSet三大实现类。从Set接口的特性出发,对比List理解去重机制,并详解哈希表原理、hashCode与equals方法的作用。进一步剖析HashSet的底层HashMap实现、LinkedHashSet的双向链表维护顺序特性,以及TreeSet基于红黑树的排序功能。文章还包含性能对比、自定义对象去重、集合运算实战和线程安全方案,帮助读者全面掌握Set的应用与选择策略。
176 23
|
1月前
|
SQL Java 数据库连接
区分iBatis与MyBatis:两个Java数据库框架的比较
总结起来:虽然从技术角度看,iBATIS已经停止更新但仍然可用;然而考虑到长期项目健康度及未来可能需求变化情况下MYBATISS无疑会是一个更佳选择因其具备良好生命周期管理机制同时也因为社区力量背书确保问题修复新特征添加速度快捷有效.
110 12
|
2月前
|
存储 缓存 安全
Java集合框架(三):Map体系与ConcurrentHashMap
本文深入解析Java中Map接口体系及其实现类,包括HashMap、ConcurrentHashMap等的工作原理与线程安全机制。内容涵盖哈希冲突解决、扩容策略、并发优化,以及不同Map实现的适用场景,助你掌握高并发编程核心技巧。
|
2月前
|
安全 Java 开发者
Java集合框架:详解Deque接口的栈操作方法全集
理解和掌握这些方法对于实现像浏览器后退功能这样的栈操作来说至关重要,它们能够帮助开发者编写既高效又稳定的应用程序。此外,在多线程环境中想保证线程安全,可以考虑使用ConcurrentLinkedDeque,它是Deque的线程安全版本,尽管它并未直接实现栈操作的方法,但是Deque的接口方法可以相对应地使用。
147 12
|
2月前
|
存储 安全 Java
Java集合框架(一):List接口及其实现类剖析
本文深入解析Java中List集合的实现原理,涵盖ArrayList的动态数组机制、LinkedList的链表结构、Vector与Stack的线程安全性及其不推荐使用的原因,对比了不同实现的性能与适用场景,帮助开发者根据实际需求选择合适的List实现。
|
2月前
|
Cloud Native Java API
Java Spring框架技术栈选和最新版本及发展史详解(截至2025年8月)-优雅草卓伊凡
Java Spring框架技术栈选和最新版本及发展史详解(截至2025年8月)-优雅草卓伊凡
374 0