Java 集合:强大的数据管理工具
在 Java 编程中,集合是一种非常重要的工具,它提供了一种方便的方式来存储和操作一组对象。本文将深入探讨 Java 集合框架,包括其主要类型、特点、用法以及一些最佳实践。
一、引言
在软件开发过程中,我们经常需要处理一组数据。Java 集合框架为我们提供了一系列的接口和类,使得我们可以轻松地管理和操作这些数据集合。无论是存储简单的整数列表,还是复杂的自定义对象集合,Java 集合框架都能提供高效、灵活的解决方案。
二、Java 集合框架概述
Java 集合框架是一组用于存储和操作集合的接口和类。它提供了以下主要优点:
- 统一的编程接口:无论使用哪种具体的集合类型,都可以使用相同的方法来进行操作,如添加、删除、遍历等。
- 高效的实现:Java 集合框架中的类经过了高度优化,能够提供高效的存储和检索性能。
- 可扩展性:可以根据需要扩展集合框架,实现自定义的集合类型。
Java 集合框架主要包括以下接口:
- Collection:表示一组对象的集合,是集合框架的根接口。它提供了添加、删除、遍历等基本操作。
- List:继承自Collection接口,代表有序的集合,可以通过索引访问元素。
- Set:继承自Collection接口,代表无序的集合,不允许包含重复元素。
- Map:表示键值对的集合,通过键来访问对应的值。
此外,集合框架还提供了一系列的实现类,如ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等。
三、List 接口及其实现类
(一)List 接口的特点
- 有序性:List 中的元素是按照插入的顺序进行存储的,可以通过索引访问元素。
- 可重复:List 允许包含重复的元素。
(二)常见的 List 实现类
- ArrayList:
-
- 基于动态数组实现,随机访问元素的速度非常快。
-
- 在添加和删除元素时,需要移动大量的元素,因此性能相对较低。
-
- 适用于需要频繁随机访问元素的场景。
-
- 示例代码:
import java.util.ArrayList;
import java.util.List;
public class ArrayListExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("orange");
System.out.println("List size: " + list.size());
System.out.println("Element at index 1: " + list.get(1));
list.remove(1);
System.out.println("List after removal: " + list);
}
}
- LinkedList:
-
- 基于双向链表实现,在添加和删除元素时性能较高。
-
- 随机访问元素的速度相对较慢。
-
- 适用于需要频繁添加和删除元素的场景。
-
- 示例代码:
import java.util.LinkedList;
import java.util.List;
public class LinkedListExample {
public static void main(String[] args) {
List<String> list = new LinkedList<>();
list.add("apple");
list.add("banana");
list.add("orange");
System.out.println("List size: " + list.size());
System.out.println("First element: " + list.getFirst());
System.out.println("Last element: " + list.getLast());
list.removeFirst();
System.out.println("List after removal: " + list);
}
}
四、Set 接口及其实现类
(一)Set 接口的特点
- 无序性:Set 中的元素没有特定的顺序。
- 唯一性:Set 不允许包含重复的元素。
(二)常见的 Set 实现类
- HashSet:
-
- 基于哈希表实现,添加、删除和查找元素的速度非常快。
-
- 不保证元素的顺序。
-
- 适用于需要快速查找和存储不重复元素的场景。
-
- 示例代码:
import java.util.HashSet;
import java.util.Set;
public class HashSetExample {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("apple");
set.add("banana");
set.add("orange");
set.add("apple"); // 重复元素不会被添加
System.out.println("Set size: " + set.size());
for (String element : set) {
System.out.println(element);
}
}
}
- TreeSet:
-
- 基于红黑树实现,元素按照自然顺序或自定义的比较器进行排序。
-
- 适用于需要有序存储不重复元素的场景。
-
- 示例代码:
import java.util.Set;
import java.util.TreeSet;
public class TreeSetExample {
public static void main(String[] args) {
Set<String> set = new TreeSet<>();
set.add("apple");
set.add("banana");
set.add("orange");
System.out.println("Set size: " + set.size());
for (String element : set) {
System.out.println(element);
}
}
}
五、Map 接口及其实现类
(一)Map 接口的特点
- 键值对存储:Map 存储的是键值对,通过键来访问对应的值。
- 键的唯一性:Map 中的键必须是唯一的。
(二)常见的 Map 实现类
- HashMap:
-
- 基于哈希表实现,添加、删除和查找键值对的速度非常快。
-
- 不保证键的顺序。
-
- 适用于需要快速存储和检索键值对的场景。
-
- 示例代码:
import java.util.HashMap;
import java.util.Map;
public class HashMapExample {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("apple", 5);
map.put("banana", 3);
map.put("orange", 7);
System.out.println("Value for 'apple': " + map.get("apple"));
System.out.println("Map size: " + map.size());
map.remove("banana");
System.out.println("Map after removal: " + map);
}
}
- TreeMap:
-
- 基于红黑树实现,键按照自然顺序或自定义的比较器进行排序。
-
- 适用于需要有序存储键值对的场景。
-
- 示例代码:
import java.util.Map;
import java.util.TreeMap;
public class TreeMapExample {
public static void main(String[] args) {
Map<String, Integer> map = new TreeMap<>();
map.put("apple", 5);
map.put("banana", 3);
map.put("orange", 7);
System.out.println("Value for 'apple': " + map.get("apple"));
System.out.println("Map size: " + map.size());
map.remove("banana");
System.out.println("Map after removal: " + map);
}
}
六、Java 集合的遍历
Java 集合可以通过多种方式进行遍历,以下是一些常见的方法:
- 使用迭代器(Iterator):
-
- Iterator是一个接口,用于遍历集合中的元素。
-
- 可以使用iterator()方法获取集合的迭代器,然后通过hasNext()和next()方法来遍历集合。
-
- 示例代码:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("orange");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
System.out.println(element);
}
}
}
- 使用增强型 for 循环(foreach 循环):
-
- 增强型 for 循环可以简洁地遍历集合中的元素。
-
- 语法为for (元素类型 元素变量 : 集合)。
-
- 示例代码:
import java.util.ArrayList;
import java.util.List;
public class ForEachExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("orange");
for (String element : list) {
System.out.println(element);
}
}
}
- 使用forEach()方法(Java 8 及以上版本):
-
- Java 8 引入了forEach()方法,可以使用 Lambda 表达式来遍历集合。
-
- 示例代码:
import java.util.ArrayList;
import java.util.List;
public class ForEachMethodExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("orange");
list.forEach(element -> System.out.println(element));
}
}
七、Java 集合的选择与性能考虑
在选择使用哪种集合类型时,需要考虑以下因素:
- 数据的特点:
-
- 如果需要存储有序的数据,可以选择List接口的实现类。
-
- 如果需要存储不重复的数据,可以选择Set接口的实现类。
-
- 如果需要存储键值对,可以选择Map接口的实现类。
- 操作的需求:
-
- 如果需要频繁随机访问元素,可以选择ArrayList。
-
- 如果需要频繁添加和删除元素,可以选择LinkedList。
-
- 如果需要快速查找和存储不重复元素,可以选择HashSet或HashMap。
-
- 如果需要有序存储元素,可以选择TreeSet或TreeMap。
- 性能考虑:
-
- 不同的集合类型在不同的操作上性能表现不同。例如,ArrayList在随机访问元素时性能较好,而LinkedList在添加和删除元素时性能较好。
-
- 在选择集合类型时,可以进行性能测试,以确定最适合特定场景的集合类型。
八、Java 集合的最佳实践
- 选择合适的集合类型:根据数据的特点和操作需求选择合适的集合类型,以提高性能和代码的可读性。
- 避免使用原始类型的集合:尽量使用泛型集合,以避免类型安全问题。
- 注意集合的可变与不可变:如果需要不可变的集合,可以使用Collections.unmodifiableXXX()方法来创建不可变的视图。
- 处理集合的空值:在使用集合时,要注意处理可能出现的空值情况,以避免空指针异常。
- 合理使用迭代器:在遍历集合时,使用迭代器可以避免并发修改异常等问题。
九、结论
Java 集合框架是 Java 编程中非常重要的一部分,它提供了丰富的接口和类,使得我们可以方便地存储和操作一组对象。通过选择合适的集合类型,并遵循最佳实践,我们可以提高代码的性能和可读性。在实际开发中,我们应该根据具体的需求来选择合适的集合类型,并灵活运用集合的各种方法和特性,以实现高效的数据管理。
相关文章:
Java 集合:强大的数据管理工具
在 Java 编程中,集合是一种非常重要的工具,它提供了一种方便的方式来存储和操作一组对象。本文将深入探讨 Java 集合框架,包括其主要类型、特点、用法以及一些最佳实践。 一、引言 在软件开发过程中,我们经常需要处理一组数据。…...
Creating Server TCP listening socket *:6379: bind: No error
启动redis报错:Creating Server TCP listening socket *:6379: bind: No error 解决方案: 1、直接在命令行中输入 redis-cli.exe 2、输入shutdown,关闭 3、输exit,退出 4、重新输入 redis-server.exe redis.windows.conf&…...
iOS免费共享企业证书、苹果最新企业证书免费获取
前言 大家可能都注意到了,苹果手机和安卓手机在安装软件上有点不一样。如果你在苹果手机上想装那些没在官方商店(App Store)里的软件,那就得给它们“签个名”,就像是给它们盖个章,这样手机才能认识它们&am…...
如果用Python写爬虫,具体怎么实现随机请求间隔呢?
在Python中实现随机请求间隔,通常使用time.sleep()函数结合random模块来生成随机的等待时间。以下是一个具体的实现方法: 导入必要的模块 首先,你需要导入time和random模块: import time import random 设置随机间隔 然后&am…...
aws(学习笔记第十五课) 如何从灾难中恢复(recover)
aws(学习笔记第十五课) 如何从灾难中恢复 学习内容: 使用CloudWatch对服务器进行监视与恢复区域(region),可用区(available zone)和子网(subnet)使用自动扩展(AutoScalingGroup) 1. 使用CloudWatch对服务器进行监视与恢复 整体架构 这里模拟Jenkins Se…...
nginx4层限速
Nginx的功能概述 Nginx是一个高性能的HTTP和反向代理服务器,也可以作为邮件代理服务器等。它主要工作在7层(应用层),但在某些场景下也可以实现部分4层(传输层)的功能。 关于4层限速 Nginx自身的限制&#x…...
Spring Cloud Alibaba 之 “Feign多参数构造”
在上一篇文章整合好了Feign,现在来总结以下Feign调用多参数方法的使用。 GET方式: Spring Cloud为Feign支持了Spring Mvc注解的。如果请求的是localhost:8083/test?id1&namecoco,那么如果我们这样写(User实体类有这二个属性)…...
C#高级教程
目录 C# 特性(Attribute)C# 反射(Reflection)C# 属性(Property)C# 索引器(Indexer)C# 委托(Delegate)C# 事件(Event)C# 集合…...
c++ 位图和布隆过滤器
位图(bitmap) 定义 位图是一种使用位数组存储数据的结构。每一位表示一个状态,通常用于快速判断某个值是否存在,或者用来表示布尔类型的集合。 特点 节省空间:一个字节可以表示8个状态。高效操作:位操作…...
基于Springboot开发的云野旅游平台
一、功能介绍 云野旅游平台包含管理员、用户两个角色以及前后台系统。 前台系统功能 用户登录成功后,可以进行查看旅游路线、最新线路、旅游资讯、个人中心、后台管理、购物车、客服等功能模块。进行相对应操作。 后台系统功能 管理员或用户登录成功后…...
微服务即时通讯系统(5)用户管理子服务,网关子服务
用户管理子服务(user文件) 用户管理子服务也是这个项目中的一个业务最多的子服务,接口多,但是主要涉及的数据表只有user表,Redis的键值对和ES的一个搜索引擎,主要功能是对用户的个人信息进行修改管理&#…...
docker.io连接超时的处理,用代理网站
docker pull的时候会超时: Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers) 这时可以找一些代理网站,比如…...
【测试工具JMeter篇】JMeter性能测试入门级教程(四):JMeter中BeanShell内置方法使用
一、什么是BeanShell BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;BeanShell是一种松散类型的脚本语言(这点和JS类似);BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性,非常精简…...
JavaScript 键盘控制移动
如果你想通过 JavaScript 实现键盘控制对象(比如一个方块)的移动,下面是一个简单的示例,展示如何监听键盘事件并根据按下的键来移动一个元素。 HTML 和 CSS: <!DOCTYPE html> <html lang"en">…...
如何预防服务器后台爆破攻击
服务器后台爆破(Brute Force Attack)是一种通过反复尝试用户名和密码组合,以非法获取系统访问权限的攻击方式。这种攻击不仅会消耗服务器资源,还可能导致合法用户被锁定或敏感数据泄露。为了有效预防服务器后台爆破攻击࿰…...
AI 写作(一):开启创作新纪元(1/10)
一、AI 写作:重塑创作格局 在当今数字化高速发展的时代,AI 写作正以惊人的速度重塑着创作格局。AI 写作在现代社会中占据着举足轻重的地位,发挥着不可替代的作用。 随着信息的爆炸式增长,人们对于内容的需求日益旺盛。AI 写作能够…...
【HarmonyOS】鸿蒙应用使用lottie动画
【HarmonyOS】鸿蒙应用使用lottie动画 一、lottie动画是什么? https://airbnb.design/lottie Lottie是由Airbnb团队开发的一个适用于iOS、Android、React Native、Web和Windows的开源动画库,用于解析使用Bodymovin导出为JSON的Adobe After Effects动…...
SQL面试题——腾讯SQL面试题 合并连续支付订单
合并连续支付订单 现有一张用户支付表:user_pay包含字段订单ID,用户ID,商户ID,支付时间,支付金额。如果同一用户在同一商户存在多笔订单,且中间该用户没有其他商户的支付记录,则认为是连续订单,请把连续订单进行合并,时间取最早支付时间,金额求和。 +----------+------…...
【docker】10. 容器操作案例
容器操作案例 容器基本操作 • 通过 nginx 镜像文件创建容器 • 容器的列举(包含正在运行的容器) # 发现此时 e7c33d9f5c61 这个容器运行的状态为 Up,即运行状态 rootLAPTOP-H2EI4I6A:~# docker container ls CONTAINER ID IMAGE COMMAND CREATED …...
postman测试
当然,以下是针对你提供的API层和Service层代码中涉及到的各个接口,如何使用 Postman 进行详细测试的指南。这个指南将帮助你理解如何配置 Postman 来测试这些接口,包括请求的构造、认证的处理、以及如何解读响应。 目录 准备工作接口测试指…...
【攻防实验】溯源与取证分析实验
溯源与取证分析实验 溯源取证分析作为网络攻防过程中重要环节,准确找到攻击者的入侵线索(尤其是攻击突破口、攻击IP地址、域名、工具等信息),对于企业或者团队安全运营团队来说都是必备技能。常规攻击取证过程中往往会结合流量、Web访问日志、终端系统或…...
【测试工具JMeter篇】JMeter性能测试入门级教程(七):JMeter断言
一、前言 在 JMeter 中,断言元件(Assertion)用于验证测试结果是否符合预期。断言元件可以检查服务器的响应数据,以确保它们符合期望的模式或值,从而验证性能测试脚本的正确性。断言元件通常在每个请求的响应中添加&am…...
Linux 常用命令
目录 一、ls 指令 二、pwd命令 三、cd 指令 1、cd 目录名 2、cd .. 返回上级目录 3、cd ~ 进入用户家目 4、cd - 返回最近访问目录 5、cd相对路径&&cd绝对路径 四、touch指令 五、mkdir指令 1、mkdir 目录名 创建一个目录 2、mkdir -p 递归创建多…...
汽车IVI中控OS Linux driver开发实操(二十八):回声消除echo cancellation和噪声消除Noise reduction
概述: 在当今高度互联的世界中,清晰的实时通信比以往任何时候都更重要。在远程团队会议期间,没有什么能像回声一样打断对话。当说话者听到他们的声音回响时,可能会分散注意力,甚至无法理解对话。即使是很小的回声也会产生很大的影响,仅仅25毫秒的振幅就足以造成声音干扰…...
003-SpringBoot整合Pagehelper
SpringBoot整合Pagehelper 一、引入依赖二、配置 application.yml三、配置 MybatisPlusConfig四、Controller五、ServiceImpl 一、引入依赖 <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</ar…...
零基础学安全--shell练习
目录 用shell写一个计算器 测试 一些小问题 n阶乘数 测试 拓展 写⼀个Shell脚本去筛选出eth0⽹卡的ipv4地址,并赋值⼀个变量输出 测试 无限重启 用shell写一个计算器 read -p "请输入数字a: " number1 read -p "请输入操作符…...
【专题】计算机网络之运输层(传输层)
1. 运输层协议概述 1.1 进程之间的通信 (1) 运输层的作用 运输层提供进程间的逻辑通信。 运输层的屏蔽作用: 运输层向高层用户屏蔽了下面网络核心的细节(如网络拓扑、所采用的路由选择协议等),使应用进程看见的就是好像在两个运…...
【leetcode100】旋转图像
1、题目描述 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1: 输入:matrix [[1,2,3],[4,5,6],…...
软件工程——期末复习(1)
名词解释: 名词解释--人月 答案:人月是软件开发工作量的单位,1人月表示1个程序员1个月的工作时间所开发的代码量。 请解释软件缺陷、错误和失败,并简单举例说明。 答案:缺陷(defect)指系统代…...
HTML5系列(3)--多媒体标签详解
前端技术探索系列:HTML5 多媒体标签详解 🎥 开篇寄语 👋 前端开发者们, 在前三篇文章中,我们探讨了 HTML5 的语义化和表单特性。今天,让我们深入了解 HTML5 的多媒体能力,看看如何构建强大的…...
Spring Boot 3.4.0 发布:功能概览与示例
Spring Boot 3.4.0 带来了许多增强功能,使现代应用开发更加高效、便捷和强大。以下是最新功能的完整概述,以及一些帮助您快速入门的代码示例。 1. 应用程序版本管理 Spring Boot 引入了 spring.application.version 属性,方便开发者设置和访…...
【Vue3】【Naive UI】<n-upload>标签
【Vue3】【Naive UI】标签 基本设置 【VUE3】【Naive UI】<NCard> 标签 【VUE3】【Naive UI】<n-button> 标签 【VUE3】【Naive UI】<a> 标签 【VUE3】【Naive UI】<NDropdown> 标签…...
7.代理模式(Proxy Pattern)
古朗月行 代理模式JDK动态代理代码示例原码分析 cglib动态代理代码示例源码分析 JDK cglib动态代理对比ClassLoader类的生命周期: 参考资料 唐 李白 小时不识月,呼作白玉盘。 又疑瑶台镜,飞在青云端。 仙人垂两足,桂树何团团。…...
【效果】回到顶部功能实现
实现效果: 相关代码: <template><div class"cats" :style"{ top: catsTop }" ref"cats" click"catTop"></div> </template> 样式: /* 回到顶部 - 小猫咪 */ .cats {posi…...
项目搭建+修改
一 : 在列表成功回调函数,追加数据中,添加修改的按钮 for (let x of res) {//追加数据$("#table").append(<tr><td><input type"checkbox" class"ck" value"\${x.uid}"></td><td>\${x.uid}</td>…...
GD库如何根据颜色生成纯色背景图
GD库是一个用于图像处理的PHP扩展模块,它提供了一系列函数来创建、编辑和操作图像。要使用GD库根据颜色生成纯色背景图,可以按照以下步骤进行: 一、检查并安装GD库 检查GD库是否已安装: 可以通过运行phpinfo();或在命令行中使用p…...
Python 网络爬虫入门全知道
一、引言 在当今数字化时代,网络上的数据量呈爆炸式增长。无论是进行数据分析、市场调研,还是开发智能应用,获取网络数据都变得极为重要。而 Python 网络爬虫就是一把打开网络数据宝库的利器。它能够自动地从网页中抓取我们需要的信息&#…...
MATLAB期末复习笔记(下)
目录 五、数据和函数的可视化 1.MATLAB的可视化对象 2.二维图形的绘制 3.图形标识 4.多子图绘图 5.直方图的绘制 (1)分类 (2)垂直累计式 (3)垂直分组式 (4)水平分组式 &…...
基于大数据爬虫数据挖掘技术+Python的网络用户购物行为分析与可视化平台(源码+论文+PPT+部署文档教程等)
#1024程序员节|征文# 博主介绍:CSDN毕设辅导第一人、全网粉丝50W,csdn特邀作者、博客专家、腾讯云社区合作讲师、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老…...
【go】只读通道和只写通道
文章目录 概述1. 通道的方向2. 为什么会有只读通道和只写通道?3. 总结 概述 在 Go 中,只读通道和只写通道的概念通过通道的方向来实现。Go 语言允许你在函数参数中指定通道的方向,从而限制通道的使用方式,这样可以确保代码的清晰…...
带Burst AOT Settings移植问题
报错 burst问题 Burst AOT Settings 是 Unity 的 Burst Compiler 的一部分,用于预编译程序集(AOT,Ahead-Of-Time Compilation),以便在不支持 JIT(即时编译)的平台上运行,例如 iOS 和…...
Debezium日常分享系列之:Debezium Engine
Debezium日常分享系列之:Debezium Engine 依赖打包项目在代码中输出消息格式消息转换消息转换谓词高级记录使用引擎属性异步引擎属性数据库模式历史属性处理故障 Debezium连接器通常通过部署到Kafka Connect服务来运行,并配置一个或多个连接器来监视上游…...
运行 GreatSQL 时为什么要求关闭透明大页
在大部分运维规范中,一般都会要求在运行 GreatSQL/MySQL 的环境中要关闭透明大页,那么到底什么是透明大页,为什么要关闭,打开有什么风险吗? 在此之前,我也是有点懵的,本文试着回答这个疑问&…...
【Rive】Rive在Android上的简单应用
1 前言 Rive 是一款强大的矢量图编辑器,可以设计图形、也可以制作动画。Rive 提供了矩形、圆形、三角形、多边形、星形、钢笔、文字等工具来绘制各式各样的矢量图形;提供了平移、旋转、缩放等工具对矢量图形进行各种变换;提供了骨骼、约束、时…...
Base 崛起,SynFutures 或成生态系统中最具潜力应用
10月份的 Unchained Crypto 采访中,Solana 联合创始人 Anatoly 表示,通过观察活跃地址数、TVL、DeFi 版块、Meme 热潮和开发者生态等多个关键指标,察觉到 Base 势头正猛,成为以太坊生态最强劲的 L2。 11月下旬,小狐狸创…...
探索Go语言中的循环双向链表
简介 循环双向链表将双向链表的灵活性与循环结构相结合,使得每个节点都有一个指向前一个节点和后一个节点的指针,并且最后一个节点的Next指针指向头节点,形成一个闭环。本文将深入探讨如何在Go语言中实现和操作这种数据结构。 循环双向链表…...
Leetcode617.合并二叉树(HOT100)+Leetcode79. 单词搜索(HOT100)
链接 代码: class Solution { public:TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {if(!root1)return root2;if(!root2)return root1;root1->valroot2->val;root1->left mergeTrees(root1->left,root2->left);root1->right merg…...
亚马逊云(AWS)使用root用户登录
最近在AWS新开了服务器(EC2),用于学习,遇到一个问题就是默认是用ec2-user用户登录,也需要密钥对。 既然是学习用的服务器,还是想直接用root登录,下面开始修改: 操作系统是࿱…...
使用Docker在Ubuntu 22.04上部署MySQL数据库的完整指南
使用Docker在Ubuntu 22.04上部署MySQL数据库的完整指南 在现代应用开发中,使用Docker来部署数据库已成为一种流行的做法。本文将详细介绍如何在Ubuntu 22.04系统上使用Docker部署最新版本的MySQL数据库,包括关键注意事项、详细步骤、闭坑指南以及总结。…...
算法笔记:力扣15、三数之和
思路: 实现代码 class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> result new ArrayList<>(); Arrays.sort(nums); // 先对数组进行排序 for (int i 0; i < nums.length - 2; i) { /…...