学习日志06 java
还有四天要去比赛了,能赢吗?逼自己一把。。。!!加油!
1 对比一下java重写还是不重写tostring的区别
1. 不重写 toString()
的情况
java
class Point {private int x;private int y;public Point(int x, int y) {this.x = x;this.y = y;}
}public class Main {public static void main(String[] args) {Point p = new Point(10, 20);System.out.println(p); // 直接打印对象System.out.println(p.toString()); // 显式调用 toString()}
}
输出结果:
Point@1b6d3586
Point@1b6d3586
分析:
- 默认行为:所有类继承自
Object
,默认的toString()
返回类名@哈希码
。 - 问题:返回值无法提供对象的实际状态(如
x
和y
的值),对调试和日志不友好。
2. 重写 toString()
的情况
java
class Point {private int x;private int y;public Point(int x, int y) {this.x = x;this.y = y;}// 重写 toString() 方法@Overridepublic String toString() {return "Point{x=" + x + ", y=" + y + "}";}
}public class Main {public static void main(String[] args) {Point p = new Point(10, 20);System.out.println(p); // 自动调用 toString()System.out.println(p.toString()); // 显式调用}
}
输出结果:
Point{x=10, y=20}
Point{x=10, y=20}
分析:
- 自定义格式:重写后返回包含对象属性的字符串,直观展示对象状态。
- 自动调用:
System.out.println(p)
会隐式调用p.toString()
。
3. 核心区别总结
对比项 | 不重写 toString() | 重写 toString() |
---|---|---|
返回值 | 类名@哈希码 (如 Point@1b6d3586 ) | 自定义格式(如 Point{x=10, y=20} ) |
可读性 | 低(无法获取对象状态) | 高(清晰展示属性值) |
应用场景 | 无实际意义,仅用于标识对象内存地址 | 调试、日志记录、UI 展示对象信息 |
调用方式 | 手动调用 obj.toString() 才有输出 | 自动调用(如 print(obj) 或字符串拼接时) |
4. 常见误区澄清
-
误区 1:“不重写
toString()
就不能打印对象”
✅ 错误:可以打印,但输出的是无意义的哈希码。 -
误区 2:“只有
System.out.println()
会调用toString()
”
✅ 错误:所有需要字符串的场景都会自动调用,例如:java
String s = "Point: " + p; // 等价于 "Point: " + p.toString()
-
误区 3:“重写
toString()
会影响对象的其他功能”
✅ 错误:toString()
仅用于生成字符串表示,不影响对象的核心逻辑。
5. 最佳实践
- 所有自定义类都应重写
toString()
,方便调试和日志记录。 - 格式推荐:使用 JSON 风格(如
{key=value}
)或明确的描述性文本。 - IDE 自动生成:大多数 IDE(如 IntelliJ、Eclipse)可自动生成
toString()
代码。例如:java
// IntelliJ 自动生成的 toString() @Override public String toString() {return "Point{" +"x=" + x +", y=" + y +'}'; }
通过重写 toString()
,可以让对象在打印时提供有价值的信息,避免输出无意义的内存地址,这是 Java 开发中的基础规范之一。
2 对比一下我写的代码和优雅的代码,需要进步
我写的,也是敢于接受批评直接全部放上了哈。题目也在里面
package PTA_training;
/*
7-3 定义商品类,封装成员变量,输出对象
定义一个商品类。创建对象并按指定格式输出它。
商品类要求:
(1)成员变量:商品编号(String) 、商品名称(String)、商品单价(double)
(2)成员变量封装,定义为私有属性,并为每个成员变量定义getXXXX,setXXXX方法
(3)定义构造方法,要求带三个参数,参数值用于给成员变量赋值。
(4)重写toString()方法,将对象转换为字符串,格式:商品编号,商品名称,商品单价
测试类要求:
按指定的格式 输入商品信息,调用构造方法生成对象,并输出它。
例:输入:WJ002 记事本 5.5
输出:WJ002,记事本,5.5
输入商品的信息,每个属性值之间用1个空格分隔。
输出 格式,商品的每个属性值之间用逗号分隔。
输入样例:
WJ002 记事本 5.5
输出样例:
WJ002,记事本,5.5*/import java.util.Scanner;public class Demo2_3 {private String number ;private String name;private double price;public void setNumber(String number){this.number=number;}public String getNumber() {return number;}public void setName(String name) {this.name = name;}public String getName() {return name;}public void setPrice(double price) {this.price = price;}public double getPrice() {return price;}public Demo2_3(String number ,String name ,double price){this.number=number;this.name=name;this.price=price;}@Overridepublic String toString() {return number+","+name +"," +price;}public static void main(String[] args) {Scanner scanner =new Scanner(System.in);String number= scanner.next();String name= scanner.next();double price= scanner.nextDouble();Demo2_3 a = new Demo2_3(number,name,price);System.out.println(a);scanner.close();}
}
ai生成优化的优雅的代码
package PTA_training;import java.util.Scanner;public class Product {private final String id;private final String name;private final double price;public Product(String id, String name, double price) {this.id = id;this.name = name;this.price = price;}public String getId() { return id; }public String getName() { return name; }public double getPrice() { return price; }@Overridepublic String toString() {return String.format("%s,%s,%.1f", id, name, price);}public static void main(String[] args) {try (Scanner scanner = new Scanner(System.in)) {Product product = new Product(scanner.next(),scanner.next(),scanner.nextDouble());System.out.println(product);}}
}
代码对比分析
以下是你的代码与优化版本的详细对比:
对比项 | 你的代码 | 优化版本 |
---|---|---|
类命名 | Demo2_3 (无明确语义) | Product (清晰表达业务含义) |
成员变量 | number (普通描述) | id (专业术语) |
无final 修饰 | final 修饰(不可变对象) | |
构造方法 | 参数顺序与输入一致 | 保持相同参数顺序 |
getter/setter | 完整实现(有 setter) | 仅保留 getter(数据不可变) |
toString() | 简单字符串拼接 | String.format (精确控制格式) |
资源管理 | 未关闭 Scanner(原来忘记关了55) | try-with-resources(自动关闭) |
main 方法 | 多个局部变量 | 直接构造对象(减少临时变量) |
输出格式 | 直接拼接(可能出现多位小数) | %.1f (强制保留 1 位小数) |
业务封装 | 功能集中在一个类 | 职责分离(商品类专注业务) |
线程安全 | 可变对象 | 不可变对象(线程安全) |
代码行数 | 48 行 | 32 行(减少 33%) |
具体改进点解释
-
命名优化
Product
类名明确表示这是一个商品模型id
属性更符合专业领域术语(如数据库设计)
-
不可变设计
java
// 你的代码 private String number; // 可修改// 优化后 private final String id; // 不可变
不可变对象在多线程环境中更安全,且符合数据封装原则
-
格式化输出
java
// 你的代码 return number+","+name +"," +price; // 可能输出5.5000// 优化后 return String.format("%s,%s,%.1f", id, name, price); // 强制保留1位小数
-
资源管理
java
// 你的代码 Scanner scanner = new Scanner(System.in); // 需要手动关闭// 优化后 try (Scanner scanner = new Scanner(System.in)) { // 自动关闭// 使用scanner }
-
代码精简
java
// 你的getter public String getNumber() {return number; }// 优化后的getter public String getId() { return id; } // 单行格式
为什么这些改进更好
-
可维护性:语义化命名和清晰的结构使代码更易于理解和修改
-
健壮性:
- 不可变对象减少了程序状态的复杂性
- 资源自动关闭避免了内存泄漏风险
-
专业性:
- 使用领域术语(如
id
)体现专业素养 - 精确的格式控制符合企业级应用要求
- 使用领域术语(如
-
性能:
- String.format 在频繁格式化时性能更优
- 减少不必要的对象创建(如临时变量)
-
扩展性:
- 职责分离的设计更容易添加新功能
- 不可变对象支持函数式编程范式
建议在后续学习中关注:
- 面向对象设计原则(SOLID)
- Java 8+ 的函数式特性
- 单元测试与代码覆盖率
- 代码静态分析工具(如 SonarLint)的使用
================================可以了接下来就对着这个学习===================
谢谢伟大的AI!!!!
3 感受进步,初版(无法跑起来的代码)vs 满足题目要求的代码
package PTA_training;
/*
7-4 定义类与创建对象定义一个类Person,定义name和age属性,定义有参的构造方法对name和age进行初始化。
在测试类中创建该类的2个对象,姓名、年龄分别为lili、19和lucy、20,在屏幕打印出2个对象的姓名和年龄。
输入格式:
本题目无输入
输出格式:
在一行中输出一个人的姓名和年龄
输入样例:
在这里给出一组输入。例如:
输出样例:
在这里给出相应的输出。例如:
this person is lili,her age is 19
this person is lucy,her age is 20*/public class Demo2_4 {private static String name = null;public static String name1;public static String name2;public static int age = 0;public static int age1;public static int age2;public Demo2_4(String name, int age){Demo2_4.name =name;Demo2_4.age =age;name1 ="lili";name2 ="lucy";age1 = 19;age2 = 20;}@Overridepublic String toString() {return"this person is "+name+",her age is "+age;}public static void main(String[] args) {Demo2_4 a = new Demo2_4(name1,age1);Demo2_4 b = new Demo2_4(name2,age2);System.out.println(a);System.out.println(b);}public String getName() {return name;}public int getAge() {return age;}
}
//只给提示不给正确答案,这个代码有问题,我应该怎么办
提示:
你的代码有以下问题,按顺序解决它们:
- 类名错误:题目要求定义
Person
类,但你仍在使用Demo2_4
作为主类名 - 静态属性问题:
name
、age
等属性被声明为static
,导致所有对象共享同一属性- 静态属性会被最后一次赋值覆盖,无法保存多个对象的状态
- 构造函数逻辑错误:
- 在构造函数中固定设置
name1
、name2
、age1
、age2
的值 - 每次创建对象都会覆盖这些静态变量,导致数据混乱
- 在构造函数中固定设置
- 对象创建顺序问题:
- 在创建对象
a
和b
时,name1
和age1
尚未初始化(null
和0
) - 构造函数会先使用这些未初始化的值,然后再设置静态变量
- 在创建对象
提示:
- 创建
Person
类并定义非静态的name
和age
属性 - 在
Person
类的构造函数中直接初始化当前对象的属性(使用this.name
和this.age
) - 在测试类的
main
方法中创建两个Person
对象,分别传入 "lili",19 和 "lucy",20 作为参数 - 确保每个对象的属性独立保存,不使用静态变量
package PTA_training;public class Demo2_4 {String name;int age;public Demo2_4(String n, int a){this.name = n;this.age = a;}@Overridepublic String toString() {return"this person is "+name+",her age is "+age;}public static void main(String[] args) {Demo2_4 a = new Demo2_4("lili",19);Demo2_4 b = new Demo2_4("lucy",20);System.out.println(a);System.out.println(b);}}
//我改成这样了,对比一下给我进步
对比:
你的修改非常棒!现在代码已经完全符合题目要求了。主要改进包括:
-
类设计优化:
- 将
name
和age
改为实例变量(去掉了static
修饰符) - 每个对象现在拥有独立的属性值,不会相互干扰
- 将
-
构造函数修正:
- 直接通过参数初始化当前对象的属性(
this.name = n
) - 不再使用额外的静态变量(如
name1
,name2
)
- 直接通过参数初始化当前对象的属性(
-
对象创建方式:
- 在
main
方法中直接传入具体参数创建对象 - 正确初始化了两个不同的
Demo2_4
对象
- 在
-
输出格式:
- 通过重写
toString()
方法确保输出格式符合题目要求
- 通过重写
关键进步总结:
- 理解了实例变量和静态变量的区别
- 掌握了构造函数的正确使用方法
- 学会了通过对象实例化保存不同数据
最终建议:
根据题目要求,类名应该是Person
而不是Demo2_4
。虽然代码功能正确,但可能因为类名不符导致测试不通过。可以将类名改为Person
,其他部分保持不变即可:
java
public class Person {String name;int age;public Person(String n, int a) {this.name = n;this.age = a;}@Overridepublic String toString() {return "this person is " + name + ",her age is " + age;}public static void main(String[] args) {Person a = new Person("lili", 19);Person b = new Person("lucy", 20);System.out.println(a);System.out.println(b);}
}
这样就完全符合题目要求了!继续加油,你已经掌握了面向对象编程的基础概念。
4 我的最终代码和ai提供的最优雅代码
以下是优化后的代码,包含详细注释和最佳实践:
java
// 使用题目要求的类名Person
public class Person {// 使用private封装属性,提供公共访问方法private String name;private int age;// 构造方法:参数名与属性名保持一致,使用this区分public Person(String name, int age) {this.name = name; // this.name指类的属性,=右边的name是参数this.age = age;}// 提供公共的访问器方法(Getter)public String getName() {return name;}public int getAge() {return age;}// 重写toString方法,使用String.format提高可读性@Overridepublic String toString() {return String.format("this person is %s,her age is %d", name, age);}// 主方法作为程序入口public static void main(String[] args) {// 创建对象时直接传入字面量参数Person person1 = new Person("lili", 19);Person person2 = new Person("lucy", 20);// 打印对象自动调用toString()System.out.println(person1);System.out.println(person2);// 可选:演示如何通过访问器获取属性System.out.printf("Name: %s, Age: %d%n", person1.getName(), person1.getAge());}
}
关键优化点对比:
-
类设计:
- 使用
Person
作为类名(符合题目要求) - 将属性设为
private
(封装性原则) - 提供公共的
getter
方法(数据访问控制)
- 使用
-
构造方法:
java
// 原代码 public Demo2_4(String n, int a) { ... }// 优化后 public Person(String name, int age) { ... }
- 参数名与属性名保持一致(提高可读性)
- 使用
this
明确指向类属性
-
toString 方法:
java
// 原代码 return "this person is " + name + ",her age is " + age;// 优化后 return String.format("this person is %s,her age is %d", name, age);
- 使用
String.format
提高字符串拼接的可读性 - 占位符
%s
(字符串)和%d
(整数)使格式更清晰
- 使用
-
变量命名:
java
// 原代码 Demo2_4 a = new Demo2_4("lili", 19);// 优化后 Person person1 = new Person("lili", 19);
- 使用更具描述性的变量名
person1
、person2
- 类型名与变量名形成语义关联
- 使用更具描述性的变量名
-
可扩展性:
- 添加了
getName()
和getAge()
方法 - 为类未来的功能扩展预留接口
- 符合 JavaBean 规范(私有属性 + 公共访问器)
- 添加了
为什么这样设计更优雅:
-
遵循面向对象原则:
- 封装性:通过
private
属性和公共方法控制访问 - 可读性:类名、方法名、变量名均表意明确
- 可维护性:结构清晰,易于添加新功能
- 封装性:通过
-
代码健壮性:
- 避免直接访问属性(如
person.name = "xxx"
) - 通过方法可以添加逻辑校验(如年龄合法性检查)
- 避免直接访问属性(如
-
符合行业规范:
- 使用标准的 JavaBean 模式
- 字符串格式化优先使用
String.format
- 构造方法参数名与属性名一致
-
最佳实践:
- 为每个属性提供
getter
(如果需要修改,还应提供setter
) - 重写
toString()
以便调试和日志输出 - 使用有意义的变量名提高代码自解释性
- 为每个属性提供
---------------------------------------------------------------------------------------------------------------------------------这个时代有ai大模型实在是太好了!/(ㄒoㄒ)/
5 对自己所写的代码要有清晰的认知,细节明白,感谢ai注释
好的,让我们逐行分析这个代码,并解释每一步的作用:
java
public class Demo2_4 {// 定义类的属性(成员变量)String name; // 存储人的姓名,每个对象独立拥有int age; // 存储人的年龄,每个对象独立拥有// 构造方法:用于创建对象时初始化属性值public Demo2_4(String n, int a) {this.name = n; // 将参数n的值赋给当前对象的name属性this.age = a; // 将参数a的值赋给当前对象的age属性}// 重写toString()方法:控制对象打印时的输出格式@Overridepublic String toString() {return "this person is " + name + ",her age is " + age;}// 程序入口点public static void main(String[] args) {// 创建第一个对象:姓名"lili",年龄19Demo2_4 a = new Demo2_4("lili", 19);// 创建第二个对象:姓名"lucy",年龄20Demo2_4 b = new Demo2_4("lucy", 20);// 直接打印对象时,会自动调用对象的toString()方法System.out.println(a); // 输出:this person is lili,her age is 19System.out.println(b); // 输出:this person is lucy,her age is 20}
}
核心概念解释:
-
实例变量(非静态属性):
java
String name; int age;
- 每个对象独立拥有一份
name
和age
- 创建多个对象时,它们的属性值互不影响
- 每个对象独立拥有一份
-
构造方法:
java
public Demo2_4(String n, int a) {this.name = n;this.age = a; }
this.name
表示当前对象的name
属性- 参数
n
和a
是临时变量,仅在构造方法内部有效 - 作用:在创建对象时必须传入姓名和年龄,立即完成初始化
-
对象创建过程:
java
Demo2_4 a = new Demo2_4("lili", 19);
new Demo2_4("lili", 19)
:调用构造方法,创建一个新对象"lili"
和19
作为参数传递给构造方法- 构造方法将参数值赋给对象的
name
和age
属性 Demo2_4 a = ...
:将新创建的对象引用赋值给变量a
-
方法重写:
java
@Override public String toString() {return "this person is " + name + ",her age is " + age; }
@Override
:告诉编译器这是重写父类的方法toString()
是 Object 类的方法,所有对象都继承这个方法- 重写后,当你
System.out.println(a)
时,会自动调用这个方法
对比之前的错误:
你的原始代码中使用了静态变量:
java
private static String name = null;
public static int age = 0;
静态变量属于类,所有对象共享同一份数据。无论创建多少个对象,它们都会修改同一个name
和age
。
而现在的写法:
java
String name; // 实例变量
int age; // 实例变量
每个对象都有自己独立的name
和age
,互相不干扰。这是面向对象编程的基础概念。
//现在的学习方法让我感受到了进步!
相关文章:
学习日志06 java
还有四天要去比赛了,能赢吗?逼自己一把。。。!!加油! 1 对比一下java重写还是不重写tostring的区别 1. 不重写 toString() 的情况 java class Point {private int x;private int y;public Point(int x, int y) {th…...
spring中的@MapperScan注解详解
一、核心功能与作用 MapperScan是Spring与MyBatis框架集成时用于批量扫描Mapper接口的核心注解,其主要功能包括: 自动注册Mapper接口 通过指定包路径,Spring会自动扫描该路径下的所有Mapper接口,并将其注册为Spring Bean&#x…...
PYTHON训练营DAY25
BUG与报错 一、try else try:# 可能会引发异常的代码 except ExceptionType: # 最好指定具体的异常类型,例如 ZeroDivisionError, FileNotFoundError# 当 try 块中发生 ExceptionType 类型的异常时执行的代码 except: # 不推荐:捕获所有类型的异常&…...
视频图像压缩领域中 DCT 的 DC 系数和 AC 系数详解
引言 在数字图像与视频压缩领域,离散余弦变换(Discrete Cosine Transform, DCT)凭借其卓越的能量集中特性,成为JPEG、MPEG等国际标准的核心技术。DCT通过将空域信号映射到频域,分离出DC系数(直流分量&…...
YOLO v1:目标检测领域的革命性突破
引言 在计算机视觉领域,目标检测一直是一个核心任务,它不仅要识别图像中的物体类别,还要确定物体的精确位置。传统目标检测方法如R-CNN系列虽然准确率高,但计算复杂度高、速度慢。2016年,Joseph Redmon等人提出的YOLO…...
AI智能体 | 使用Coze一键制作“假如书籍会说话”视频,18个作品狂吸17.6万粉,读书博主新标杆!(附保姆级教程)
目录 一、整体工作流设计 二、制作工作流 2.1 开始节点 2.2 大模型_生成对话文案 2.3 代码_字幕切割 2.4 画板_对话背景 2.5 循环_对话语音01 2.5.1 选择器_2 2.5.2 语音合成02 2.5.3 语音合成03 2.5.4 变量聚合_1 2.5.5 视频合成01 2.6 循环_3 2.6.1 选择器_3 …...
HVV蓝队实战面试题
HVV蓝队实战,防守筹备之“部署蜜罐捕获横向扫描行为”。 蜜罐通过模拟内网脆弱服务(如SMB、SSH、数据库端口),诱捕攻击者突破边界后的横向探测行为。 通过监测高频端口扫描、非常规协议请求及非授权IP段遍历,结合多源…...
正则表达式(二)-高级应用_谨慎使用
没事建议别瞎用正则表达式,能让后端处理好的数据,尽量后端处理好,减少前端对数据的处理,保证数据原始的完整性,减少前端耗能。(其实就是懒╮(╯▽╰)╭) 1. 分组捕获 分组捕获用于提取匹配的子字符串,使用 () 定义分组。 示例:提取日期中的年、月、日 (\d{4})-(\d{2…...
在K8S集群中部署EFK日志收集
目录 引言环境准备安装自定义资源部署ElasticsearchMaster 节点与 Data 节点的区别生产优化建议安装好以后测试ES是否正常部署Fluentd测试filebeat是否正常推送日志部署Kibana获取账号密码,账号是:elastic集群测试 引言 系统版本为 Centos7.9内核版本为…...
解决常见数据库问题:保障数据安全与稳定的全方位指南
本文结合行业最佳实践与前沿技术,系统性总结数据库运维中的核心问题与解决方案,助力开发者构建高可靠、高性能的数据服务) 一、性能优化:从SQL到架构的全面调优 性能问题是数据库运维中最常见的挑战,直接影响用户体验…...
武汉科技大学人工智能与演化计算实验室许志伟课题组参加2025中国膜计算论坛
武汉科技大学人工智能与演化计算实验室许志伟课题组参加2025中国膜计算论坛 2025年5月9日至11日,第五届中国膜计算论坛(CWMC 2025)在成都信息工程大学隆重召开。会议由 国际膜计算学会(IMCS) 主办,汇聚了来…...
Femap许可硬件绑定
在电磁仿真领域,Femap软件因其卓越的性能和广泛的应用场景而备受用户青睐。为了确保软件的安全与稳定运行,Femap提供了许可硬件绑定的功能。本文将详细介绍Femap许可硬件绑定的概念和优势,帮助您了解并充分利用这一功能,确保软件在…...
构建优雅对象的艺术:Java 建造者模式的架构解析与工程实践
一、建造者模式的本质与核心价值 在面向对象的软件设计中,创建复杂对象一直是一个需要精心处理的问题。当一个对象的构建需要多个步骤,并且这些步骤具有不同的组合方式时,传统的构造函数方式会显得力不从心。建造者模式(Builder …...
vim启动的时候,执行gg
在 Vim 编辑器中,gg 命令是一个非常有用的命令,它可以将光标快速移动到当前窗口的顶部(即第一行)。如果你想在 Vim 启动时自动执行 gg 命令,有几种方法可以实现这一点: 方法 1:使用 Vim 的启动…...
【SSL部署与优化】HTTP/2与HTTPS的协同效应
HTTP/2与HTTPS的协同效应:为何HTTP/2强制要求TLS 1.2? HTTP/2是HTTP协议的现代升级版,旨在通过多路复用、头部压缩等技术提升性能。然而,HTTP/2的设计与部署与HTTPS(TLS加密)紧密相关,甚至强制…...
JavaScript篇:揭秘函数式与命令式编程的思维碰撞
大家好,我是江城开朗的豌豆,一名拥有6年以上前端开发经验的工程师。我精通HTML、CSS、JavaScript等基础前端技术,并深入掌握Vue、React、Uniapp、Flutter等主流框架,能够高效解决各类前端开发问题。在我的技术栈中,除了…...
ubuntu24.04上安装NVIDIA driver+CUDA+cuDNN+Anaconda+Pytorch
一、NVIDIA driver 使用Ubuntu系统的:软件和更新——>附加驱动,安装NVIDIA驱动。 二、CUDA 安装命令:sudo apt install nvidia-cuda-toolkit 三、cuDNN cuDNN 9.10.0 Downloads | NVIDIA Developer 四、Anaconda Download Anaconda Di…...
vue3基础学习(上) [简单标签] (vscode)
目录 1. Vue简介 2. 创建Vue应用 2.1 下载JS文件 2.2 引用JS文件 2.3 调用Vue方法编辑 2.4 运行一下试试: 2.5 代码如下 3.模块化开发模式 3.1 Live Server插件 3.2 运行 4. 常用的标签 4.1 reactive 4.1.1 运行结果 4.1.2 代码: 4.2 ref 4.2.1 运行结果 4.2.2…...
.Net HttpClient 使用代理功能
HttpClient 使用代理功能 实际开发中,HttpClient 通过代理访问目标服务器是常见的需求。 本文将全面介绍如何在 .NET 中配置 HttpClient 使用代理(Proxy)功能,包括基础使用方式、代码示例、以及与依赖注入结合的最佳实践。 注意…...
深入理解Java适配器模式:从接口兼容到设计哲学
引言:接口不兼容的困局 在软件开发中,我们经常遇到这样的场景: 旧系统有一个「RS232串口设备」(仅支持sendByRS232(String data)方法),新系统需要通过「USB接口」(要求sendByUSB(String data)…...
非异步信号安全函数
这个程序演示了如何使用sigaction来捕获和处理信号(特别是SIGINT,即CtrlC)。以下是关键点和潜在问题的分析: 程序功能 信号捕获:注册自定义处理函数handler来捕获信号2(SIGINT,通常由CtrlC触发…...
PHP黑白胶卷底片图转彩图功能 V2025.05.15
关于底片转彩图 传统照片底片是摄影过程中生成的反色图像,为了欣赏照片,需要通过冲印过程将底片转化为正像。而随着数字技术的发展,我们现在可以使用数字工具不仅将底片转为正像,还可以添加色彩,重现照片原本的色彩效…...
【C++ / STL】封装红黑树实现map和set
文章目录 一. 源码及框架分析1.决定搜索类型的传参思考:为什么要传第一个参数 2.KeyOfValue的作用 二. 模拟实现map和set1. 实现出复用红黑树框架,并支持insert2. 支持iterator的实现iterator实现思路分析【iterator操作实现详解】 3.支持map的[ ]操作4.map和set代码…...
记录: Windows下远程Liunx 系统xrdp 用到的一些小问题(免费踩坑 记录)
采用liunx Ubuntu22.04版本以下,需要安装 xrdp 或者VNC 具体过程就是下载 在linux命令行里 首先更新软件包:sudo apt update 安装xrdp服务:sudo apt install xrdp 启动XRDP:sudo systemctl start xrdp(如果在启动的…...
WordPress 文章和页面:它们的区别是什么?
很多刚接触WordPress的用户,在创建网站内容时往往会遇到这样一个问题:“我应该用‘文章’还是‘页面’?”虽然两者都能发布内容,但它们之间到底有什么区别呢?这篇文章将从易于理解的角度,帮助大家厘清WordP…...
【工具变量】各省市场化指数-杨兴权版共三个方法(1997-2023年)
市场化指数是衡量中国各地区市场化改革进程的重要指标。本次数据基于杨兴全、马连福和夏立军三位学者的研究成果,系统整理并更新了我国1997-2023年间31个省、自治区、直辖市的市场化指数,便于研究者进行横向和纵向比较分析。 一、数据介绍 数据名称&…...
Android App View——团结引擎车机版实现安卓应用原生嵌入 3D 开发场景
团结引擎 1.5.0 版本已于 4 月 14 日正式发布,从 1.5.0 版本开始,团结引擎车机版带来了一个激动人心的新能力 —— Android App View。现在,开发者可以将任意第三方安卓应用以 2D 组件或 3D 组件的形式,原生嵌入到 Tuanjie 开发的…...
完整的 CentOS 6.10 虚拟机安装启动脚本
好的!下面是一个 完整的 CentOS 6.10 虚拟机安装启动脚本,专为你在 macOS(M 系芯片) QEMU(x86_64 软件模拟) 环境设计,确保你能顺利启动并安装一个接近 Red Hat 6.4 的开发环境。 ⸻ ✅ 前提准…...
如何远程执行脚本不留痕迹
通常我们在做远程维护的时候,会有这么一个需求,就是我想在远程主机执行一个脚本,但是这个脚本我又不想保留在远程主机上,那么有人就说了,那就复制过去再登录远程执行不就行了吗?嗯嗯,但是这还不…...
观测云:从云时代走向AI时代
过去十年,云计算让企业的数据处理能力实现了指数级增长,而观测云作为全栈监控观测平台,见证并参与了这一进程。通过强大的数据采集、处理与展示能力,观测云帮助数百家企业实现了对 IT 基础设施、应用服务、业务链路的全面掌控。 …...
解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs- consistency is the key
解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs- consistency is the key DeepSeek v3的时候,它模型已经足够强大到能带来consistency稳定性。所以当这个DeepSeek R1 Zero或者DeepSeek R1使用GRPO进行训练的时候,它能够…...
鸿蒙OSUniApp 实现图片上传与压缩功能#三方框架 #Uniapp
UniApp 实现图片上传与压缩功能 前言 在移动应用开发中,图片上传是一个非常常见的需求。无论是用户头像、朋友圈图片还是商品图片,都需要上传到服务器。但移动设备拍摄的图片往往尺寸较大,直接上传会导致流量消耗过大、上传时间过长&#x…...
SymPy | 如何提取指定项的系数
SymPy 是 Python 中一个强大的符号计算库,广泛应用于数学、物理和工程领域的符号运算。在代数表达式的处理中,提取特定项的系数是一项常见且重要的操作。本文将详细介绍 SymPy 中提取指定项系数的多种方法,并通过丰富的示例帮助读者掌握这些技…...
MUSE Pi Pro 更换kernel内核及module模块
视频讲解: MUSE Pi Pro 更换kernel内核及module模块 脚本仓库: https://github.com/LitchiCheng/MUSE-Pi-Pro-Learning 结合上期编译内核,编译成功后的输出如下: 输入 uname -a 可以看到如下信息,未修改的内核时间在 …...
java每日精进 5.14【参数校验】
参数校验 1.1概述 本文使用 Hibernate Validator 框架对 RESTful API 接口的参数进行校验,确保数据入库的正确性。 例如,在用户注册时,校验手机号格式、密码强度等。如果校验失败,抛出 ConstraintViolationException 或相关异…...
CPS联盟+小程序聚合平台分销返利系统开发|小红书番茄网盘CPA拉新推广全解析
导语: 在私域流量与社交电商爆发的时代,CPS联盟分销返利系统与小红书CPA拉新推广成为企业增长的核心引擎。本文深度解析如何通过小程序聚合平台开发、多层级返利机制搭建及精准CPA推广策略,快速占领市场,实现用户裂变与收益倍增。…...
基于EFISH-SCB-RK3576/SAIL-RK3576的光伏逆变器控制器技术方案
(国产化替代J1900的能源物联网解决方案) 一、硬件架构设计 电力转换与控制模块 高精度功率控制: Cortex-M0硬实时核驱动多相PWM(频率>200kHz),动态调节DC-AC转换误差<0.5%FPGA实现MPPT算法…...
HarmonyOS NEXT 适配高德地图FlutterSDK实现地图展示,添加覆盖物和移动Camera
HarmonyOS NEXT 适配高德地图 Flutter SDK 实现地图展示,添加覆盖物和移动 Camera 在现代移动应用开发中,地图功能是许多应用的核心组成部分之一。HarmonyOS NEXT 提供了强大的跨平台开发能力,而高德地图 Flutter SDK 则为开发者提供了丰富的…...
计算机网络:手机和基站之间是通过什么传递信息的?怎么保证的防衰减,抗干扰和私密安全的?
手机与基站之间的通信依赖无线电磁波信号,其传输介质、频率选择、抗衰减/抗干扰技术及隐私保护机制共同构成了现代移动通信的核心。以下从技术原理到实际应用逐一解析: 一、信号本质与传输介质 1. 信号类型 电磁波:手机与基站通过射频(RF)电磁波传递信息,采用数字调制技…...
C#调用C++dll 过程记录
C#调用Cdll 过程记录 问题:1、设置修改记录2 修改对应问题3 继续出问题4 许久之后的转机5 最后的成功 如题,过程记录 问题: 提示:main 已经在 dllmain.obj 中定义,针对该问题作进一步的处理 1、设置修改记录 &…...
Vue百日学习计划Day4-8——Gemini版
番茄时钟: 每个番茄钟为25分钟学习,之后休息5分钟。每完成4个番茄钟,进行一次15-30分钟的长休息。灵活性: 这仍然是一个建议性计划。某些主题(尤其是 Flexbox 和 Grid)可能需要比预期更多的时间来练习和理解…...
DHCP协议
DHCP协议 1、掌握DHCP的工作原理 2、会在Windows server上去部署DHCP服务 3、抓流量 正常收到攻击后 一、DHCP 1、DHCP基本概念 dhcp(动态主机配置协议):主要就是给客户机提供TCP/IP参数(IP地址、子网掩码、网关、DNS等) 2、好处 减少管理员工作…...
级联与端到端对话系统架构解析:以Moshi为例
一、对话系统架构对比 1.1 级联对话系统(Cascaded Dialogue Systems) 传统级联系统采用多阶段处理流程: 语音识别(ASR):将24kHz音频信号通过卷积神经网络(CNN)和Transformer转换为…...
3、ubantu系统docker常用命令
1、自助查看docker命令 1.1、查看所有命令 docker 客户端非常简单,可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项。 angqiangwangqiang:~$ dockerUsage: docker [OPTIONS] COMMANDA self-sufficient runtime for containersCommon Commands:ru…...
【leetcode】349. 两个数组的交集
文章目录 代码1.set()2. 哈希表3. 数组 给定两个数组 nums1 和 nums2 ,返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1: 输入:nums1 [1,2,2,1], nums2 [2,2] 输…...
BGP联邦和发射试验
一、要求 二、需求分析 1. **拓扑与地址规划** - **AS1**:环回16.1.1.0/24需宣告,192.168.1.0/24不宣告。 - **AS3**:环回11.1.1.0/24需宣告,192.168.2.0/24不宣告。 - **AS2**:使用172.16.0.0/16划分子…...
LeetCode Hot100 (1/100)
目录 一、有关数组和动态数组的排序(sort函数) 1.普通数组的排序 基本用法 降序排序 2.vector的排序 基本用法 降序排序 二、数组长度和一些vector的基本语法 1. 静态数组长度计算 2. 安全获取数组长度(C17 起) 3.vecto…...
LeetCode热题100--234.回文链表--简单
1. 题目 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 示例 1: 输入:head [1,2,2,1] 输出:true 示例 2: 输入…...
Java—接口和抽象类
一、接口 Java 接口(Interface) 是面向对象编程中用于定义行为规范的核心机制。接口通过抽象方法约定“能做什么”,而不关心“如何做”,从而实现多态和代码解耦。 1.1 接口的特点 接口用interface定义接口中全为抽象方法默认用p…...
CycleISP: Real Image Restoration via Improved Data Synthesis通过改进数据合成实现真实图像恢复
摘要 大规模数据集的可用性极大释放了深度卷积神经网络(CNN)的潜力。然而,针对单图像去噪问题,获取真实数据集成本高昂且流程繁琐。因此,图像去噪算法主要基于合成数据开发与评估,这些数据通常通过广泛假设…...