Java 集合框架超详细解析:核心接口、常见实现与原理剖析

Java 集合框架超详细解析:核心接口、常见实现与原理剖析

Java集合框架(Java Collections Framework)是Java平台的重要组成部分,提供了一组用于存储、操作和处理数据的接口和类。本文将详细介绍集合框架的各个部分,包括其核心接口、常见实现、以及使用示例和背后的实现原理。

1. 集合框架的核心接口

Java集合框架主要包括以下几个核心接口:

  • Collection:这是所有集合类的根接口。它有三个主要的子接口:List、Set和Queue。

    • List:有序集合,允许元素重复。实现包括:

      • ArrayList
      • LinkedList
      • Vector
      • Stack
    • Set:不允许元素重复。实现包括:

      • HashSet
      • LinkedHashSet
      • TreeSet
    • Queue:用于存储等待处理的元素。实现包括:

      • PriorityQueue
      • LinkedList
      • ArrayDeque
    • Map:映射接口,用于存储键值对。实现包括:

      • HashMap
      • LinkedHashMap
      • TreeMap

2. 常见集合的详细解析

List

ArrayList

import java.util.ArrayList;public class ArrayListExample {public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("Apple");arrayList.add("Banana");arrayList.add("Cherry");System.out.println("Element at index 1: " + arrayList.get(1));for (String fruit : arrayList) {System.out.println(fruit);}arrayList.remove(1);System.out.println("After removal: " + arrayList);boolean containsApple = arrayList.contains("Apple");System.out.println("Contains Apple: " + containsApple);}
}
  • 原理:ArrayList基于动态数组实现,内部使用一个数组来存储元素。当数组满时,会创建一个更大的新数组并将旧数组中的元素复制到新数组中。
  • 优点:支持快速随机访问。
  • 缺点:在中间插入或删除元素时效率较低,因为需要移动数组中的元素。

LinkedList

import java.util.LinkedList;public class LinkedListExample {public static void main(String[] args) {LinkedList<String> linkedList = new LinkedList<>();linkedList.add("Dog");linkedList.add("Cat");linkedList.add("Rabbit");System.out.println("First element: " + linkedList.getFirst());System.out.println("Last element: " + linkedList.getLast());linkedList.addFirst("Hamster");System.out.println("After addFirst: " + linkedList);linkedList.removeFirst();linkedList.removeLast();System.out.println("After removeFirst and removeLast: " + linkedList);for (String pet : linkedList) {System.out.println(pet);}}
}
  • 原理:LinkedList基于双向链表实现,内部使用节点来存储元素,每个节点包含指向前一个和后一个节点的引用。
  • 优点:在任意位置插入或删除元素时效率较高。
  • 缺点:随机访问速度较慢,需要从头或尾遍历链表。

Set

HashSet

import java.util.HashSet;public class HashSetExample {public static void main(String[] args) {HashSet<String> hashSet = new HashSet<>();hashSet.add("Red");hashSet.add("Green");hashSet.add("Blue");boolean added = hashSet.add("Red");boolean containsBlue = hashSet.contains("Blue");System.out.println("Contains Blue: " + containsBlue);hashSet.remove("Green");for (String color : hashSet) {System.out.println(color);}System.out.println("Set size: " + hashSet.size());}
}
  • 原理:HashSet基于哈希表实现,使用哈希函数将元素映射到一个数组位置,不允许重复元素。
  • 优点:操作(如添加、删除、查找)效率高,平均时间复杂度为O(1)。
  • 缺点:元素无序,不能保证元素的插入顺序。

TreeSet

import java.util.TreeSet;public class TreeSetExample {public static void main(String[] args) {TreeSet<String> treeSet = new TreeSet<>();treeSet.add("Orange");treeSet.add("Apple");treeSet.add("Banana");for (String fruit : treeSet) {System.out.println(fruit);}System.out.println("First element: " + treeSet.first());System.out.println("Last element: " + treeSet.last());treeSet.remove("Banana");System.out.println("After removal: " + treeSet);}
}
  • 原理:TreeSet基于红黑树实现,自动对元素进行排序。
  • 优点:支持排序和范围查询,所有操作的时间复杂度为O(log n)。
  • 缺点:操作复杂度较高,内存开销较大。

Queue

PriorityQueue

import java.util.PriorityQueue;public class PriorityQueueExample {public static void main(String[] args) {PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();priorityQueue.add(20);priorityQueue.add(15);priorityQueue.add(30);System.out.println("Peek: " + priorityQueue.peek());System.out.println("Poll: " + priorityQueue.poll());System.out.println("Peek after poll: " + priorityQueue.peek());for (Integer number : priorityQueue) {System.out.println(number);}}
}
  • 原理:PriorityQueue基于优先级堆实现,元素根据优先级自动排序。
  • 优点:支持根据优先级排序的操作。
  • 缺点:不支持队列的FIFO顺序,只按优先级排序。

ArrayDeque

import java.util.ArrayDeque;public class ArrayDequeExample {public static void main(String[] args) {ArrayDeque<String> deque = new ArrayDeque<>();deque.add("First");deque.addLast("Second");deque.addFirst("Third");System.out.println("Deque: " + deque);deque.removeFirst();deque.removeLast();System.out.println("After removal: " + deque);for (String element : deque) {System.out.println(element);}}
}
  • 原理:ArrayDeque基于数组实现,是一个双端队列,支持双端操作。
  • 优点:支持高效的双端操作,可以作为栈或队列使用。
  • 缺点:不支持容量限制的Deque操作。

Map

HashMap

import java.util.HashMap;public class HashMapExample {public static void main(String[] args) {HashMap<String, Integer> hashMap = new HashMap<>();hashMap.put("Apple", 3);hashMap.put("Banana", 2);hashMap.put("Cherry", 5);int appleCount = hashMap.get("Apple");System.out.println("Apple count: " + appleCount);boolean hasBanana = hashMap.containsKey("Banana");System.out.println("Has Banana: " + hasBanana);hashMap.remove("Banana");for (HashMap.Entry<String, Integer> entry : hashMap.entrySet()) {System.out.println(entry.getKey() + ": " + entry.getValue());}System.out.println("Map size: " + hashMap.size());}
}
  • 原理:HashMap基于哈希表实现,使用哈希函数将键映射到数组位置。
  • 优点:支持O(1)的查找、插入和删除操作。
  • 缺点:不保证顺序,可能存在哈希冲突。

TreeMap

import java.util.TreeMap;public class TreeMapExample {public static void main(String[] args) {TreeMap<String, Integer> treeMap = new TreeMap<>();treeMap.put("Orange", 10);treeMap.put("Apple", 5);treeMap.put("Banana", 7);for (String key : treeMap.keySet()) {System.out.println(key + ": " + treeMap.get(key));}System.out.println("First key: " + treeMap.firstKey());System.out.println("Last key: " + treeMap.lastKey());treeMap.remove("Banana");System.out.println("After removal: " + treeMap);}
}
  • 原理:TreeMap基于红黑树实现,自动对键进行排序。
  • 优点:支持有序的键值对,提供按键排序的视图。
  • 缺点:操作复杂度较高,内存开销较大。

3. 性能考虑

选择集合实现时,需要考虑以下因素:

  • 操作效率:如插入、删除、访问的速度。
  • 内存消耗:不同实现的内存开销不同。
  • 排序要求:是否需要排序或按特定顺序存储元素。
  • 线程安全:是否需要线程安全的集合。

4. 线程安全集合

Java集合框架提供了一些线程安全的集合类和方法,如:

  • Collections.synchronizedCollection:对集合进行同步包装。
  • Collections.synchronizedList:对List进行同步包装。
  • Collections.synchronizedSet:对Set进行同步包装。
  • Collections.synchronizedMap:对Map进行同步包装。

5. 总结

Java集合框架提供了一组强大且灵活的工具,用于处理各种类型的数据。了解每种集合的特性和实现原理,可以帮助开发者在不同的应用场景中选择最合适的集合实现,从而提高程序的性能和可维护性。通过实践和深入研究,开发者可以充分利用Java集合框架的优势,编写高效、健壮的代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/38253.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

业务模型扩展字段存储

构建业务模型时&#xff0c;通常模型会设置扩展信息&#xff0c;存储上一般使用JSON格式存储到db中。JSON虽然有较好的扩展性&#xff0c;但并没有结构化存储的类型和非空等约束&#xff0c;且强依赖代码中写入/读取时进行序列化/反序列化操作&#xff0c; 当扩展信息结构简单且…

代码随想录第37天|动态规划

01背包理论基础 参考 01背包: 每个物品只有一个, 只要选或不选两个选项 暴力解法: 回溯法枚举 dp[i][j]: i 表示 0 ~ i 的物品, j 表示容量, 数值表示当前的最大价值递推公式: max(dp[i-1][j], dp[i-1][j-weight[i]] value[i])初始化: j 0 时, 无法放任何有价值的物品, d…

ASP.Net.WebAPI和工具PostMan

1.WebAPI概述 1.1 WebAPI WebAPI 是一种传统的方式&#xff0c;用于构建和暴露 RESTUI风格的Web服务。它提供了丰富的功能和灵活性&#xff0c;可以处理各种HTTP请求&#xff0c;并支持各种数据格式&#xff0c;如JSON、XML等。 WebAPI使用控制器(Controllers)和动作方法(Ac…

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验10 IPv4地址 — 构造超网(无分类编址)

一、实验目的 1.加深对构造超网的理解&#xff1b; 二、实验要求 1.使用Cisco Packet Tracer仿真平台&#xff1b; 2.观看B站湖科大教书匠仿真实验视频&#xff0c;完成对应实验。 三、实验内容 1.构建网络拓扑&#xff1b; 2.根据各网络所指定的地址块完成以下工作&#…

携手亚马逊云科技,维塑科技推出运动健康领域首个AI大模型

导读&#xff1a;生成式AI运动健康&#xff0c;将如何改变我们的生活&#xff1f; 人工智能技术正不断重塑着我们的工作、生活方式。那么&#xff0c;AI能否改善我们的健康状况呢&#xff1f;AI大模型在运动健康领域的探索为我们带来新的想象。 2023年&#xff0c;全球领先的AI…

java之命令执行审计思路

1 漏洞原理 因用户输入未过滤或净化不完全&#xff0c;导致Web应用程序接收用户输入&#xff0c;拼接到要执行的系统命令中执行。一旦攻击者可以在目标服务器中执行任意系统命令&#xff0c;就意味着服务器已被非法控制。 2 审计中常用函数 一旦攻击者可以在目标服务器中执行…

Redis发布、订阅模式(Pub/Sub)详解

Redis发布、订阅模式&#xff08;PUB-SUB&#xff09;详解 Redis的发布订阅&#xff08;Pub/Sub&#xff09;机制是一种消息通信模式&#xff0c;用于消息的广播。它允许多个客户端订阅&#xff08;Subscribe&#xff09;特定的频道&#xff08;Channel&#xff09;&#xff0c…

Docker镜像拉去不了解决方案

原理&工具 使用海外的服务器拉去镜像&#xff0c;压缩为tar包&#xff0c;传输到本地在本地运行 服务器&#xff1a;这里我使用的是AWS的服务器&#xff0c;新用户注册免费使用1年&#xff08;流量超了就不免费了&#xff0c;一般用不完&#xff0c;还有使用 Cloudflare …

【ARM CoreLink 系列 7.2 -- TZC-400 错误状态寄存器使用详细介绍】

文章目录 TZC-400 错误信息使用Fail address low registerFail address high registerFail control registerFail ID registerTZC-400 错误信息使用 Fail address low register 在 ARM TZC-400 设备中,每个过滤单元都有一个 fail_address_low_<x> 寄存器,其中 <x&g…

嵌入式MCU平台汇总

文章目录 1. 单片机&#xff08;MCU&#xff09; 2. 数字信号处理器&#xff08;DSP&#xff09; 3. ARM Cortex 系列 4. 超低功耗MCU 5. 物联网MCU&#xff08;IoT MCU&#xff09; 6. 开源架构MCU&#xff08;RISC-V&#xff09; 7. 可编程逻辑器件&#xff08;FPGA&a…

springCloudAlibaba常用的依赖和配置文件

下面为常用的依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactI…

5.How Fast Should You Be When Learning?(你应该用多快的速度学习? (二))

Are you failing to reach an ideal or you dont know what the ideal is? 你是否没有达到理想状态&#xff0c;或者不知道理想状态是什么? A lot of learing involves having a mental representation of what the ideal performance ought to be, a method or approach t…

【el-table 可实现分页勾选数据】

分页勾选数据 第一步第二步第三步 第一步 <el-tableref"table"size"small"style"width: 100%;":row-key"getRowKeys"selection-change"selectionChangeHandler">第二步 <el-table-columntype"selection"…

【计算机图形学 | 基于MFC三维图形开发】期末考试知识点汇总(下)

文章目录 视频教程第四章 二维变换与裁剪矩阵基础回顾二维几何变换之 平移二维几何变换之 比例二维几何变换之 旋转二维几何变换之 反射复合变换直线裁剪&#xff1a;Cohen-Sutherland 算法直线裁剪&#xff1a;中点分割算法直线裁剪&#xff1a;Liang-Barsky 算法多边形裁剪&a…

github主页这样优化,让人眼前一亮

我的主页&#xff08;一之十六&#xff09; 1. 创建与账户ID同名的仓库 注意&#xff1a;记得勾选Add a README file 2. markdown语法自定义README.md 3. 辅助工具 优秀profile&#xff1a;https://zzetao.github.io/awesome-github-profile/动态文字&#xff1a;https://r…

构建高效业财一体化管理体系

构建高效业财一体化管理体系 业财一体化战略意义 提升决策质量 强化数据支撑&#xff1a;通过整合业务与财务数据&#xff0c;为决策提供准确、实时的信息基础&#xff0c;确保分析的深度与广度。促进业务与财务协同&#xff1a;打破信息孤岛&#xff0c;实现业务流程与财务管…

python 压缩数据

requests 是 Python 中一个非常流行的 HTTP 库&#xff0c;用于发送各种 HTTP 请求。下面是一个使用 requests 库发送简单 GET 请求和 POST 请求的示例&#xff1a; 首先&#xff0c;确保你已经安装了 requests 库。如果还没有安装&#xff0c;可以使用 pip 进行安装&#xff…

WEB攻防【4】——JavaWeb项目/JWT身份攻击/组件安全/访问控制

一、知识点 1、Javaweb常见安全及代码逻辑 Javaweb的架构&#xff1a; 如何通过包查找到文件&#xff0c;通过URL对应源码的文件&#xff0c;或者通过源码文件对应URL地址。 2、目录遍历&身份验证&逻辑&JWT Javaweb里面有身份认证的JWT的技术&#xff0c;pyth…

基于web的产品管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于web的产品管理系统,java项目。 ecli…

JavaScript中变量、数据类型、操作符和条件判断注意事项

一、变量名 定义规则&#xff1a; 变量名只能以字母和$_两个字符开头&#xff0c;后面可以包括数字。尽量不要使用其他Unicode字符&#xff0c;避免潜在问题。 最佳实践&#xff1a; 避免使用难以识别或有歧义的字符&#xff0c;以便代码更易读和维护。 二、数据类型 JavaScr…