【Java 基础】17 集合

文章目录

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

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

相关文章

监控之Spring Boot Admin

目录 一、Spring Boot Admin 简介 官方网址 简介 二、Spring Boot Admin的使用 启动SBA server 微服务端配置SBA server地址 查看监控信息 一、Spring Boot Admin 简介 官方网址 GitHup网址&#xff1a;GitHub - codecentric/spring-boot-admin: Admin UI for administ…

ChaoJi充电连接装置典型试验案例分析 GB/T 20234.1充电连接装置型式试验变化分析

GB/T 20234.1充电连接装置典型试验变化分析 1、ChaoJi充电连接装置典型试验案例分析 1.1、大功率直流充电接口 1.2、枪线尺寸、重量、面积数据对比 1.3、枪线温升对比试验 1.4、chaoji 枪线温升试验 1.5、chaoji枪线防护等级试验 1.6、GB/T 20234.4项目列表 1.7、小结 ✓ 通…

关于媒体查询不能生效的原因

问题 今天写媒体查询&#xff0c;遇到了个问题&#xff0c;卡了很久&#xff0c;引入三个样式&#xff1a;mainPageCommon.css、mainPageBig.css、mainPageSmall.css。其中的两个样式可以生效&#xff0c;但是小尺寸的媒体查询不能生效&#xff0c;这里很奇怪&#xff01;&…

Cairo编程语言

文章目录 Cairo编程语言一、背景二、什么是Cairo工作原理 三、Solidity 和 Cairo 的区别四、开发 Starknet 智能合约的工具链protostarstarknet-foundryScarb安装Scarb 安装starknet-foundry通过snfoundryupStarknet Foundry的snforge 命令行工具如何创建新项目、编译和测试snc…

Linux驱动开发学习笔记2《LED驱动开发试验》

目录 一、Linux下LED灯驱动原理 1.地址映射 二、硬件原理图分析 三、实验程序编写 1.LED 灯驱动程序编写 2.编写测试APP 四、运行测试 1.编译驱动程序和测试APP &#xff08;1&#xff09;编译驱动程序 &#xff08;2&#xff09;编译测试APP 2.运行测试 一、Linux下…

jsp高校教师调课管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 高校教师调课管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysq…

9. 双向队列

在队列中&#xff0c;我们仅能删除头部元素或在尾部添加元素。如下图所示&#xff0c;双向队列(double-ended queue)提供了更高的灵活性&#xff0c;允许在头部和尾部执行元素的添加或删除操作。 9.1 双向队列常用操作 双向队列的常用操作如下表所示&#xff0c;具体的方法名称…

Ubuntu 22.04安装mysql-server 8.0.34(使用bundle.tar)

《Ubuntu 20.04 使用mysql-server_8.0.31-1ubuntu20.04_amd64.deb-bundle.tar安装MySQL 8.0.31》是我以前写的博客。 https://downloads.mysql.com/archives/community/是社区版的官网&#xff0c;可以选择版本下载。 sudo wget -c https://downloads.mysql.com/archives/ge…

express搭建后台node接口

在前端的学习中我们使用express来开发接口结合mysql&#xff0c;然后使用可视化的数据库工具来操作数据&#xff0c; web框架是express 文档是jsdoc swagger 数据库模型是sequelize 部署使用PM2来上服务器&#xff0c; 打包你也可以结合webpack配置target node状态 当然你也可以…

自动驾驶学习笔记(十四)——感知算法

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo Beta宣讲和线下沙龙》免费报名—>传送门 文章目录 前言 感知算法 开发过程 测试和评价 前言…

006、简单页面-列表页面

之——Grid&List 杂谈 数据列表的使用。 在我们常用的手机应用中&#xff0c;经常会见到一些数据列表&#xff0c;如设置页面、通讯录、商品列表等。 ​ 正文 1.列表组件 列表中都包含一系列相同宽度的列表项&#xff0c;连续、多行呈现同类数据&#xff0c;例如图片和文本…

idea报错——Access denied for user ‘root‘@‘localhost‘ (using password: YES)

项目场景&#xff1a; 使用idea启动SpringBoot项目报错&#xff0c;可以根据提示看到是数据库的原因&#xff0c;显示使用了密码&#xff0c;具体报错信息如下&#xff1a; 解决方案&#xff1a; 第一步&#xff1a;先去配置文件里面查看连接MySQL的url是否正确&#xff0c;如果…

Linux 上的容器技术

容器实现封闭的环境主要要靠两种技术&#xff0c;一种是看起来是隔离的技术&#xff0c;称为 namespace&#xff08;命名空间&#xff09;。在每个 namespace 中的应用看到的&#xff0c;都是不同的 IP 地址、用户空间、进程 ID 等。另一种是用起来是隔离的技术&#xff0c;称为…

Python标准库:datetime模块【侯小啾python领航班系列(二十五)】

Python标准库:datetime模块【侯小啾python领航班系列(二十五)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ…

字符串经典基础面试题

关卡名 字符串经典基础面试题 我会了✔️ 内容 1.理解字符串反转的处理方法 ✔️ 2.熟练掌握回文串的判断方法 ✔️ 3.掌握字符串中搜索第一个唯一字符的方法 ✔️ 4.掌握判断是否互为字符串重排的处理技巧 ✔️ 1 反转的问题 我们知道反转是链表的一个重要考点&#xf…

STM32F407-14.3.10-01PWM模式

PWM 模式 脉冲宽度调制模式可以生成一个信号&#xff0c;该信号频率由 TIMx_ARR⑩ 寄存器值决定&#xff0c;其占空比由 TIMx_CCRx⑤ 寄存器值决定。 通过向 TIMx_CCMRx 寄存器中的 OCxM⑰ 位写入 110 &#xff08;PWM 模式 1&#xff09;或 111 &#xff08;PWM 模式 2&#…

Linux(13):例行性工作排程

例行性工程 听谓的排程是将工作安排执行的流程之意。 Linux 排程就是透过 crontab 与 at 这两个东西。 两种工作排程的方式&#xff1a; 一种是例行性的&#xff0c;就是每隔一定的周期要来办的事项&#xff1b; 一种是突发性的&#xff0c;就是这次做完以后就没有的那一种&a…

一、CSharp_Basic:什么是.Net平台?什么是.Net FrameWork?什么是C#?

什么是.Net平台&#xff1f; 在了解C#之前&#xff0c;我们应该先了解一下什么是.Net平台。 .Net的诞生 2000年&#xff0c;这时候的微软凭借其Windows操作系统庞大的用户基数&#xff0c;推出了.Net1.0的标准。 也就是实现在Windows平台上面开发和应用程序的概念。我们可以简…

CCFCSP试题编号:202006-2试题名称:稀疏向量

不断匹配相乘累加就好了 #include<iostream> #include<vector> #include <utility> using namespace std;int main() {int n;int a, b;long long result0; // 使用 long long cin >> n >> a >> b;vector<pair<int, int> > u…

什么是类和对象?this引用是什么?Java如何初始化对象?

目录 一.什么是面向对象 面向过程&#xff1a; 面向对象&#xff1a; 二.类与对象 类的概念 类的定义格式 对象的概念 注意 关于类和对象的说明 三.this引用 为什么要有this引用&#xff1f; 什么是this引用 this引用的特性 四.对象的构造及初始化 构造方法 特…