当前位置: 首页 > news >正文

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

引言

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

单列集合

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

1. List 接口

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

ArrayList

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

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

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

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

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

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

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 的高效性,还能保持元素的插入顺序。示例如下:

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}
    }
}

相关文章:

  • 基于Flask的去哪儿网海南旅游攻略数据分析系统的设计与实现
  • 2025吐槽季第一弹---腾讯云EO边缘安全加速平台服务
  • Graspness Discovery in Clutters for Fast and Accurate Grasp Detection 解读
  • RoCBert:具有多模态对比预训练的健壮中文BERT
  • 细说STM32F407单片机2个ADC使用DMA同步采集各自的1个输入通道的方法
  • 【开源免费】基于SpringBoot+Vue.JS物流管理系统(JAVA毕业设计)
  • 如何把虚拟机拷贝到另一台VMware里?
  • mysql之MySQL 优化器追踪 (Optimizer Trace):洞察优化器决策的每一个细节
  • 联通用户管理系统(二)
  • 基于SSM的《计算机网络》题库管理系统(源码+lw+部署文档+讲解),源码可白嫖!
  • 软件架构设计:网络基础
  • 计算机网络————(一)HTTP讲解
  • 百度搜索,能否将DeepSeek变成“内功”?
  • 【Linux】:应用层协议 HTTP (超文本传输协议)
  • 和平之翼代码生成器 SHCEU 版 4.0.0RC6 千年隼介绍二
  • 深入理解C语言中的位段
  • 【Linux】匿名管道的应用场景-----管道进程池
  • 基于深度学习的信号滤波:创新技术与应用挑战
  • 基于SpringBoot+vue+uniapp的智慧旅游小程序+LW示例参考
  • react 的 diff 算法
  • 本科生已发14篇SCI论文被指由其教授父亲挂名,重庆大学成立工作组核实
  • 秦洪看盘|重估叙事主题卷土重来,给A股注入新活力
  • 技术派|伊朗展示新型弹道导弹,美“萨德”系统真的拦不住?
  • 美联储主席:美联储工作方式不会受特朗普影响,从未寻求与总统会面
  • 金正恩视察重要军工企业要求推进武力强化变革
  • 国新办将于5月8日10时就《民营经济促进法》有关情况举行新闻发布会