Java 集合:单列集合和双列集合的深度剖析

news/2025/2/24 2:03:43

引言

        在 Java 编程中,集合是一个非常重要的概念。它就像是一个容器,能够存储多个数据元素,帮助我们更方便地管理和操作数据。Java 集合框架主要分为单列集合和双列集合两大类,它们各自有着独特的特点和适用场景。接下来,让我们深入探究这两种集合

单列集合

单列集合就像是一列整齐排列的数据队伍,每个元素都是独立的个体,按照一定的规则存储和组织。在 Java 中,单列集合的根接口是 java.util.Collection,它派生了多个子接口和实现类。

1. List 接口

List 接口的特点是元素有序且可重复。这意味着我们可以通过索引来访问集合中的元素,就像在书架上按照编号查找书籍一样。常见的 List 实现类有 ArrayList 和 LinkedList

ArrayList

ArrayList 基于数组实现,它在内存中是连续存储的。这使得它在随机访问元素时非常高效,就像在一本装订好的书中快速翻到指定页码一样。以下是一个简单的示例:

java">import java.util.ArrayList;
import java.util.List;

public class ArrayListExample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("apple");
        list.add("banana");
        list.add("cherry");
        System.out.println(list.get(1)); // 输出: banana
    }
}

不过,ArrayList 在插入和删除元素时可能会比较低效,因为需要移动后续的元素。

LinkedList

LinkedList 基于链表实现,元素之间通过引用相互连接。这使得它在插入和删除元素时非常高效,就像在一列火车中添加或移除车厢一样。但随机访问元素时效率较低,因为需要从头开始遍历链表。示例如下:

java">import java.util.LinkedList;
import java.util.List;

public class LinkedListExample {
    public static void main(String[] args) {
        List<String> list = new LinkedList<>();
        list.add("apple");
        list.add("banana");
        list.add("cherry");
        list.add(1, "date");
        System.out.println(list); // 输出: [apple, date, banana, cherry]
    }
}

2. Set 接口

Set 接口的特点是元素无序且不可重复。这就好比一个装满不同颜色气球的袋子,每个气球都是独一无二的,并且没有固定的排列顺序。常见的 Set 实现类有 HashSet 和 TreeSet

HashSet

HashSet 基于哈希表实现,它通过哈希值来存储和查找元素。这使得它在添加、删除和查找元素时具有较高的效率。示例如下:

java">import java.util.HashSet;
import java.util.Set;

public class HashSetExample {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("apple");
        set.add("banana");
        set.add("apple"); // 重复元素,不会被添加
        System.out.println(set); // 输出: [apple, banana]
    }
}
TreeSet

TreeSet 基于红黑树实现,它可以对元素进行排序。这就像一个按照字母顺序排列的字典,方便我们查找和比较元素。示例如下:

java">import java.util.TreeSet;
import java.util.Set;

public class TreeSetExample {
    public static void main(String[] args) {
        Set<Integer> set = new TreeSet<>();
        set.add(3);
        set.add(1);
        set.add(2);
        System.out.println(set); // 输出: [1, 2, 3]
    }
}

双列集合

双列集合就像是一个表格,每一行都包含两个部分:键(Key)和值(Value)。键是唯一的,就像表格的索引,通过键可以快速找到对应的值。在 Java 中,双列集合的根接口是 java.util.Map

1. HashMap

HashMap 基于哈希表实现,它通过键的哈希值来存储和查找元素。这使得它在添加、删除和查找元素时具有较高的效率。示例如下:

java">import java.util.HashMap;
import java.util.Map;

public class HashMapExample {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("apple", 1);
        map.put("banana", 2);
        map.put("cherry", 3);
        System.out.println(map.get("banana")); // 输出: 2
    }
}

需要注意的是,HashMap 不保证元素的顺序。

2. TreeMap

TreeMap 基于红黑树实现,它可以根据键的自然顺序或指定的比较器对元素进行排序。这就像一个按照字母顺序排列的电话簿,方便我们查找和比较元素。示例如下:

java">import java.util.TreeMap;
import java.util.Map;

public class TreeMapExample {
    public static void main(String[] args) {
        Map<String, Integer> map = new TreeMap<>();
        map.put("banana", 2);
        map.put("apple", 1);
        map.put("cherry", 3);
        System.out.println(map); // 输出: {apple=1, banana=2, cherry=3}
    }
}

3. LinkedHashMap

LinkedHashMap 是 HashMap 的子类,它不仅具有 HashMap 的高效性,还能保持元素的插入顺序。示例如下:

java">import java.util.LinkedHashMap;
import java.util.Map;

public class LinkedHashMapExample {
    public static void main(String[] args) {
        Map<String, Integer> map = new LinkedHashMap<>();
        map.put("banana", 2);
        map.put("apple", 1);
        map.put("cherry", 3);
        System.out.println(map); // 输出: {banana=2, apple=1, cherry=3}
    }
}

http://www.niftyadmin.cn/n/5863925.html

相关文章

ROS2学习

前言 本篇文章属于ROS2humble的学习笔记&#xff0c;来源于B站鱼香ROSup主。下面是这位up主的视频链接。本文为个人学习笔记&#xff0c;只能做参考&#xff0c;细节方面建议观看视频&#xff0c;肯定受益匪浅。 《ROS 2机器人开发从入门到实践》课程介绍_哔哩哔哩_bilibili …

云手机如何进行经纬度修改

云手机如何进行经纬度修改 云手机修改经纬度的方法因不同服务商和操作方式有所差异&#xff0c;以下是综合多个来源的常用方法及注意事项&#xff1a; 通过ADB命令注入GPS数据&#xff08;适用于技术用户&#xff09; 1.连接云手机 使用ADB工具连接云手机服务器&#xff0c;…

Android SoundTrigger架构学习

本文将个人针对Android SoundTrigger的学习做了简单总结&#xff0c;以方便后续查询和学习。 一、架构解析 1、Android SoundTrigger架构如下&#xff08;简图&#xff09; 1.1、简单介绍 1&#xff09;SoundTriggerHelper SoundTriggerHelper是一个应用辅助工具类&#xf…

MySQL后端返回给前端的时间变了(时区问题)

问题&#xff1a;MySQL里的时间例如为2025-01-10 21:19:30&#xff0c;但是返回到前端就变成了2025-01-10 13:19:30&#xff0c;会出现小时不一样或日期变成隔日的问题 一般来说设计字段时会使用datetime字段类型&#xff0c;这是一种用于时间的字段类型&#xff0c;而这个类型…

安卓系统远程控制电脑方法,手机远控教程,ToDesk工具

不知道大家有没有觉得手机、平板虽然很好用&#xff0c;却也仍存在有很多替代不了电脑的地方。就比如说撰写文档、做数据报表啥的就不如PC端操作般方便&#xff0c;就跟别说PS修图、AE视频剪辑等需高性能设备来带动才易用的了。 好在也是有对策可解决&#xff0c;装个ToDesk远程…

【人工智能】用Python迈向轻量化深度学习——模型压缩与量化实战指南

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着移动端与嵌入式设备对深度学习推理需求的不断提升,模型的体积和推理效率成为关注重点。本文系统介绍了模型压缩与量化技术,详细阐述了…

Linux内核,slub分配流程

我们根据上面的流程图&#xff0c;依次看下slub是如何分配的 首先从kmem_cache_cpu中分配&#xff0c;如果没有则从kmem_cache_cpu的partial链表分配&#xff0c;如果还没有则从kmem_cache_node中分配&#xff0c;如果kmem_cache_node中也没有&#xff0c;则需要向伙伴系统申请…

使用pyinstaller对gradio和chromadb进行打包

解决gradio和chromadb的打包问题 背景问题gradio和gradio_client模块chromadb模块 解决 背景 python项目里包含了gradio和chromadb模块&#xff0c;使用pyinstaller后总有模块找不到&#xff0c;这里分享一个办法一招解决。 问题 gradio和gradio_client模块 gradio在被打进…