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.mfbz.cn/a/759029.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

企业im(即时通讯)作为安全专属的移动数字化平台的重要工具

企业IM即时通讯作为安全专属的移动数字化平台的重要工具&#xff0c;正在越来越多的企业中发挥着重要的作用。随着移动技术和数字化转型的发展&#xff0c;企业对于安全、高效的内部沟通和协作工具的需求也越来越迫切。本文将探讨企业IM即时通讯作为安全专属的移动数字化平台的…

【Python系列】Python 项目 Docker 部署指南

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

常微分方程算法之编程示例五(阿当姆斯法)

目录 一、研究问题 二、C++代码 三、计算结果 一、研究问题 本节我们采用阿当姆斯法(Adams法)求解算例。 阿当姆斯法的原理及推导请参考: 常微分方程算法之阿当姆斯法(Adams法)_四步四阶adams显格式;三步四阶adams隐格式;四阶adams预估-校正格式-CSDN博客https://blog…

Installed Build Tools revision xxx is corrupted. Remove and install again 解决

1.在buildTools文件下找到对应的sdk版本&#xff0c;首先将版本对应目录下的d8.bat改名为dx.bat。 2.在lib文件下将d8.jar改名为dx.jar。 3.重新编译工程即可

Django-开发一个列表页面

需求 基于ListView,创建一个列表视图,用于展示"BookInfo"表的信息要求提供分页提供对书名,作者,描述的查询功能 示例展示: 1. 数据模型 models.py class BookInfo(models.Model):titlemodels.CharField(verbose_name"书名",max_length100)authormode…

vscode中快捷生成自定义vue3模板

需求描述 新建 vue 文件后&#xff0c;需要先写出 vue3 的基础架构代码&#xff0c;手动输入效率低下&#xff01; 期待&#xff1a;输入 v3 按 Tab 即刻生成自定义的vue3模板&#xff08;如下图&#xff09; 实现流程 vscode 的设置中&#xff0c;选择 用户代码片段 输入 vue…

基于STM32的温湿度检测TFT屏幕proteus恒温控制仿真系统

一、引言 本文介绍了一个基于STM32的恒温控制箱检测系统&#xff0c;该系统通过DHT11温湿度传感器采集环境中的温湿度数据&#xff0c;并利用TFT LCD屏幕进行实时显示。通过按键切换页面显示&#xff0c;通过按键切换实现恒温控制箱的恒温控制。为了验证系统的可靠性和稳定性&…

密室逃脱——收集版

一、原版修改 1、导入资源 Unity Learn | 3D Beginner: Complete Project | URP 2、设置Scene 删除SampleScene&#xff0c;打开UnityTechnologies-3DBeginnerComplete下的MainScene 3、降低音量 (1) 打开Hierarchy面板上的Audio降低音量 (2) 打开Prefabs文件夹&#xf…

使用 PyQt5 创建一个数字时钟

使用 PyQt5 创建一个数字时钟 效果代码解析定义时钟类初始化界面显示时间 完整代码 在这篇博客中&#xff0c;我们将使用 PyQt5 创建一个简单的数字时钟。 效果 代码解析 定义时钟类 class ClockWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTit…

Swift宏的实现

上篇介绍了Swift宏的定义与生声明&#xff0c;本篇主要看看是Swift宏的具体实现。结合Swift中Codable协议&#xff0c;封装一个工具让类或者结构体自动实现Codable协议&#xff0c;并且添加一些协议中没有的功能。 关于Codable协议 Codable很好&#xff0c;但是有一些缺陷&…

Redis基础教程(三):redis命令

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

仓库管理系统11--物资设置

1、添加用户控件 <UserControl x:Class"West.StoreMgr.View.GoodsTypeView"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc"http://schemas.openxm…

sqlserver开启CDC

1、背景 由于需要学习flink cdc&#xff0c;并且数据选择sqlserver&#xff0c;所以这里记录sqlserver的cdc开启操作步骤。 2、基础前提 官方介绍地址&#xff1a;https://learn.microsoft.com/zh-cn/sql/relational-databases/track-changes/enable-and-disable-change-dat…

Ubuntu22.04 源码安装 PCL13+VTK-9.3+Qt6,踩坑记录

Ubuntu 22.04LTS;cmake-3.25.0;VTK-9.3;PCL-1.13;Qt6.6 PCL可以通过 apt 命令直接安装(sudo apt install libpcl-dev),apt 命令安装的 VTK 是简略版,没有对 Qt 支持的包,所以笔者使用源码安装 PCL 和 VTK。 1. 安装 VTK 1) 安装 ccmake 和 VTK 依赖项: sudo apt-g…

DataWhale-吃瓜教程学习笔记 (五)

学习视频&#xff1a;第4章-决策树_哔哩哔哩_bilibili 西瓜书对应章节&#xff1a; 第四章 4.1&#xff1b;4.2 文章目录 决策树算法原理- 逻辑角度- 几何角度 ID3 决策树- 自信息- 信息熵 &#xff08;自信息的期望&#xff09;- 条件熵 &#xff08; Y 的信息熵关于概率分布 …

从万里长城防御体系看软件安全体系建设@安全历史03

长城&#xff0c;是中华民族的一张重要名片&#xff0c;是中华民族坚韧不屈、自强不息的精神象征&#xff0c;被联合国教科文组织列入世界文化遗产名录。那么在古代&#xff0c;长城是如何以其复杂的防御体系&#xff0c;一次次抵御外族入侵&#xff0c;而这些防御体系又能给软…

HarmonyOS Next开发学习手册——创建轮播 (Swiper)

Swiper 组件提供滑动轮播显示的能力。Swiper本身是一个容器组件&#xff0c;当设置了多个子组件后&#xff0c;可以对这些子组件进行轮播显示。通常&#xff0c;在一些应用首页显示推荐的内容时&#xff0c;需要用到轮播显示的能力。 针对复杂页面场景&#xff0c;可以使用 Sw…

C++ sizeof的各种

C sizeof的各种 1. 含有虚函数的类对象的空间大小2. 虚拟继承的类对象的空间大小3. 普通变量所占空间大小4. 复合数据类型&#xff08;结构体和类&#xff09;5. 数组6. 类型别名7. 动态分配内存8. 指针9. 静态变量10. 联合体11. 结构体使用#program pack 1. 含有虚函数的类对象…

firewalld防火墙转发流量到其他端口forward port rules

假设云主机eth0: 47.93.27.106 tun0: inet 10.8.0.1 netmask 255.255.255.0 Show rules for a specific zone (public) sudo firewall-cmd --zonepublic --list-all Add the tun0 interface to the public zone: sudo firewall-cmd --zonepublic --add-interfacetun0 --…

关于图片大小问题造成的QPixmap或QImage读取图片失败的解决办法

今天碰到一个奇怪又离谱的问题 : 图片加载失败。明明路径是正确的&#xff0c;图片也实实在在存在。。。 经过比对&#xff0c;发现如下问题&#xff1a; 我就齐了怪了 这大小怎么差这么多&#xff1f;会不会是这里除了问题。秉持着怀疑的态度&#xff0c;我试着用GIMP重新导出…