三天急速通关Java基础知识:Day1 基本语法
三天急速通关JAVA基础知识:Day1 基本语法
- 0 文章说明
- 1 关键字 Keywords
- 2 注释 Comments
- 2.1 单行注释
- 2.2 多行注释
- 2.3 文档注释
- 3 数据类型 Data Types
- 3.1 基本数据类型
- 3.2 引用数据类型
- 4 变量与常量 Variables and Constant
- 5 运算符 Operators
- 6 字符串 String
- 7 输入与输出 Input and Output
- 标准输出(System.out)
- 8 流程控制 Control Flow
- 9 大数 Big Numbers
- 10 数组 Arrays
- Final 考试
0 文章说明
本文目的是为了建立Java的基础知识体系,参考《Core Java, Volume I:Fundamentals》第十二版的第三章目录结构组织,内容由本人已学习的java知识为基础,kimi与gpt辅助完善。本文所提供的信息和内容仅供参考,作者和发布者不保证其准确性和完整性。
1 关键字 Keywords
Java关键字是Java语言的保留字,不能作为变量名、方法名、类名等标识符使用。下面列出经典的关键字,具体示例本篇不给出:
abstract | assert | boolean | break | byte |
case | catch | char | class | const |
continue | default | do | double | else |
enum | extends | final | finally | float |
for | goto | if | implements | import |
instanceof | int | interface | long | native |
new | package | private | protected | public |
return | short | static | strictfp | super |
switch | synchronized | this | throw | throws |
transient | try | void | volatile | while |
比较陌生的:
-
assert:用于断言,是一种调试手段,检查程序中的某个条件是否为真。如果条件为假,会抛出
AssertionError
异常。 -
default:在
switch
语句中表示默认情况,当没有任何case
匹配时执行。在接口中,从Java 8开始,可以用于定义默认方法,为接口提供默认实现。 -
finally:用于异常处理,
finally
块中的代码无论是否捕获到异常都会执行。通常用于资源清理,如关闭文件流、数据库连接等。 -
instanceof:用于判断一个对象是否是某个类或其子类的实例,返回一个布尔值。常用于类型检查和类型转换。
-
native:用于修饰方法,表示该方法是本地方法,即方法的实现不在Java代码中,而是在其他语言(如C或C++)中实现。通常用于调用底层系统资源或性能敏感的操作。
-
strictfp:用于修饰方法或类,表示该方法或类中的浮点运算必须严格遵循IEEE 754标准。这可以确保浮点运算在不同平台上具有相同的精度和结果。
-
synchronized:用于修饰方法或代码块,表示该方法或代码块是同步的,可以用于实现线程同步,防止多个线程同时访问共享资源。
-
transient:用于修饰变量,表示该变量在对象序列化时不会被序列化。通常用于表示不需要持久化的临时数据。
-
volatile:用于修饰变量,表示该变量的值可能会被多个线程同时访问和修改,对变量的读写操作需要保证可见性和禁止指令重排序。通常用于多线程环境中的变量共享。
2 注释 Comments
2.1 单行注释
- 语法:
//
- 说明:单行注释从
//
开始,直到该行末尾。推荐在被注释语句上方另起一行 - 示例:
// 这是一个单行注释 int x = 10; // 这是变量x的声明和初始化
2.2 多行注释
- 语法:
/*
和*/
- 说明:多行注释从
/*
开始,到*/
结束,可以跨越多行。 - 示例:
/** 这是一个多行注释* 可以包含多行文本* 用于对代码块进行详细说明*/int y = 20;
2.3 文档注释
- 语法:
/**
和*/
- 说明:多行注释从
/**
开始,到*/
结束,通常用于生成API文档。它主要用于类、接口、方法和字段的文档化。文档注释可以被javadoc工具解析,生成HTML格式的文档。 - 示例:
/*** 这是一个文档注释* 用于生成API文档* @param x 输入参数* @return 返回值*/public int add(int x, int y) {return x + y;}
3 数据类型 Data Types
Java的数据类型主要分为两大类:基本数据类型和引用数据类型。
3.1 基本数据类型
包括整数类型(byte、short、int、long)、浮点类型(float、double)、字符类型(char)和布尔类型(boolean)。
类型 | 大小(位) | 默认值 | 范围 |
---|---|---|---|
byte | 8 | 0 | -128 到 127 |
short | 16 | 0 | -32,768 到 32,767 |
int | 32 | 0 | -2³¹ 到 2³¹-1 |
long | 64 | 0L | -2⁶³ 到 2⁶³-1 |
float | 32 | 0.0f | 约 ±3.40282347E+38F |
double | 64 | 0.0d | 约 ±1.79769313486231570E+308 |
char | 16 | ‘\u0000’ | 单个字符(支持 Unicode 编码) |
boolean | 不固定 | false | 仅能取值 true 或 false |
3.2 引用数据类型
引用数据类型在 Java 中是用于存储对象的内存地址,而不是直接存储数据值。引用类型主要包括 类(Class)、接口(Interface)、数组(Array) 和 枚举(Enum)。它们允许更复杂的数据结构和行为的定义。
-
类(Class)
类是创建对象的模板,包含属性和方法。对象是类的实例。class Person {String name;int age;void sayHello() {System.out.println("Hello, my name is " + name);} } // 使用类创建对象 Person person = new Person(); person.name = "Alice"; person.age = 25; person.sayHello(); // 输出: Hello, my name is Alice
-
接口(Interface)
接口是行为的规范,定义了一组抽象方法。实现接口的类必须提供这些方法的具体实现。interface Animal {void makeSound(); }class Dog implements Animal {public void makeSound() {System.out.println("Woof!");} } // 使用接口 Animal dog = new Dog(); dog.makeSound(); // 输出: Woof!
-
数组(Array)
数组是存储相同类型元素的集合,长度固定。int[] numbers = {1, 2, 3, 4, 5}; System.out.println(numbers[2]); // 输出: 3String[] names = {"Alice", "Bob", "Charlie"}; System.out.println(names[0]); // 输出: Alice
-
枚举(Enum)
枚举是一个特殊的类,用于定义一组固定的常量。enum Day {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY }// 使用枚举 Day today = Day.WEDNESDAY; System.out.println(today); // 输出: WEDNESDAY
-
注解(Annotations
注解用于提供元数据,可以用于类、方法、字段等。注解可以被编译器、运行时环境或其他工具读取和处理。public @interface MyAnnotation {String value(); }@MyAnnotation("Hello") public class MyClass { }
4 变量与常量 Variables and Constant
根据位置不同,分为不同类型的变量与常量,有哪些位置呢?方法中,类中以及类中用static修饰了,就这三种情况,分别就是局部,实例以及类(静态) 变量或常量。
类型 | 说明 | 示例 |
---|---|---|
变量 | 存储数据的容器,具有类型、名称和值。 | int age = 25; |
局部变量 | 在方法或代码块中定义的变量,只在该方法或代码块中有效。 | public void myMethod() { int localVar = 10; } |
实例变量 | 在类中定义的变量,属于类的实例,每个对象都有自己的实例变量。 | public class Person { String name; int age; } |
类变量 | 在类中定义的静态变量,属于类本身,所有对象共享同一个类变量。 | public class Person { static String species = "Homo sapiens"; } |
常量 | 值在程序运行期间不会改变的变量,通常使用final 关键字修饰。 | final double PI = 3.14159; |
实例常量 | 属于类的实例,每个对象都有自己的实例常量。 | public class Person { final String species = "Homo sapiens"; } |
类常量 | 属于类本身,所有对象共享同一个类常量。 | public class Person { static final String species = "Homo sapiens"; } |
变量和常量中容易出错的点:
-
变量类型不匹配
- 类型不兼容的赋值:将不同类型的变量赋值给一个变量时,需要进行显式的类型转换,或者使用正确的类型。
int a = 10; double b = 3.14; a = b; // 错误:类型不兼容,必须显式转换 a = (int) b; // 正确:类型转换
- 类型不兼容的赋值:将不同类型的变量赋值给一个变量时,需要进行显式的类型转换,或者使用正确的类型。
-
常量定义
- 常量初始化:常量必须在声明时初始化,否则会引发编译错误。
final int MAX_VALUE; // 错误:常量必须初始化 MAX_VALUE = 100; // 错误:常量只能赋值一次
- 常量初始化:常量必须在声明时初始化,否则会引发编译错误。
-
常量修改
- 不能修改常量值:常量被声明后值不可更改,尝试修改常量会引发编译错误。
final int MAX_VALUE = 100; MAX_VALUE = 200; // 错误:常量的值不能被修改
- 不能修改常量值:常量被声明后值不可更改,尝试修改常量会引发编译错误。
-
常量命名
- 常量命名规范:常量通常应使用全大写字母,并使用下划线分隔词。
final int MaxValue = 100; // 不符合规范,应该使用 MAX_VALUE final int MAX_VALUE = 100; // 正确
- 常量命名规范:常量通常应使用全大写字母,并使用下划线分隔词。
-
变量作用域
- 局部变量与全局变量冲突:如果局部变量和类字段(成员变量)同名,
局部变量会遮蔽类字段
。int x = 10; // 类字段 public void method() {int x = 20; // 局部变量,遮蔽类字段System.out.println(x); // 输出 20,而不是类字段的 10 }
- 局部变量与全局变量冲突:如果局部变量和类字段(成员变量)同名,
-
静态变量和实例变量
- 静态变量与实例变量的混淆:静态变量属于类,而实例变量属于对象。静态变量应通过类名访问,而实例变量应通过对象访问。
class MyClass {static int staticVar = 5;int instanceVar = 10;public static void main(String[] args) {MyClass obj = new MyClass();System.out.println(staticVar); // 正确:可以直接访问静态变量System.out.println(obj.instanceVar); // 正确:通过对象访问实例变量} }
- 静态变量与实例变量的混淆:静态变量属于类,而实例变量属于对象。静态变量应通过类名访问,而实例变量应通过对象访问。
-
变量的默认值
- 局部变量未初始化:局部变量没有默认值,必须初始化后才能使用。成员变量有默认值(例如,
int
类型的成员变量默认为0
)。int x; // 错误:局部变量没有默认值,必须初始化
- 局部变量未初始化:局部变量没有默认值,必须初始化后才能使用。成员变量有默认值(例如,
-
引用类型变量的默认值
- 引用类型变量默认值为
null
:引用类型的变量(如对象类型)默认值为null
,如果尝试访问它们的属性或方法,会引发NullPointerException
。String str; // 默认值为 null System.out.println(str.length()); // 错误:会抛出 NullPointerException
- 引用类型变量默认值为
5 运算符 Operators
运算符在 Java 中占据着重要的位置,对程序的执行有着很大的帮助。除了常见的加减乘除, 还有许多其他类型的运算符。
类别 | 运算符形式 | 说明 |
---|---|---|
算术运算符 | +, -, *, /, % | 用于执行基本的加、减、乘、除和取余运算。 |
++, - - | 自增和自减运算符,前缀或后缀形式。 | |
赋值运算符 | |=, +=, -=, *=, /=, %= | 用于给变量赋值,可结合算术运算符形成复合赋值。 |
关系运算符 | ==, !=, <, >, <=, >= | 比较两个值的关系,返回布尔值 true 或 false 。 |
逻辑运算符 | &&, ||, ! | 用于布尔逻辑运算:逻辑与、逻辑或和逻辑非。 |
位运算符 | &, |, ^, ~ | 位与、位或、位异或、位取反运算符。 |
<<, >>, >>> | 位移运算符:左移、右移和无符号右移。 | |
条件运算符 | ? : | 三元运算符,根据条件返回不同的值。 |
类型比较运算符 | instanceof | 检查对象是否是某个类的实例。 |
位逻辑赋值运算符 | &=, |=, ^= | 结合位运算和赋值操作。 |
容易出错的点:
- 取余运算:负数取余时,结果的符号与被除数一致。
-5 % 3
的结果是-2
。
- 复合赋值:复合赋值运算符会自动进行类型转换,可能导致数据精度丢失。
int a = 5; a += 2.5; // 等价于 a = (int)(a + 2.5),结果为 7
- 浮点数比较:浮点数计算可能会有精度误差,因此直接使用
==
比较可能不准确。- 建议:使用
Math.abs(a - b) < epsilon
方法进行比较。
- 建议:使用
- 短路运算:
&&
和||
是短路运算符,可能导致右侧表达式不被执行。boolean result = (x > 5) && (y++ > 2); // 如果 x <= 5,y 不会自增
- 符号扩展:在位移运算中,
>>
会保留符号位,>>>
不保留符号位。int a = -8; System.out.println(a >> 1); // 结果是 -4 System.out.println(a >>> 1); // 结果是一个正数
- 优先级问题:条件运算符
? :
的优先级较低,可能需要加括号以避免误解。int a = 10, b = 5; int result = a > b ? a : b + 10; // 实际等价于 a > b ? a : (b + 10)
- 字符串连接:
+
运算符在连接字符串时,可能会误解数值操作。System.out.println("Sum: " + 5 + 3); // 输出为 Sum: 53,而不是 Sum: 8
6 字符串 String
在Java中,String 是一个非常重要的类,用于表示和操作字符串。字符串在Java中是不可变的,这意味着一旦创建,其内容就不能被修改。
常见方法:
方法 | 说明 | 示例 | 返回值 |
---|---|---|---|
concat(String str) | 连接两个字符串 | java String s1 = "Hello"; String s2 = s1.concat(" World"); | “Hello World” |
+ 运算符 | 连接两个字符串 | java String s1 = "Hello"; String s2 = s1 + " World"; | “Hello World” |
equals(Object anObject) | 比较两个字符串的内容是否相同 | java String s1 = "Hello"; String s2 = "Hello"; boolean isEqual = s1.equals(s2); | true |
equalsIgnoreCase(String anotherString) | 比较两个字符串的内容是否相同,忽略大小写 | java String s1 = "Hello"; String s2 = "hello"; boolean isEqual = s1.equalsIgnoreCase(s2); | true |
== | 比较两个字符串对象是否是同一个对象 | java String s1 = "Hello"; String s2 = "Hello"; boolean isSameObject = s1 == s2; | true(因为字符串常量池) |
indexOf(int ch) | 返回指定字符在字符串中第一次出现的索引 | java String s = "Hello, World!"; int index = s.indexOf('o'); | 4 |
lastIndexOf(int ch) | 返回指定字符在字符串中最后一次出现的索引 | java String s = "Hello, World!"; int index = s.lastIndexOf('o'); | 8 |
substring(int beginIndex) | 返回从指定索引开始到字符串末尾的子字符串 | java String s = "Hello, World!"; String sub = s.substring(7); | “World!” |
substring(int beginIndex, int endIndex) | 返回从指定开始索引到结束索引的子字符串 | java String s = "Hello, World!"; String sub = s.substring(7, 12); | “World” |
toLowerCase() | 将字符串转换为小写 | java String s = "Hello, World!"; String lower = s.toLowerCase(); | “hello, world!” |
toUpperCase() | 将字符串转换为大写 | java String s = "Hello, World!"; String upper = s.toUpperCase(); | “HELLO, WORLD!” |
trim() | 去除字符串两端的空白字符 | java String s = " Hello, World! "; String trimmed = s.trim(); | “Hello, World!” |
split(String regex) | 根据指定的正则表达式分割字符串,返回一个字符串数组 | java String s = "Hello,World,Java"; String[] parts = s.split(","); | [“Hello”, “World”, “Java”] |
一些技巧:
- 字符串比较
- 错误:使用
==
比较字符串内容。String s1 = "Hello"; String s2 = "hello"; boolean isEqual = s1 == s2; // false(因为字符串常量池)
- 正确做法:使用
equals
方法比较字符串内容。String s1 = "Hello"; String s2 = "hello"; boolean isEqual = s1.equals(s2); // false
- 错误:使用
- 字符串不可变性
- 错误:尝试修改字符串内容。
String s = "Hello"; s.concat(" World"); // s 仍然是 "Hello"
- 正确做法:使用新的变量接收修改后的字符串。
String s = "Hello"; String newS = s.concat(" World"); // newS 是 "Hello World"
- 错误:尝试修改字符串内容。
- 字符串常量池
- 错误:假设所有字符串字面量都会进入字符串常量池。
String s1 = "Hello"; String s2 = new String("Hello"); boolean isSameObject = s1 == s2; // false(因为s2是通过new创建的)
- 正确做法:使用
intern
方法确保字符串进入常量池。String s1 = "Hello"; String s2 = new String("Hello").intern(); boolean isSameObject = s1 == s2; // true
- 错误:假设所有字符串字面量都会进入字符串常量池。
- 字符串分割
- 错误:忽略分割后的空字符串。
String s = "a,,b,c,,"; String[] parts = s.split(","); // parts 会包含空字符串 ["a", "", "b", "c", "", ""]
- 正确做法:使用正则表达式去除空字符串。
String s = "a,,b,c,,"; String[] parts = s.split(",+"); // parts 不会包含空字符串 ["a", "b", "c"]
- 错误:忽略分割后的空字符串。
- 字符串连接
- 错误:在循环中使用
+
连接字符串,导致性能问题。String result = ""; for (int i = 0; i < 1000; i++) {result = result + i; // 每次迭代都会创建新的字符串对象 }
- 正确做法:使用
StringBuilder
或StringBuffer
进行字符串连接。StringBuilder sb = new StringBuilder(); for (int i = 0; i < 1000; i++) {sb.append(i); // 高效的字符串连接 } String result = sb.toString();
- 错误:在循环中使用
7 输入与输出 Input and Output
输入和输出(I/O)是程序与用户或其他系统进行交互的重要方式。Java提供了丰富的类和接口来处理输入和输出操作,主要位于java.io包中。下面只介绍基础的输入输出处理:
- Scanner 类
nextLine()
:读取一行文本。Scanner scanner = new Scanner(System.in); System.out.print("Enter your name: "); String name = scanner.nextLine(); // 读取一行文本
nextInt()
:读取一个整数。System.out.print("Enter your age: "); int age = scanner.nextInt(); // 读取一个整数
nextDouble()
:读取一个双精度浮点数。System.out.print("Enter your salary: "); double salary = scanner.nextDouble(); // 读取一个双精度浮点数
next()
:读取一个单词(以空白字符分隔的字符串)。System.out.print("Enter your name: "); String name = scanner.next(); // 读取一个单词
标准输出(System.out)
- print 方法
print(String s)
:输出一个字符串,不换行。System.out.print("Hello, "); // 输出字符串,不换行
print(int i)
:输出一个整数,不换行。System.out.print(123); // 输出整数,不换行
print(double d)
:输出一个双精度浮点数,不换行。System.out.print(3.14); // 输出浮点数,不换行
- printf 方法
printf(String format, Object... args)
:格式化输出。
System.out.printf("Hello, %s. You are %d years old.", "John", 30); // 格式化输出
易错点:
-
使用
Scanner
类- 确保关闭
Scanner
对象,释放系统资源。 - 捕获
InputMismatchException
,处理输入错误。 - 在使用
nextInt()
或nextDouble()
后调用nextLine()
,清除缓冲区中的换行符。
- 确保关闭
-
使用
print
和printf
方法- 确保格式化字符串中的占位符与实际参数类型匹配。
- 使用
println
方法或手动添加换行符,确保输出内容格式正确。 - 使用
printf
方法时,使用%n
换行符确保每行输出后换行。
8 流程控制 Control Flow
略
9 大数 Big Numbers
Java提供了BigInteger和BigDecimal类来处理这种大数值(超出常规数据类型如int和long范围的数值问题。
- BigInteger类:任意精度的整数运算
方法 | 说明 | 示例 |
---|---|---|
BigInteger(String val) | 通过字符串创建BigInteger对象 | BigInteger bigInt1 = new BigInteger("123456789012345678901234567890"); |
BigInteger.valueOf(long val) | 通过长整数值创建BigInteger对象 | BigInteger bigInt2 = BigInteger.valueOf(12345678901234567890L); |
add(BigInteger val) | 加法 | BigInteger sum = bigInt1.add(bigInt2); |
subtract(BigInteger val) | 减法 | BigInteger difference = bigInt1.subtract(bigInt2); |
multiply(BigInteger val) | 乘法 | BigInteger product = bigInt1.multiply(bigInt2); |
divide(BigInteger val) | 除法 | BigInteger quotient = bigInt1.divide(bigInt2); |
mod(BigInteger val) | 取模 | BigInteger remainder = bigInt1.mod(bigInt2); |
- BigDecimal类:任意精度的浮点数运算
方法 | 说明 | 示例 |
---|---|---|
BigDecimal(String val) | 通过字符串创建BigDecimal对象 | BigDecimal bigDecimal1 = new BigDecimal("12345.67890"); |
BigDecimal.valueOf(double val) | 通过double值创建BigDecimal对象 | BigDecimal bigDecimal2 = BigDecimal.valueOf(12345.67890); |
add(BigDecimal val) | 加法 | BigDecimal sum = bigDecimal1.add(bigDecimal2); |
subtract(BigDecimal val) | 减法 | BigDecimal difference = bigDecimal1.subtract(bigDecimal2); |
multiply(BigDecimal val) | 乘法 | BigDecimal product = bigDecimal1.multiply(bigDecimal2); |
divide(BigDecimal val, int scale, RoundingMode mode) | 除法,指定小数位数和舍入模式 | BigDecimal quotient = bigDecimal1.divide(bigDecimal2, 2, RoundingMode.HALF_UP); |
Java中BigInteger
和BigDecimal
类的常见易错点:
-
BigInteger类
-
使用错误的构造方法
- 错误:使用
BigInteger(int signum, byte[] magnitude)
构造方法时,传入的参数不正确。byte[] bytes = {1, 2, 3}; BigInteger bigInt = new BigInteger(1, bytes); // 正确 BigInteger bigInt = new BigInteger(-1, bytes); // 负数
- 正确做法:确保
signum
参数正确,1
表示正数,-1
表示负数,0
表示零。byte[] bytes = {1, 2, 3}; BigInteger bigInt = new BigInteger(1, bytes); // 正确
- 错误:使用
-
除法运算未处理异常
- 错误:在进行除法运算时,未处理
ArithmeticException
。BigInteger bigInt1 = new BigInteger("10"); BigInteger bigInt2 = new BigInteger("0"); BigInteger quotient = bigInt1.divide(bigInt2); // 抛出ArithmeticException
- 正确做法:在进行除法运算时,确保除数不为零,或捕获
ArithmeticException
。BigInteger bigInt1 = new BigInteger("10"); BigInteger bigInt2 = new BigInteger("0"); try {BigInteger quotient = bigInt1.divide(bigInt2); } catch (ArithmeticException e) {System.out.println("除数不能为零"); }
- 错误:在进行除法运算时,未处理
-
使用
intValue
、longValue
等方法时未处理溢出- 错误:在将
BigInteger
转换为int
或long
时,未处理可能的溢出。BigInteger bigInt = new BigInteger("12345678901234567890"); int value = bigInt.intValue(); // 可能溢出
- 正确做法:在转换前,使用
bitLength
方法检查数值是否在范围内。BigInteger bigInt = new BigInteger("12345678901234567890"); if (bigInt.bitLength() <= 31) {int value = bigInt.intValue(); } else {System.out.println("数值超出int范围"); }
- 错误:在将
-
BigDecimal类
-
使用
double
值创建BigDecimal
- 错误:使用
double
值创建BigDecimal
,导致精度问题。BigDecimal bigDecimal = new BigDecimal(12345.67890); // 精度问题
- 正确做法:使用字符串创建
BigDecimal
,避免精度问题。BigDecimal bigDecimal = new BigDecimal("12345.67890"); // 正确
- 错误:使用
-
除法运算未处理异常
- 错误:在进行除法运算时,未处理
ArithmeticException
。BigDecimal bigDecimal1 = new BigDecimal("10"); BigDecimal bigDecimal2 = new BigDecimal("0"); BigDecimal quotient = bigDecimal1.divide(bigDecimal2); // 抛出ArithmeticException
- 正确做法:在进行除法运算时,确保除数不为零,或捕获
ArithmeticException
。BigDecimal bigDecimal1 = new BigDecimal("10"); BigDecimal bigDecimal2 = new BigDecimal("0"); try {BigDecimal quotient = bigDecimal1.divide(bigDecimal2); } catch (ArithmeticException e) {System.out.println("除数不能为零"); }
- 错误:在进行除法运算时,未处理
-
除法运算未指定舍入模式
- 错误:在进行除法运算时,未指定舍入模式,导致
ArithmeticException
。BigDecimal bigDecimal1 = new BigDecimal("10"); BigDecimal bigDecimal2 = new BigDecimal("3"); BigDecimal quotient = bigDecimal1.divide(bigDecimal2); // 抛出ArithmeticException
- 正确做法:在进行除法运算时,指定舍入模式。
BigDecimal bigDecimal1 = new BigDecimal("10"); BigDecimal bigDecimal2 = new BigDecimal("3"); BigDecimal quotient = bigDecimal1.divide(bigDecimal2, 2, RoundingMode.HALF_UP); // 正确
- 错误:在进行除法运算时,未指定舍入模式,导致
-
使用
floatValue
、doubleValue
等方法时未处理精度损失- 错误:在将
BigDecimal
转换为float
或double
时,未处理可能的精度损失。BigDecimal bigDecimal = new BigDecimal("12345.67890"); double value = bigDecimal.doubleValue(); // 精度损失
- 正确做法:在转换前,确保数值在范围内,或使用
setScale
方法调整精度。BigDecimal bigDecimal = new BigDecimal("12345.67890"); BigDecimal scaledValue = bigDecimal.setScale(2, RoundingMode.HALF_UP); double value = scaledValue.doubleValue(); // 正确
- 错误:在将
希望这些信息对你有帮助!如果你有任何问题或需要进一步的解释,请随时告诉我。
10 数组 Arrays
- 一维数组
方法 | 说明 | 示例 |
---|---|---|
声明数组 | 声明一个数组,但不初始化 | int[] arr; |
静态初始化 | 在声明数组时直接赋值 | int[] arr = {1, 2, 3, 4, 5}; |
动态初始化 | 指定数组的长度,元素默认初始化 | int[] arr = new int[5]; |
- 二维数组
方法 | 说明 | 示例 |
---|---|---|
声明和初始化二维数组 | 声明并初始化二维数组 | int[][] matrix = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; |
- 常见方法
方法 | 说明 | 示例 |
---|---|---|
length | 获取数组长度 | int len = arr.length; |
arr[index] | 访问数组元素 | int element = arr[0]; |
arr[index] = value | 修改数组元素 | arr[0] = 10; |
Arrays.sort | 排序数组 | Arrays.sort(arr); |
Arrays.binarySearch | 查找数组元素 | int index = Arrays.binarySearch(arr, 3); |
Arrays.fill | 填充数组 | Arrays.fill(arr, 10); |
Arrays.copyOf | 复制数组 | int[] copy = Arrays.copyOf(arr, arr.length); |
Arrays.asList | 将数组转换为列表 | List<Integer> list = Arrays.asList(arr); |
Arrays.toString | 将数组转换为字符串 | System.out.println(Arrays.toString(arr)); |
Arrays.deepToString | 将多维数组转换为字符串 | System.out.println(Arrays.deepToString(matrix)); |
Final 考试
-
关键字
模拟一个动物世界,支持鸟类和哺乳动物的多态行为,并限制某些动物不能被继承或扩展。interface Animal {void makeSound();void move(); }abstract class Bird implements Animal {protected String name;public Bird(String name) {this.name = name;}public abstract void fly();@Overridepublic void move() {System.out.println(name + " is moving.");} }final class Eagle extends Bird {public Eagle(String name) {super(name);}@Overridepublic void makeSound() {System.out.println(name + " screeches!");}@Overridepublic void fly() {System.out.println(name + " is soaring high.");} }class Mammal implements Animal {private String name;public Mammal(String name) {this.name = name;}@Overridepublic void makeSound() {System.out.println(name + " makes a mammal sound.");}@Overridepublic void move() {System.out.println(name + " is walking.");} }public class Main {public static void main(String[] args) {Animal eagle = new Eagle("Golden Eagle");eagle.makeSound();eagle.move();Animal lion = new Mammal("Lion");lion.makeSound();lion.move();} }
-
注释
为一个贷款利息计算器编写详细的注释,解释计算步骤和逻辑。/*** 贷款利息计算器* 计算贷款的月还款金额和总利息*/ public class LoanCalculator {/*** 计算月还款金额* @param principal 贷款本金* @param annualRate 年利率(小数形式)* @param months 贷款期数(以月为单位)* @return 每月还款金额*/public double calculateMonthlyPayment(double principal, double annualRate, int months) {double monthlyRate = annualRate / 12; // 月利率return (principal * monthlyRate) / (1 - Math.pow(1 + monthlyRate, -months));}/*** 计算总利息* @param monthlyPayment 每月还款金额* @param months 贷款期数* @param principal 贷款本金* @return 总利息*/public double calculateTotalInterest(double monthlyPayment, int months, double principal) {return (monthlyPayment * months) - principal;}public static void main(String[] args) {LoanCalculator calculator = new LoanCalculator();double principal = 50000; // 本金double annualRate = 0.05; // 年利率int months = 24; // 期数double monthlyPayment = calculator.calculateMonthlyPayment(principal, annualRate, months);double totalInterest = calculator.calculateTotalInterest(monthlyPayment, months, principal);System.out.printf("每月还款金额: %.2f\n", monthlyPayment);System.out.printf("总利息: %.2f\n", totalInterest);} }
-
数据类型
模拟一个个人信息管理系统,支持用户输入、修改和打印复杂的个人数据。import java.util.Scanner;public class PersonalInfoManager {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 基本数据类型System.out.print("请输入姓名: ");String name = scanner.nextLine();System.out.print("请输入年龄: ");int age = scanner.nextInt();System.out.print("请输入身高 (米): ");float height = scanner.nextFloat();System.out.print("是否已婚 (true/false): ");boolean isMarried = scanner.nextBoolean();// 输出个人信息System.out.println("\n个人信息:");System.out.printf("姓名: %s\n", name);System.out.printf("年龄: %d\n", age);System.out.printf("身高: %.2f 米\n", height);System.out.printf("婚姻状况: %s\n", isMarried ? "已婚" : "未婚");} }
-
变量与常量
设计一个动态管理圆的系统,可以根据用户输入动态创建多个圆,并输出总圆数和每个圆的面积。class Circle {private static int totalCircles = 0; // 类变量private double radius; // 实例变量private static final double PI = 3.14159; // 类常量public Circle(double radius) {this.radius = radius;totalCircles++;}public double calculateArea() {return PI * radius * radius;}public static int getTotalCircles() {return totalCircles;} }public class CircleManager {public static void main(String[] args) {Circle c1 = new Circle(3.5);Circle c2 = new Circle(4.2);System.out.printf("圆1的面积: %.2f\n", c1.calculateArea());System.out.printf("圆2的面积: %.2f\n", c2.calculateArea());System.out.println("总圆数: " + Circle.getTotalCircles());} }
-
运算符
public class OperatorsExample {public static void main(String[] args) {int a = 15, b = 5, c = 2;// 使用括号来明确运算优先级int result = (a + b) * c - (b % c);System.out.println("表达式计算结果: " + result);// 复合赋值运算符a += 5; // a = a + 5System.out.println("a 经过复合赋值运算后的值: " + a);// 三目运算符int max = (a > b) ? a : b;System.out.println("a 和 b 中较大的值: " + max);// 自增和自减运算符int preIncrement = ++a; // 先加再使用int postDecrement = b--; // 先使用再减System.out.println("自增后的 a: " + preIncrement);System.out.println("自减后的 b: " + postDecrement);// 逻辑运算符boolean condition = (a > 20) && (b < 10);System.out.println("逻辑运算结果 (a > 20) && (b < 10): " + condition);} }
-
字符串
import java.nio.charset.StandardCharsets; import java.util.regex.Matcher; import java.util.regex.Pattern;public class StringExample {public static void main(String[] args) {String str = "Hello, World! 123 Java";// 字符串拼接String result = str + " - Welcome!";System.out.println("拼接后的字符串: " + result);// 查找某一子字符串int index = str.indexOf("Java");System.out.println("Java 字符串的起始索引: " + index);// 正则表达式匹配String regex = "\\d+"; // 匹配数字Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(str);while (matcher.find()) {System.out.println("找到的数字: " + matcher.group());}// 字符串替换String replaced = str.replace("World", "Java");System.out.println("替换后的字符串: " + replaced);// 字符串分割String[] words = str.split(" ");System.out.println("分割后的数组: ");for (String word : words) {System.out.println(word);}// 大小写转换System.out.println("大写字符串: " + str.toUpperCase());System.out.println("小写字符串: " + str.toLowerCase());// 字符编码转换byte[] bytes = str.getBytes(StandardCharsets.UTF_8);String encodedString = new String(bytes, StandardCharsets.UTF_8);System.out.println("编码转换后的字符串: " + encodedString);} }
-
流程控制
实现一个科学计算器,支持平方、平方根和阶乘计算。import java.util.Scanner;public class ScientificCalculator {public static double square(double number) {return number * number;}public static double squareRoot(double number) {if (number < 0) {throw new IllegalArgumentException("不能计算负数的平方根!");}return Math.sqrt(number);}public static long factorial(int number) {if (number < 0) {throw new IllegalArgumentException("不能计算负数的阶乘!");}long result = 1;for (int i = 1; i <= number; i++) {result *= i;}return result;}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);while (true) {System.out.print("\n选择操作:1. 平方 2. 平方根 3. 阶乘 4. 退出\n请输入选项:");int choice = scanner.nextInt();if (choice == 4) {System.out.println("退出程序。");break;}System.out.print("请输入一个数字:");double number = scanner.nextDouble();switch (choice) {case 1 -> System.out.printf("平方结果:%.2f\n", square(number));case 2 -> System.out.printf("平方根结果:%.2f\n", squareRoot(number));case 3 -> {int intNumber = (int) number;System.out.printf("阶乘结果:%d\n", factorial(intNumber));}default -> System.out.println("无效选项!");}}} }
-
大数
import java.math.BigInteger; import java.math.BigDecimal;public class BigNumbersExample {public static void main(String[] args) {// BigInteger 示例BigInteger big1 = new BigInteger("9876543210123456789");BigInteger big2 = new BigInteger("1234567890987654321");// 大数加法BigInteger sum = big1.add(big2);System.out.println("大数加法结果: " + sum);// 大数乘法BigInteger product = big1.multiply(big2);System.out.println("大数乘法结果: " + product);// BigDecimal 示例 - 处理精度高的小数BigDecimal decimal1 = new BigDecimal("0.123456789123456789123456789");BigDecimal decimal2 = new BigDecimal("0.987654321987654321987654321");// 小数加法BigDecimal decimalSum = decimal1.add(decimal2);System.out.println("大数小数加法结果: " + decimalSum);// 小数乘法BigDecimal decimalProduct = decimal1.multiply(decimal2);System.out.println("大数小数乘法结果: " + decimalProduct);// 限定小数精度BigDecimal rounded = decimalProduct.setScale(10, BigDecimal.ROUND_HALF_UP);System.out.println("四舍五入后的小数: " + rounded);} }
-
数组
实现一个成绩管理系统,支持存储、更新和计算多个学生的平均成绩。import java.util.Scanner;public class GradeManager {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.print("请输入学生人数:");int numStudents = scanner.nextInt();double[] grades = new double[numStudents];for (int i = 0; i < numStudents; i++) {System.out.printf("请输入学生 %d 的成绩:", i + 1);grades[i] = scanner.nextDouble();}double sum = 0;for (double grade : grades) {sum += grade;}double average = sum / numStudents;System.out.printf("所有学生的平均成绩为:%.2f\n", average);} }
相关文章:
三天急速通关Java基础知识:Day1 基本语法
三天急速通关JAVA基础知识:Day1 基本语法 0 文章说明1 关键字 Keywords2 注释 Comments2.1 单行注释2.2 多行注释2.3 文档注释 3 数据类型 Data Types3.1 基本数据类型3.2 引用数据类型 4 变量与常量 Variables and Constant5 运算符 Operators6 字符串 String7 输入…...
免费使用 Adobe 和 JetBrains 软件的秘密
今天想和大家聊聊如何利用 Edu 教育邮箱免费使用 Photoshop、Illustrator 等 Adobe 系列软件,以及 JetBrains 开发工具。 首先,Adobe 的软件是设计师的必备工具。无论是处理图像的 Photoshop,还是进行矢量设计的 Illustrator,它们…...
Pytorch 自学笔记(三):利用自定义文本数据集构建Dataset和DataLoader
Pytorch 自学笔记(三) 1. Dataset与DataLoader1.1 torch.utils.data.Dataset1.2 torch.utils.data.DataLoader Pytorch 自学笔记系列的第三篇。针对Pytorch的Dataset和DataLoader进行简单的介绍,同时,介绍如何使用自定义文本数据集…...
gradle项目的创建和基本结构简介
文章目录 创建gradle项目(命令行)创建gradle项目(IDEA)项目基本结构和功能Gradle 构建流程测试类体验 创建gradle项目(命令行) yangMacdeMac-mini gradleStudy % gradle init Starting a Gradle Daemon (s…...
wow-agent---Day3 Zigent 智能代理开发框架
这个框架是课程讲解的,但资料比较少,觉得框架比较小众,所以这里只分析代码,打算把更多的精力放在metagpt的学习上,毕竟还是要学教为主流的框架,这对后续维护升级都有帮助,当然感兴趣作为研究&am…...
python 入门
1. Python 概述 1.1 简介 python 是一种面向对象的解释型编程语言,由吉多范罗苏姆开发; 1991 年,公开发行版发布; 因其可以将其他语言制作的模块轻松联接在一起,又被称作胶水语言; 1.2 优点 简单易学&…...
sentinel微服务保护
学习链接 SpringCloudRabbitMQDockerRedis搜索分布式 文章目录 学习链接1.初识Sentinel1.1.雪崩问题及解决方案1.1.1.雪崩问题1.1.2.超时处理1.1.3.仓壁模式1.1.4.断路器1.1.5.限流1.1.6.总结 1.2.服务保护技术对比1.3.Sentinel介绍和安装1.3.1.初识Sentinel官网地址github地址…...
接口测试Day10-封装IHRM登录
-登录接口 普通方式实现 登录接口对象层 思路: 动态变化的,写入参数固定不变,直接写到方法实现内响应结果,通过返回值 return 分析: 封装实现: 登录接口测试用例层 封装断言方法 1、创建 文件 assert_uti…...
什么是IP地址、子网掩码、网关、DNS
简单解释 IP地址在网络中用于标识一个节点(或者网络设备的接口) IP地址用于IP报文在网络中的寻址 一个IPv4地址有32 bit。 IPv4地址通常采用“点分十进制”表示。 IPv4地址范围:0.0.0.0~255.255.255.255 网络部分:用来标识一个网络,代表IP地址所属网络。 主机部分:…...
python编程-OpenCV(图像读写-图像处理-图像滤波-角点检测-边缘检测)角点检测
角点检测(Corner Detection)是计算机视觉和图像处理中重要的步骤,主要用于提取图像中的关键特征,以便进行后续的任务,比如图像匹配、物体识别、运动跟踪等。下面介绍几种常用的角点检测方法及其应用。 1. Harris角点检…...
软路由系统iStoreOS 一键安装 docker compose
一键安装命令 大家好!今天我来分享一个快速安装 docker-compose 的方法。以下是我常用的命令,当前版本是 V2.32.4。如果你需要最新版本,可以查看获取docker compose最新版本号 部分,获取最新版本号后替换命令中的版本号即可。 w…...
Invicti-Professional-V25.1
01 更新介绍 此更新包括对内部代理的更改。内部扫描代理的当前版本为 25.1.0。内部身份验证验证程序代理的当前版本为 25.1.0。#新功能现在,单击扫描摘要屏幕中的预设扫描图标会将您重定向到具有过滤视图的 “最近扫描” 页面,从而改进导航和对相关扫描…...
【QT】: 初识 QWidget 控件 | QWidget 核心属性(API) | qrc 文件
🔥 目录 1. 控件概述 控件体系的发展阶段 2. QWidget 核心属性 2.1 核心属性概览2.2 用件可用(Enabled) 2.3 坐标系(Geometry) **实例 1: 控制按钮的位置**实例 2: 表白 程序 2.4 窗口标题(windowTiltle&a…...
Spring WebFlux
文章目录 一、概述1、Spring体系定位2、Spring MVC和WebFlux差异 二、入门1、依赖2、ReactorHttpHandlerAdapter(main启动)3、DispatcherHandler(SpringWebFlux启动)4、WebFilter 三、DispatcherHandler理解1、handle 前置知识&am…...
【AI | pytorch】torch.polar的使用
一、torch.polar的使用 torch.polar 是 PyTorch 中用来生成复数张量的一个函数,但它与数学中的复数表达式 ( z re^{i\theta} ) 是等价的。 具体来说,torch.polar(abs, angle) 接受两个实数张量参数: abs:表示复数的模长&#…...
AWTK fscript 中的 输入/出流 扩展函数
fscript 是 AWTK 内置的脚本引擎,开发者可以在 UI XML 文件中直接嵌入 fscript 脚本,提高开发效率。本文介绍一下 fscript 中的 iostream 扩展函数 1.iostream_get_istream 获取输入流对象。 原型 iostream_get_istream(iostream) > object示例 va…...
【多线程】线程池
一、什么是线程池 线程池(Thread Pool)是一种多线程并发执行的设计模式,它通过维护一个线程集合来执行多个任务,避免频繁地创建和销毁线程,提高系统性能和响应速度。 就好比如你经营了一家餐饮店,你名下有…...
小结:路由器配置和管理 RIP协议
华为路由器中配置和管理 RIP(Routing Information Protocol)的相关指令主要分为以下几个部分:基础配置指令、接口配置指令、路由控制指令和调试指令。以下是总结: 1. 启用 RIP 协议 [Huawei] rip 1rip 1:表示创建并启…...
基于海思soc的智能产品开发(高、中、低soc、以及和fpga的搭配)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 市场上关于图像、音频的soc其实非常多,这里面有高、中、低档,开发方式也不相同。之所以会这样,有价格的因素&am…...
于灵动的变量变幻间:函数与计算逻辑的浪漫交织(下)
大家好啊,我是小象٩(๑ω๑)۶ 我的博客:Xiao Xiangζั͡ޓއއ 很高兴见到大家,希望能够和大家一起交流学习,共同进步。 这一节我们主要来学习单个函数的声明与定义,static和extern… 这里写目录标题 一、单个函数…...
偷偷的学Java
序章:为何要偷偷学Java? • Java,不仅仅是一种编程语言 • 偷偷学Java,快速提升你的竞争力 •Java学习秘籍 第一章:Java的神秘面纱 •Java的起源与发展历程 •Java的生态系统与应用场景 • Java与其他编程语言的…...
以单用户模式启动 Linux 的方法
注:本文为 “Linux 启动单用户模式” 相关文章合辑。 未整理去重。 以单用户模式启动 linux 的三种方法 作者: Magesh Maruthamuthu 译者: LCTT Xiaobin.Liu 2020-05-03 23:01 单用户模式,也被称为维护模式,超级用户…...
【AI论文】生成式视频模型是否通过观看视频学习物理原理?
摘要:AI视频生成领域正经历一场革命,其质量和真实感在迅速提升。这些进步引发了一场激烈的科学辩论:视频模型是否学习了能够发现物理定律的“世界模型”,或者,它们仅仅是复杂的像素预测器,能够在不理解现实…...
【有啥问啥】Contrastive Captioners(CoCa):对比式图像描述模型——图像-文本基础模型的新范式
Contrastive Captioners(CoCa):对比式图像描述模型——图像-文本基础模型的新范式 引言 随着深度学习技术的发展,多模态模型在处理视觉和语言任务方面的能力逐渐增强。特别是大规模预训练模型的兴起,使得这些模型可以快速迁移到许多下游任务…...
Python(十七)excel指定列自动翻译成英文
前言 本章主要讲述在excel的指定列后面添加一列,并翻译成英文 一、效果图 二、代码 实际需求: # -*- codeing utf-8 -*- # time: 2025/1/16 16:32 # Author : Mikasa # # Aim:自动将客户发的货物清单里的商品名称,翻译成英文…...
【论文投稿】探秘计算机视觉算法:开启智能视觉新时代
目录 引言 一、计算机视觉算法基石:图像基础与预处理 二、特征提取:视觉信息的精华萃取 三、目标检测:从图像中精准定位目标 四、图像分类:识别图像所属类别 五、语义分割:理解图像的像素级语义 六、计算机视觉…...
【机器学习实战入门】使用LSTM机器学习预测股票价格
机器学习在股票价格预测中有重要的应用。在这个机器学习项目中,我们将讨论如何预测股票的收益。这是一个非常复杂的任务,充满了不确定性。我们将会把这个项目分成两部分进行开发: 首先,我们将学习如何使用 LSTM 神经网络预测股票…...
(一)相机标定——四大坐标系的介绍、对应转换、畸变原理以及OpenCV完整代码实战(C++版)
一、四大坐标系介绍 1,世界坐标系 从这个世界(world)的视角来看物体 世界坐标系是3D空间坐标,每个点的位置用 ( X w , Y w , Z w ) (X_w,Y_w,Z_w) (Xw,Yw,Zw)表示 2,相机坐标系 相机本身具有一个坐标系&…...
Bootstrap 下拉菜单
Bootstrap 下拉菜单 Bootstrap 是一个流行的前端框架,它提供了许多预构建的组件,其中之一就是下拉菜单。下拉菜单是一个交互式元素,允许用户从一系列选项中选择一个。在本篇文章中,我们将详细介绍如何在 Bootstrap 中创建和使用下…...
WinHttp API接口辅助类实现GET POST网络通讯
1、简述 近期需要在MFC基础上开发网络Http通讯,开始使用的WinINet进行通讯,后面发现WinINet对连接超时这块不支持设置,在网上搜索了几种方式效果都不太好,于是决定用WinHttp API接口进行通讯,分别对GET、POST进行了封装。 2、使用到接口 2.1、WinHttpOpen WinHttpOpen 是…...
Elasticsearch实战应用
嘿,小伙伴们,今天咱们来唠唠Elasticsearch,这可是个超厉害的搜索引擎,能帮你在海量数据里快速找到想要的东西,就像给你的数据装上了“放大镜”。 一、啥是Elasticsearch 简单来说,Elasticsearch就是一个基…...
MySQL存储过程
存储过程: 事先经过编译并存储在数据库中的一段sql语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的,思想上就是sql语言层面的代码封装与重用 …...
安路FPGA开发工具TD:问题解决办法 及 Tips 总结
安路科技(Anlogic)是一家专注于高性能、低功耗可编程逻辑器件(FPGA)设计和生产的公司。其提供的开发工具TD(TangDynasty)是专门为安路FPGA系列产品设计的集成开发环境(IDE)。以下是对…...
高精度阶乘C++实现
高精度计算,实际上就是模拟竖式计算,代码如下,请慢慢消化,如有不足或建议,请在评论区留言 这个阶乘操作实际上就是高精度乘法的运用,可以非常容易的在考场上写出来 #include <bits/stdc.h> using na…...
PageHelper快速使用
依赖 <!--分页插件PageHelper--> <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.7</version> </dependency>示例 /** * 封装分页结果…...
“AI 辅助决策系统:决策路上的智慧领航员
在当今瞬息万变的时代,无论是企业的运营管理,还是个人在生活中的重大抉择,都需要精准、高效的决策。然而,信息的繁杂和未来的不确定性,常常让决策变得困难重重。这时,AI 辅助决策系统宛如一位智慧的领航员&…...
[Linux] linux 系统中如何添加自动启动程序
背景:在嵌入式系统中,需要开机自动启动所编写的程序【可执行文件】。 解决方法:原理就是Linux开机会自动执行一些文件。在/etc/profile中添加执行程序的脚本。/etc/profile 是一个系统级的配置文件,在用户登录Linux系统时自动执行…...
Linux之网络套接字
Linux之网络套接字 一.IP地址和端口号二.TCP和UDP协议2.1网络字节序 三.socket编程的常见API四.模拟实现UDP服务器和客户端五.模拟实现TCP服务器和客户端 一.IP地址和端口号 在了解了网络相关的基础知识之后我们知道了数据在计算机中传输的流程并且发现IP地址在其中占据了确定…...
LeetCode 2266.统计打字方案数:排列组合
【LetMeFly】2266.统计打字方案数:排列组合 力扣题目链接:https://leetcode.cn/problems/count-number-of-texts/ Alice 在给 Bob 用手机打字。数字到字母的 对应 如下图所示。 为了 打出 一个字母,Alice 需要 按 对应字母 i 次,…...
Jmeter 动态参数压力测试时间段预定接口
🎯 本文档详细介绍了如何使用Apache JMeter进行压力测试,以评估预定接口在高并发场景下的性能表现。通过创建线程组模拟不同数量的用户并发请求,利用CSV文件动态配置时间段ID和用户token,确保了测试数据的真实性和有效性。文档中还…...
Learning Prompt
说明:这是我的学习笔记,很多内容转自网络,请查阅文章末尾的参考资料。 目录 基本要求(C.R.E.A.T.E)总结文章(Summarise)改写文章(Rewrite)根据参考资料回答问题(Question & Answer)参考资料 基本要求(C.R.E.A.T.E) Character This is th…...
微信消息群发(定时群发)-UI自动化产品(基于.Net平台+C#)
整理 | 小耕家的喵大仙 出品 | CSDN(ID:lichao19897314) 关联源码及工具下载https://download.csdn.net/download/lichao19897314/90096681https://download.csdn.net/download/lichao19897314/90096681https://download.csdn.net/download/…...
华为HuaweiCloudStack(一)介绍与架构
本文简单介绍了华为HCS私有云解决方案,并从下至上介绍HCS的整体架构,部署架构、部署方式等内容。 目录 HCS简介 HCS架构 纵向结构 ?管理平台类型 HCS节点类型 FusionSphere OpenStack CPS ServiceOM SC 运营面 OC 运维面 HCS部署架构 regi…...
【博客之星】2024年度个人成长、强化学习算法领域总结
📢在2025年初,非常荣幸能通过审核进入到《2024年度CSDN博客之星总评选》TOP300的年度评选中,排名40。这还是第一次来到这个阶段,作为一名博士研究生,还是备受鼓舞的。在这里我将以回顾的方式讲述一下这一年在CSDN中走过…...
Git 分支策略
文章目录 1. Git Flow2. GitHub Flow3. GitLab Flow4. Trunk-Based Development5. Release Flow分支最佳实践 Git 分支策略是组织和管理工作特性开发、协作和版本控制的技术。选择合适的策略取决于团队规模、项目需求和部署需求。以下是常见的 Git 分支策略: 1. Git…...
《自动驾驶与机器人中的SLAM技术》ch8:基于预积分和图优化的紧耦合 LIO 系统
和组合导航一样,也可以通过预积分 IMU 因子加上雷达残差来实现基于预积分和图优化的紧耦合 LIO 系统。一些现代的 Lidar SLAM 系统也采用了这种方式。相比滤波器方法来说,预积分因子可以更方便地整合到现有的优化框架中,从开发到实现都更为便…...
Mysql学习笔记
连接数据库 找到 MySQL 安装目录下的 bin 目录,然后打开命令窗口,在命令窗口中按如下语法输入命令: mysql - h MySQL 数据库服务器的 IP 地址 - u 用户名 - p 然后按下回车键,输入密码即可 数据库操作 创建数据库 CREAT…...
Safari常用快捷键
一、书签边栏 1、显示或隐藏书签边栏:Control-Command-1 2、选择下一个书签或文件夹:向上头键或向下头键 3、打开所选书签:空格键 4、打开所选文件夹:空格键或右箭头键 5、关闭所选文件夹:空格键或左箭头键 6、更…...
OpenEuler学习笔记(二):用通俗的道理讲操作系统原理
用通俗的道理讲操作系统原理 基础概念类比 把OpenEuler操作系统想象成一个大型的工厂,这个工厂有各种各样的部门,每个部门都有自己的职责,共同协作来让整个工厂正常运转。内核就像是工厂的管理中心,它负责指挥和协调所有的工作。 …...
ros2-7.5 做一个自动巡检机器人
7.5.1 需求及设计 又到了小鱼老师带着做最佳实践项目了。需求:做一个在各个房间不断巡逻并记录图像的机器人。 到达目标点后首先通过语音播放到达目标点信息, 再通过摄像头拍摄一张图片保存到本地。 7.5.2 编写巡检控制节点 在chapt7_ws/src下新建功…...