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

Java集合框架的内部揭秘:List、Set与Map的深潜之旅

Java集合框架是一套强大的工具,为开发者提供了灵活的数据管理方式。本文将深入剖析List、Set和Map的内部机制,通过详细的示例和扩展讨论,带你领略这些数据容器的真谛。

一、List:有序序列的深度剖析

List接口是一个可以包含重复元素的有序集合。Java中,ArrayListLinkedList是最常见的List实现。

  • ArrayList:基于动态数组,支持随机访问,但插入和删除效率较低。
import java.util.ArrayList;public class ArrayListExample {public static void main(String[] args) {ArrayList<Integer> numbers = new ArrayList<>();numbers.add(1);numbers.add(2);System.out.println(numbers.get(0)); // 输出 1System.out.println(numbers.size()); // 输出 2// 插入和删除操作numbers.add(1, 3);System.out.println(numbers); // 输出 [1, 3, 2]numbers.remove(1);System.out.println(numbers); // 输出 [1, 2]}
}
  • LinkedList:基于链表,适合频繁的插入和删除,但不支持随机访问。
import java.util.LinkedList;public class LinkedListExample {public static void main(String[] args) {LinkedList<Integer> numbers = new LinkedList<>();numbers.add(1);numbers.add(2);System.out.println(numbers.getFirst()); // 输出 1System.out.println(numbers.getLast()); // 输出 2// 插入和删除操作numbers.addFirst(0);System.out.println(numbers); // 输出 [0, 1, 2]numbers.removeLast();System.out.println(numbers); // 输出 [0, 1]}
}
二、Set:唯一元素的守护者

Set接口确保集合中元素的唯一性,不支持重复元素。主要实现包括HashSetTreeSet

  • HashSet:基于哈希表,提供快速的元素查找和插入。
import java.util.HashSet;public class HashSetExample {public static void main(String[] args) {HashSet<Integer> numbers = new HashSet<>();numbers.add(1);numbers.add(2);numbers.add(2); // 重复元素不会被添加System.out.println(numbers.contains(1)); // 输出 trueSystem.out.println(numbers.size()); // 输出 2}
}
  • TreeSet:基于红黑树,自动排序元素,适用于需要有序集合的场景。
import java.util.TreeSet;public class TreeSetExample {public static void main(String[] args) {TreeSet<Integer> numbers = new TreeSet<>();numbers.add(2);numbers.add(1);numbers.add(3);System.out.println(numbers); // 输出 [1, 2, 3]}
}
三、Map:键值对的管理大师

Map接口用于存储键值对,键必须是唯一的。HashMapTreeMap是最常见的Map实现。

  • HashMap:基于哈希表,提供快速的键值对查找。
import java.util.HashMap;public class HashMapExample {public static void main(String[] args) {HashMap<Integer, String> map = new HashMap<>();map.put(1, "One");map.put(2, "Two");System.out.println(map.get(1)); // 输出 OneSystem.out.println(map.containsKey(2)); // 输出 true}
}
  • TreeMap:基于红黑树,键值对自动排序,适用于需要排序的键值对场景。
import java.util.TreeMap;public class TreeMapExample {public static void main(String[] args) {TreeMap<Integer, String> map = new TreeMap<>();map.put(2, "Two");map.put(1, "One");map.put(3, "Three");System.out.println(map); // 输出 {1=One, 2=Two, 3=Three}}
}
扩展讨论:迭代器与增强for循环

迭代器(Iterator)和增强for循环(Enhanced For Loop)是遍历集合的常用方式。

import java.util.ArrayList;
import java.util.Iterator;public class IteratorExample {public static void main(String[] args) {ArrayList<Integer> numbers = new ArrayList<>();numbers.add(1);numbers.add(2);numbers.add(3);// 使用迭代器遍历Iterator<Integer> iterator = numbers.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}// 使用增强for循环遍历for (Integer number : numbers) {System.out.println(number);}}
}
四、深入探讨:性能与场景的权衡
  • 性能考量ArrayListHashMap在大多数情况下提供最佳性能,因为它们基于哈希表和数组,而LinkedListTreeSet/TreeMap则在特定场景下表现更佳,如频繁的插入删除或需要排序的场合。
  • 内存消耗LinkedList由于额外的节点指针,比ArrayList占用更多内存;TreeSetTreeMap也因为树的结构而消耗更多内存。
  • 并发安全性:默认情况下,上述容器都不支持线程安全,但在高并发场景下,可以考虑使用Collections.synchronizedList()Collections.synchronizedSet()Collections.synchronizedMap(),或者ConcurrentHashMap等并发容器。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • PHP MySQL 创建数据库
  • 数仓工具—Hive语法之宏(Macro)
  • 数据采集监控平台:挖掘数据价值 高效高速生产!
  • 单例模式 单例模式在多线程中是否线程安全, 如何保证线程安全。
  • react中状态管理useState
  • 计算1的数量
  • Windows图形界面(GUI)-DLG-C/C++ - 列表视图(ListView)
  • 如何修复WordPress“414 Request URI Too Large:” 错误
  • Linux chmod 命令简介
  • 【时时三省】tessy 集成测试:小白入门指导手册
  • Git代码管理工具 — 3 Git基本操作指令详解
  • 《JavaSE》---13.<面向对象系列之(附:static关键字及final关键字)>
  • scottplot5 中 使用signalXY图,如何更新数据?
  • 数据分析中的拆解方法介绍
  • 分布式对象存储minio
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • Docker 笔记(2):Dockerfile
  • E-HPC支持多队列管理和自动伸缩
  • Github访问慢解决办法
  • isset在php5.6-和php7.0+的一些差异
  • nodejs调试方法
  • Octave 入门
  • React-redux的原理以及使用
  • Redux系列x:源码分析
  • Spring Cloud中负载均衡器概览
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 爱情 北京女病人
  • 关于使用markdown的方法(引自CSDN教程)
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 聊聊redis的数据结构的应用
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 前言-如何学习区块链
  • 自制字幕遮挡器
  • 最近的计划
  • nb
  • 7行Python代码的人脸识别
  • 阿里云服务器如何修改远程端口?
  • 翻译 | The Principles of OOD 面向对象设计原则
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • # 透过事物看本质的能力怎么培养?
  • ######## golang各章节终篇索引 ########
  • #include
  • #职场发展#其他
  • (2024)docker-compose实战 (9)部署多项目环境(LAMP+react+vue+redis+mysql+nginx)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (分布式缓存)Redis分片集群
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (六)激光线扫描-三维重建
  • (万字长文)Spring的核心知识尽揽其中
  • (一)模式识别——基于SVM的道路分割实验(附资源)
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转)memcache、redis缓存
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .Net CF下精确的计时器
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现