【Java 基础】17 集合

news2025/1/15 13:20:29

文章目录

    • 1.基本概念
    • 2.核心接口
    • 3.常见实现
      • 1)List 接口的实现类
        • ArrayList
        • LinkedList
        • Vector
      • 2)Set 接口的实现类
        • HashSet
        • LinkedHashSet
        • TreeSet
      • 3)Queue 接口的实现**类**
        • ArrayQueue
      • 4)Map 接口的实现类
        • HashMap
        • LinkedHashMap
        • TreeMap
    • 4.最佳实践

集合框架(Collection Framework)是一组 用于存储操作数据的类和接口。它提供了一种灵活、高效的数据结构,适用于各种编程场景。

1.基本概念

集合就是把分散的 “东西” 聚集到一起。

集合框架就是为集合提供了一套通用的操作方式供使用。

Java 集合框架的设计目标是提供一组通用的、类型安全的接口和实现,使得我们能够轻松地操作和管理数据
在这里插入图片描述

2.核心接口

在这里插入图片描述

集合框架的常用核心接口:

接口名称功能描述常见实现
Collection表示一组对象,Map所有集合的根接口,定义了基本的集合操作,如添加、删除、遍历等-
List表示一个有序的集合,允许重复元素ArrayListLinkedListVector
Set表示一个不包含重复元素的集合HashSetLinkedHashSetTreeSet
Queue表示一个有序的集合,是一个先进先出的队列ArrayDeque
Map表示键值对的集合,每个键都唯一HashMapLinkedHashMapTreeMap

3.常见实现

1)List 接口的实现类

ArrayList

基于动态数组实现,支持快速随机访问。

public static void main(String[] args) {
	List<String> arrayList = new ArrayList<>();
	arrayList.add("b");
    arrayList.add("a");
    arrayList.add("a");
	System.out.println(arrayList);
}

输出结果:[b, a, a]

LinkedList

基于双向链表实现,适合插入和删除操作。

public static void main(String[] args) {
	List<String> linkedList = new LinkedList<>();
	linkedList.add("b");
    linkedList.add("a");
    linkedList.add("a");
	System.out.println(linkedList);
}

输出结果:[b, a, a]

Vector

类似于 ArrayList,但是是线程安全的。

public static void main(String[] args) {
	List<String> vector = new Vector<>();
	vector.add("b");
    vector.add("a");
    vector.add("a");
	System.out.println(vector);
}

输出结果:[b, a, a]

这样简单的存储操作,结果都是相同的,只不过内部的实现方式不同而已。

2)Set 接口的实现类

HashSet

基于哈希表实现,无序且不允许重复元素。

public static void main(String[] args) {
    Set<String> hashSet = new HashSet<>();
    hashSet.add("b");
    hashSet.add("a");
    hashSet.add("a");
    System.out.println(hashSet);
}

输出结果:[a, b]

LinkedHashSet

基于哈希表和链表实现,有序且不允许重复元素。

public static void main(String[] args) {
    Set<String> linkedHashSet = new LinkedHashSet<>();
    linkedHashSet.add("b");
    linkedHashSet.add("a");
    linkedHashSet.add("a");
    System.out.println(linkedHashSet);
}

输出结果:[b, a]

TreeSet

基于红黑树实现,有序且不允许重复元素( 有序是指可以按照元素的大小顺序自动排序 )。

public static void main(String[] args) {
    Set<String> treeSet = new TreeSet<>();
    treeSet.add("b");
    treeSet.add("a");
    treeSet.add("a");
    System.out.println(treeSet);
}

输出结果:[a, b]

3)Queue 接口的实现

ArrayQueue

双端队列,是一种具有队列和栈的性质的数据结构 。 双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。

  • 将其用作

    public static void main(String[] args) {
        Deque<Integer> stack = new ArrayDeque<>();
        stack.push(0);
        stack.push(1);
        stack.push(2);
        System.out.println(stack);
        System.out.println(stack.pop());
        System.out.println(stack);
    }
    

    输出结果:

    [2, 1, 0]
    2
    [1, 0]

  • 将其用作队列

    public static void main(String[] args) {
        Deque<Integer> deque = new ArrayDeque<>();
        deque.offer(0);
        deque.offer(1);
        deque.offer(2);
        System.out.println(deque);
        System.out.println(deque.poll());
        System.out.println(deque);
    }
    

    输出结果:

    [0, 1, 2]
    0
    [1, 2]

4)Map 接口的实现类

HashMap

基于哈希表实现,键值对无序。

public static void main(String[] args) {
    Map<String, String> hashMap = new HashMap<>();
    hashMap.put("b", "bb");
    hashMap.put("a", "aa");
    hashMap.put("a", "aa");
    System.out.println(hashMap);
}

输出结果:{a=aa, b=bb}

LinkedHashMap

基于哈希表和链表实现,键值对有序。

public static void main(String[] args) {
    Map<String, String> linkedHashMap = new LinkedHashMap<>();
    linkedHashMap.put("b", "bb");
    linkedHashMap.put("a", "aa");
    linkedHashMap.put("a", "aa");
    System.out.println(linkedHashMap);
}

输出结果:{b=bb, a=aa}

TreeMap

基于红黑树实现,键值对有序( 有序是指可以按照元素的大小顺序自动排序 )。

public static void main(String[] args) {
    Map<String, String> treeMap = new TreeMap<>();
    treeMap.put("b", "bb");
    treeMap.put("a", "aa");
    treeMap.put("a", "aa");
    System.out.println(treeMap);
}

输出结果:{a=aa, b=bb}

4.最佳实践

  • 选择合适的集合类型: 根据需求选择不同的集合类型

    例如:需要有序且不允许重复元素,可以选择 TreeSetLinkedHashSet

  • 遍历集合: 使用增强型 for 循环或迭代器进行集合遍历,提高代码的可读性。

    for (String item : list) {
        System.out.println(item);
    }
    
  • 使用泛型: 在集合中使用泛型能够提高代码的类型安全性,避免在运行时出现类型转换错误。

  • 注意线程安全性: 根据程序的多线程需求选择合适的集合实现

    例如:需要线程安全的集合可以选择 Vector 或使用 Collections.synchronizedList

  • 使用 stream: Java 8 引入了一些便利的集合处理方法

    例如: stream()filter()map() 等,可以简化集合操作。

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("Test");
        list.add("Hello world");
        System.out.println("list: " + list);
        List<String> helloList = list.stream()
            .filter(s -> s.startsWith("Hello")).collect(Collectors.toList());
        System.out.println("helloList: " + helloList);
    }
    

    输出结果:

    list: [Test, Hello world]
    helloList: [Hello world]

  • 注意集合的性能: 根据集合的使用场景选择合适的实现

    例如:需要高性能的随机访问可以选择 ArrayList,而频繁插入和删除操作可以选择 LinkedList

  • 谨慎使用原始类型: 尽量避免在集合中使用原始类型,使用泛型可以提高代码的可维护性和可读性。

集合框架为我们提供了丰富的工具和选项,能够满足不同场景下的数据存储和操作需求。了解不同集合的特性和使用场景,合理选择和使用集合框架,将有助于编写出高效、可维护的 Java 代码

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

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

相关文章

跟着Nature Communications学习Hisat-Trinity-PASA等分析流程

一边学习&#xff0c;一边总结&#xff0c;一边分享&#xff01; 详细教程请访问&#xff1a; 组学分析流程 本期分析流程 Hisat2-SamtoolsTrinity_GG_denovoPASA … 本期教程文章 题目&#xff1a;Genomic insights into local adaptation and future climate-induced vu…

C++-内存管理

目录 一.C/C内存分布 二. C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free 三. C内存管理方式 1.new/delete操作内置类型 2.new和delete操作自定义类型 四.C语言中的动态开辟内存空间和C中的区别 1.对于开辟内置类型 2.…

2023/12/3总结

RabbitMq 消息队列 下载地址RabbitMQ: easy to use, flexible messaging and streaming — RabbitMQ 使用详情RabbitMQ使用教程(超详细)-CSDN博客 实现延迟队列&#xff08;为了实现订单15分钟后修改状态&#xff09; 1 死信队列 当一个队列中的消息满足下列情况之一时&…

智能优化算法应用:基于秃鹰算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于秃鹰算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于秃鹰算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.秃鹰算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

开源项目-对新手极其友好的数据结构与算法入门教程-hello-algo

点击上方“嵌入式应用研究院”&#xff0c;选择“置顶/星标公众号” 干货福利&#xff0c;第一时间送达&#xff01; 排版 | 嵌入式应用研究院 素材来源 |Github开源社区 从业多年&#xff0c;大家是否在工作中遇到很多软件逻辑问题难以解决&#xff1f;其实大多数情况下是由于…

一次电气——电抗器(一)

我之前的工作是在国外建联合循环电厂&#xff0c;现在的工作是研发一次电力设备。虽然仍是在电力行业发展&#xff0c;但这两份不同岗位不同职能的工作究其感受而言有很大的不同。相较于第一份工作&#xff0c;第二份工作带给我带来的更多的是一种由广及微&#xff0c;由浅入深…

小程序SSL证书

小程序通常需要与服务器进行数据交互&#xff0c;包括用户的登录信息、支付数据等。在没有安全保障的情况下&#xff0c;这些敏感数据容易受到黑客攻击&#xff0c;导致信息泄露和用户隐私的严重问题。因此&#xff0c;确保小程序中的通信安全势在必行。 SSL证书在小程序中扮演…

排序算法介绍(一)插入排序

0. 简介 插入排序&#xff08;Insertion Sort&#xff09; 是一种简单直观的排序算法&#xff0c;它的工作原理是通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。插入排序在实现上&#xff0c;通常…

TimeGPT:时间序列预测模型实例

时间序列预测领域正在经历一个非常激动人心的时期。在过去的三年里&#xff0c;我们见证了许多重要的贡献&#xff0c;如N-BEATS、N-HiTS、PatchTST和TimesNet等。同时&#xff0c;大型语言模型&#xff08;LLM&#xff09;近来在流行度方面取得了很大的成功&#xff0c;例如Ch…

Zotero 安装及常用插件设置指南

Zotero 安装及常用插件设置指南 本指南旨在帮助用户安装并配置 Zotero。通过本教程&#xff0c;您将能够实现以下功能&#xff1a; 界面语言设置为中文使用颜色标签来区分不同阅读状态的文献重要文献标记显示影响因子、JCP和中科院分区翻译插件Sci-Hub 集成 安装和设置步骤…

【算法】单调栈题单(矩阵系列、字典序最小、贡献法)⭐

文章目录 题单来源经典题单496. 下一个更大元素 I&#xff08;单调栈模板题&#xff09;503. 下一个更大元素 II&#xff08;单调栈循环数组&#xff09;2454. 下一个更大元素 IV&#xff08;第二个更大的元素&#xff1a;两个单调栈&#xff09;456. 132 模式&#xff08;单调…

Dockerfile与Docker网络

一、Dockerfile 1、概念&#xff1a; Dockerfile是用来构建docker镜像的文本文件&#xff0c;是由构建镜像所需要的指令和参数构建的脚本。 2、构建步骤&#xff1a; ① 编写Dockerfile文件 ② docker build命令构建镜像 ③ docker run依据镜像运行容器实例 Dockerfile …

电影《星愿》观后感

上周看了电影《星愿》&#xff0c;看这部电影的动机&#xff0c;主要是回忆的价值大于电影本身的价值&#xff0c;看着影片介绍&#xff0c;是迪士尼工作室成立百年&#xff0c;特别推出的影片。 具体来说&#xff0c;主要是在开头有一段是影片&#xff0c;各个时期的我们看过的…

Echarts大屏可视化_03 定制柱状图

柱状图模块引入 1.找到合适的图表 在echarts中寻找与目标样式相近的图表 Examples - Apache ECharts 2. 引入柱状图 使用立即执行函数构建&#xff0c;防止变量全局污染 实例化对象 将官网中提供的option复制到代码中&#xff0c;并且构建图表 // 柱状图模块1 (function () {/…

若依微服务项目整合rocketMq

原文链接&#xff1a;ttps://mp.weixin.qq.com/s/IYdo_suKvvReqCiEKjCeHw 第一步下载若依项目 第二步安装rocketMq&#xff08;推荐在linux使用docker部署比较快&#xff09; 第二步新建一个生产者模块儿&#xff0c;再建一个消费者模块 第四步在getway模块中配置接口映射规…

浅学指针(5)sizeof和strlen的进阶理解

系列文章目录 文章目录 系列文章目录前言1. sizeof和strlen的对⽐1.1 sizeofsizeof不是函数&#xff0c;是运算符 1.2 strlen1.3 sizeof 和 strlen的对⽐ 2. 数组和指针笔试题解析• sizeof(数组名)&#xff0c;sizeof中单独放数组名&#xff0c;这⾥的数组名表⽰整个数组&…

一款自动帮你生成UI界面和代码的AI神器

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 只要描述你想要的UI是什么样的&#xff0c;它就能帮你生成&#xff0c;是不是很神奇&#xff1f; v0使用 AI 模型根据简单的文本提示生成用户界面和代码&#xff…

有序表常见题型

给定一个数组arr和两个整数a和b求arr中有多少个子数组累加和在a到b这个范围上返回达标的子数组数量 如【3&#xff0c;6&#xff0c;1&#xff0c;9&#xff0c;2】达标的子数组通过暴力求解的方式时间复杂度为O&#xff08;N的三次方&#xff09;【找每个子数组占用O&#xf…

MQ - KAFKA 基础篇

##1、KAFKA的核心组件/API Producer API&#xff0c;它允许应用程序向一个或多个 topics 上发送消息记录 Consumer API&#xff0c;允许应用程序订阅一个或多个 topics 并处理为其生成的记录流 Streams API&#xff0c;它允许应用程序作为流处理器&#xff0c;从一个或多个主…

Ubuntu中安装IDEA,并配置桌面快捷方式

1、首先自己下载linux版本的idea 这一步省略不说了 2、在/usr/local/路径下新建安装目录IDEA&#xff1a; mkdir -p /usr/local/IDEA3、执行如下命令&#xff0c;解压下载的压缩包到指定目录&#xff1a; tar -zxvf ideaIU-2022.3.3.tar.gz -C /usr/local/IDEA 注意&#x…