Java 面试笔记 - Java基础
1 、JDK、JRE 和 JVM 是 Java 开发与运行环境中的三个核心组件,它们之间的关系和区别如下:
1. JDK (Java Development Kit)
- 定义:JDK 是 Java 开发工具包,包含了开发 Java 应用程序所需的所有工具和库。
- 包含内容:
- 编译器(javac):将 Java 源代码编译为字节码。
- 调试工具(jdb):用于调试 Java 程序。
- 其他开发工具(如 javadoc、jar 等)。
- JRE:JDK 包含了 JRE,因此 JDK 也可以运行 Java 程序。
- 用途:用于开发 Java 应用程序。
2. JRE (Java Runtime Environment)
- 定义:JRE 是 Java 运行时环境,提供了运行 Java 应用程序所需的基本组件。
- 包含内容:
- JVM:JRE 包含了 JVM,用于执行 Java 字节码。
- 核心类库:Java 标准库,提供了 Java 程序运行所需的基础类。
- 用途:用于运行 Java 应用程序,但不包含开发工具。
3. JVM (Java Virtual Machine)
- 定义:JVM 是 Java 虚拟机,负责执行 Java 字节码。
- 功能:
- 解释和执行字节码。
- 提供内存管理、垃圾回收等功能。
- 跨平台支持:JVM 使得 Java 程序可以在不同的操作系统上运行。
- 用途:JVM 是 Java 程序运行的核心引擎。
关系总结
- JDK ⊇ JRE ⊇ JVM:
- JDK 包含了 JRE 和开发工具。
- JRE 包含了 JVM 和核心类库。
- JVM 是运行 Java 程序的核心组件。
区别总结
组件 | 功能 | 包含内容 | 用途 |
---|---|---|---|
JDK | 开发工具包 | 编译器、调试工具、JRE | 开发 Java 应用程序 |
JRE | 运行时环境 | JVM、核心类库 | 运行 Java 应用程序 |
JVM | 虚拟机 | 字节码执行引擎 | 执行 Java 字节码 |
使用场景
- 开发:安装 JDK,因为它包含了所有开发工具。
- 运行:如果只需要运行 Java 程序,安装 JRE 即可。
- 跨平台:JVM 确保 Java 程序可以在不同操作系统上运行,实现“一次编写,到处运行”。
2 、在 Java 中,标识符是用来命名变量、方法、类、接口、包等的名称。Java 标识符的命名规则如下:
1. 基本规则
- 字符范围:
- 可以使用字母(
A-Z
或a-z
)、数字(0-9
)、下划线(_
)和美元符号($
)。 - 支持 Unicode 字符,因此可以使用非英文字符(如中文、日文等),但不推荐。
- 可以使用字母(
- 开头字符:
- 标识符必须以字母、下划线(
_
)或美元符号($
)开头,不能以数字开头。
- 标识符必须以字母、下划线(
- 长度限制:
- 标识符的长度没有严格限制,但应保持简洁和有意义。
- 区分大小写:
- Java 是区分大小写的,因此
myVar
和myvar
是两个不同的标识符。
- Java 是区分大小写的,因此
2. 关键字和保留字
- 不能使用关键字:
- Java 的关键字(如
class
、public
、static
等)不能用作标识符。
- Java 的关键字(如
- 不能使用保留字:
- 保留字(如
goto
、const
等)也不能用作标识符。
- 保留字(如
3. 命名规范
虽然 Java 对标识符的命名没有强制要求,但遵循一定的命名规范可以提高代码的可读性和可维护性。以下是常见的命名规范:
1. 类名和接口名
- 使用大驼峰命名法(PascalCase):
- 每个单词的首字母大写,其余字母小写。
- 示例:
MyClass
,UserService
,StudentRecord
。
2. 方法名和变量名
- 使用小驼峰命名法(camelCase):
- 第一个单词的首字母小写,后续单词的首字母大写。
- 示例:
getUserName
,calculateTotalPrice
,isValid
。
3. 常量名
- 使用全大写字母,单词之间用下划线分隔:
- 示例:
MAX_VALUE
,PI
,DEFAULT_TIMEOUT
。
- 示例:
4. 包名
- 使用全小写字母,单词之间用点号(
.
)分隔:- 示例:
com.example.myapp
,org.apache.commons
。
- 示例:
4. 示例
// 类名
public class MyClass {// 常量名public static final int MAX_VALUE = 100;// 变量名private String userName;// 方法名public void setUserName(String userName) {this.userName = userName;}
}
5. 注意事项
- 避免使用单个字符:
- 除非是临时变量或循环变量(如
i
、j
、k
),否则应避免使用单个字符作为标识符。
- 除非是临时变量或循环变量(如
- 语义化命名:
- 标识符应具有描述性,能够清晰地表达其用途。
- 避免混淆:
- 不要使用与 Java 标准库类名相同的标识符(如
String
、System
等)。
- 不要使用与 Java 标准库类名相同的标识符(如
遵循这些规则和规范,可以使你的 Java 代码更加规范、易读和易于维护。
3、在 Java 中,常量和变量是用于存储数据的两种主要方式,它们的区别主要体现在以下几个方面:
1. 定义
-
变量:
- 变量是程序中可以改变其值的数据存储单元。
- 使用关键字
int
、String
、double
等声明变量。 - 示例:
int age = 25; // 变量 age 的值可以被修改 age = 30; // 合法
-
常量:
- 常量是程序中一旦赋值后就不能再改变其值的数据存储单元。
- 使用
final
关键字声明常量。 - 示例:
final double PI = 3.14159; // 常量 PI 的值不能被修改 PI = 3.14; // 非法,编译报错
2. 可变性
- 变量:
- 变量的值可以在程序运行过程中被多次修改。
- 常量:
- 常量的值一旦赋值后就不能再修改。
3. 声明方式
-
变量:
- 使用数据类型直接声明。
- 示例:
int count = 10; String name = "Alice";
-
常量:
- 使用
final
关键字声明。 - 示例:
final int MAX_VALUE = 100; final String GREETING = "Hello";
- 使用
4. 命名规范
- 变量:
- 使用小驼峰命名法(camelCase)。
- 示例:
userName
,totalCount
。
- 常量:
- 使用全大写字母,单词之间用下划线分隔。
- 示例:
MAX_VALUE
,DEFAULT_TIMEOUT
。
5. 内存分配
- 变量:
- 变量的值存储在栈或堆中,具体取决于变量的类型(基本类型或引用类型)。
- 常量:
- 常量的值在编译时被确定,通常存储在常量池中,以提高访问效率。
6. 用途
- 变量:
- 用于存储程序中需要动态变化的数据。
- 示例:计数器、用户输入、计算结果等。
- 常量:
- 用于存储程序中固定不变的数据。
- 示例:数学常数(如 π)、配置参数、固定的业务规则等。
7. 示例对比
public class Example {// 常量public static final double PI = 3.14159;public static void main(String[] args) {// 变量int radius = 5;double area = PI * radius * radius; // 使用常量 PI 计算面积System.out.println("Area: " + area);// 修改变量的值radius = 10;area = PI * radius * radius;System.out.println("Updated Area: " + area);// 尝试修改常量(会导致编译错误)// PI = 3.14; // 非法}
}
总结
特性 | 变量 | 常量 |
---|---|---|
可变性 | 值可以修改 | 值不可修改 |
声明 | 使用数据类型声明 | 使用 final 关键字声明 |
命名 | 小驼峰命名法(camelCase) | 全大写字母,下划线分隔 |
用途 | 存储动态变化的数据 | 存储固定不变的数据 |
内存 | 存储在栈或堆中 | 存储在常量池中 |
通过合理使用常量和变量,可以使代码更加清晰、易读和易于维护。
4、Java 的基本数据类型(Primitive Data Types)是 Java 语言中预定义的、不可再分的数据类型。它们用于存储简单的数据值,而不是对象。Java 的基本数据类型共有 8 种,分为以下四类:
1. 整数类型
用于存储整数值,包括正数、负数和零。
数据类型 | 大小(字节) | 取值范围 | 默认值 |
---|---|---|---|
byte | 1 | -128 到 127 | 0 |
short | 2 | -32,768 到 32,767 | 0 |
int | 4 | -2,147,483,648 到 2,147,483,647 | 0 |
long | 8 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | 0L |
- 示例:
byte b = 100; short s = 1000; int i = 100000; long l = 10000000000L; // 注意:long 类型需要在值后加 'L'
2. 浮点类型
用于存储带小数部分的数值。
数据类型 | 大小(字节) | 取值范围 | 默认值 |
---|---|---|---|
float | 4 | 约 ±3.40282347E+38F(6-7 位有效数字) | 0.0f |
double | 8 | 约 ±1.79769313486231570E+308(15 位有效数字) | 0.0d |
- 示例:
float f = 3.14f; // 注意:float 类型需要在值后加 'f' double d = 3.141592653589793;
3. 字符类型
用于存储单个字符。
数据类型 | 大小(字节) | 取值范围 | 默认值 |
---|---|---|---|
char | 2 | 0 到 65,535(Unicode 字符) | ‘\u0000’ |
- 示例:
char c = 'A'; char unicodeChar = '\u0041'; // 表示字符 'A'
4. 布尔类型
用于存储逻辑值,只有两个可能的值:true
或 false
。
数据类型 | 大小(字节) | 取值范围 | 默认值 |
---|---|---|---|
boolean | 1(实际大小依赖于 JVM 实现) | true 或 false | false |
- 示例:
boolean isJavaFun = true; boolean isFishTasty = false;
5 、在 Java 中,自动类型提升和强制类型转换是处理不同类型数据之间赋值和运算的两种重要机制。它们的主要区别在于是否显式指定类型转换以及是否可能导致数据丢失。
1. 自动类型提升(Automatic Type Promotion)
- 定义:
- 在表达式中,如果操作数的类型不一致,Java 会自动将较小的数据类型提升为较大的数据类型,以便进行计算。
- 这种提升是隐式的,无需程序员显式指定。
- 范围小的值赋值给范围大的值,自动类型提升。
- 范围小的与范围大的值混合运算,自动类型提升为范围大的值的类型。
- byte、short、char 数据类型进行算数或位运算时按int处理。
- 提升规则:
- 如果操作数中有一个是
double
,另一个操作数会被提升为double
。 - 否则,如果有一个是
float
,另一个操作数会被提升为float
。 - 否则,如果有一个是
long
,另一个操作数会被提升为long
。 - 否则,操作数会被提升为
int
。
- 如果操作数中有一个是
- 示例:
int a = 10; double b = 5.5; double result = a + b; // a 自动提升为 double System.out.println(result); // 输出 15.5
2. 强制类型转换(Type Casting)
-
定义:
- 将一种数据类型显式转换为另一种数据类型。
- 需要程序员手动指定,使用
(目标类型)
的语法。 - 可能导致数据丢失(如将
double
转换为int
时小数部分被截断)。
-
语法:
(目标类型) 表达式
-
示例:
double a = 10.5; int b = (int) a; // 强制将 double 转换为 int System.out.println(b); // 输出 10(小数部分被截断)
3. 自动类型提升与强制类型转换的区别
特性 | 自动类型提升 | 强制类型转换 |
---|---|---|
是否需要显式指定 | 不需要,Java 自动完成 | 需要,程序员显式指定 |
数据丢失风险 | 不会丢失数据 | 可能丢失数据(如精度损失) |
适用场景 | 表达式中不同类型数据的运算 | 需要将较大类型转换为较小类型时 |
4. 自动类型提升的规则
Java 的自动类型提升遵循以下顺序(从小到大):
byte → short → int → long → float → double → char
6、为什么 float
比 long
类型存储的范围大
在 Java 中,float
和 long
的存储范围差异源于它们的底层设计目标和数据表示方式。以下是详细解释:
1. 数据类型的存储结构
类型 | 位数 | 存储方式 | 数值范围(近似) |
---|---|---|---|
long | 64位 | 二进制补码整数(精确存储) | -9.2e18 ~ 9.2e18 |
float | 32位 | IEEE 754 浮点数(近似存储) | ±1.4e-45 ~ ±3.4e38 |
2. 为什么 float
的范围更大?
float
的范围远大于 long
,核心原因是 浮点数通过指数位牺牲精度来扩展范围:
-
浮点数的组成:
float
使用 IEEE 754 标准 表示浮点数,其 32 位分为三部分:- 1 位符号位:表示正负。
- 8 位指数位:用于表示数值的大小范围。
- 23 位尾数位:用于表示数值的有效数字。
-
指数位的作用:
float
的 8 位指数 可以表示从-126
到+127
的指数范围,这使得它可以表示非常大或非常小的数。- 最大值为 (2^{127} \approx 1.7 \times 10^{38}),远大于
long
的 (2^{63} \approx 9.2 \times 10^{18})。
-
尾数位的代价:
float
的 23 位尾数 仅能表示约 7 位有效十进制数字,超出部分会丢失精度。- 例如:
float
可以表示1.234567e30
,但无法精确存储123456789012345678901234567890
。
3. long
的精确性优势
long
的 64 位完全用于整数存储,因此它可以精确表示范围内的所有整数,没有任何精度损失。- 适用场景:
- 需要精确计算的场景(如金融、计数器)。
- 示例:
long value = 9_223_372_036_854_775_807L;
(最大值)。
4. float
的典型问题
long longValue = 9_223_372_036_854_775_807L; // 合法且精确
float floatValue = longValue; // 转换为 float 会丢失精度!
System.out.println(floatValue); // 输出:9.223372E18(无法还原精确值)
5. 总结对比
特性 | long | float |
---|---|---|
存储方式 | 精确的整数 | 近似的浮点数(指数 + 尾数) |
范围 | 较小(±9e18) | 极大(±3.4e38) |
精度 | 完全精确 | 约 7 位有效数字 |
用途 | 精确计算(如金额、ID) | 科学计算、工程测量(容忍误差) |
6. 实际应用建议
- 优先用
long
:需要精确整数时(如计数器、唯一标识符)。 - 谨慎用
float
:需要大范围但可接受精度损失时(如物理仿真)。 - 超大范围需求:Java 提供了
BigInteger
和BigDecimal
类型支持任意精度计算。
总结
float
的范围比 long
大是因为它使用了指数部分来扩展数值范围,而 long
是一个固定长度的整数类型,只能表示有限范围内的精确整数值。虽然 float
的范围更大,但它以牺牲精度为代价,因此在选择数据类型时应根据具体需求权衡范围和精度的要求。
7、为什么 0.1 + 0.2
不等于 0.3
?
在 Java 中,0.1 + 0.2
的结果并不是精确的 0.3
,而是接近 0.3
的一个值(如 0.30000000000000004
)。这种现象的根本原因在于浮点数的二进制表示方式和 IEEE 754 标准的限制。
1. 浮点数的二进制表示
-
十进制小数转二进制:
- 十进制的小数(如
0.1
和0.2
)在转换为二进制时,可能会变成无限循环小数。 - 例如,
0.1
在二进制中是0.00011001100110011...
(无限循环),而0.2
是0.0011001100110011...
(同样无限循环)。
- 十进制的小数(如
-
有限精度存储:
- 浮点数在计算机中使用有限的位数来存储,因此这些无限循环的小数必须被截断或舍入。
- 这种舍入误差会导致计算结果不精确。
2. IEEE 754 标准
Java 使用 IEEE 754 标准来表示浮点数。根据该标准:
-
单精度浮点数 (
float
):- 32 位,其中 1 位符号位、8 位指数位、23 位尾数位。
-
双精度浮点数 (
double
):- 64 位,其中 1 位符号位、11 位指数位、52 位尾数位。
由于尾数位的限制,无法精确表示某些十进制小数,导致计算结果出现微小误差。
3. 具体示例
public class FloatPrecisionExample {public static void main(String[] args) {double a = 0.1;double b = 0.2;double sum = a + b;System.out.println("0.1 + 0.2 = " + sum); // 输出: 0.30000000000000004}
}
输出结果为 0.30000000000000004
,而不是预期的 0.3
。
4. 解决方法
为了避免浮点数的精度问题,可以采用以下几种方法:
-
使用
BigDecimal
类型:BigDecimal
提供了任意精度的十进制数表示,适用于需要高精度计算的场景(如金融应用)。
import java.math.BigDecimal;public class BigDecimalExample {public static void main(String[] args) {BigDecimal a = new BigDecimal("0.1");BigDecimal b = new BigDecimal("0.2");BigDecimal sum = a.add(b);System.out.println("0.1 + 0.2 = " + sum); // 输出: 0.3} }
-
四舍五入:
- 如果对精度要求不高,可以通过四舍五入来处理浮点数的结果。
public class RoundingExample {public static void main(String[] args) {double a = 0.1;double b = 0.2;double sum = Math.round((a + b) * 10) / 10.0;System.out.println("0.1 + 0.2 = " + sum); // 输出: 0.3} }
-
避免直接比较浮点数:
- 在进行浮点数比较时,不要直接使用
==
,而是使用一个小的容差范围(epsilon)来进行比较。
public class FloatingPointComparison {private static final double EPSILON = 1e-10;public static boolean nearlyEqual(double a, double b) {return Math.abs(a - b) < EPSILON;}public static void main(String[] args) {double a = 0.1;double b = 0.2;double sum = a + b;if (nearlyEqual(sum, 0.3)) {System.out.println("0.1 + 0.2 is approximately equal to 0.3");} else {System.out.println("0.1 + 0.2 is not equal to 0.3");}} }
- 在进行浮点数比较时,不要直接使用
5. 总结
0.1 + 0.2
不等于 0.3
是因为浮点数在二进制表示中的舍入误差。为了确保高精度计算,建议使用 BigDecimal
或其他适合的方法来处理浮点数运算。
8、++ – 在前在后有什么区别?
- 单独运算时,前后没有区别,相当于 +n 或 -n。
- 复合运算时,++ – 在前先运算再赋值,++ – 在后时先复制再运算。
9 、Java 是一种面向对象的编程语言,其核心特点包括以下几点:
1. 封装(Encapsulation)
- 定义:将数据(属性)和操作数据的方法(行为)绑定在一起,并隐藏内部实现细节。
- 实现方式:通过访问修饰符(如
private
、protected
、public
)控制对类成员的访问。 - 优点:提高代码的安全性、可维护性和复用性。
2. 继承(Inheritance)
- 定义:子类继承父类的属性和方法,并可以扩展或重写父类的功能。
- 实现方式:通过
extends
关键字实现类与类之间的继承。 - 优点:减少代码冗余,提高代码的可重用性和可扩展性。
3. 多态(Polymorphism)
- 定义:同一操作作用于不同的对象,可以有不同的解释和执行结果。
- 实现方式:
- 方法重载(Overloading):同一个类中方法名相同,参数列表不同。
- 方法重写(Overriding):子类重写父类的方法。
- 接口和抽象类:通过接口或抽象类实现多态。
- 优点:提高代码的灵活性和可扩展性。
4. 抽象(Abstraction)
- 定义:隐藏复杂的实现细节,只暴露必要的接口或功能。
- 实现方式:通过抽象类(
abstract class
)和接口(interface
)实现。 - 优点:简化复杂系统的设计和实现。
5. 类与对象(Class and Object)
- 类:类是对象的模板,定义了对象的属性和行为。
- 对象:对象是类的实例,具有类定义的属性和行为。
- 特点:Java 中一切皆对象(除了基本数据类型)。
6. 其他面向对象特性
- 消息传递:对象之间通过方法调用进行通信。
- 动态绑定:在运行时确定调用哪个方法(多态的基础)。
- 组合与聚合:通过对象组合实现复杂功能,而不是仅依赖继承。
示例代码
在你的 JavaTest
类中,可以简单体现这些特性:
package org.face;// 封装
class Animal {private String name; // 私有属性public Animal(String name) {this.name = name;}public void speak() { // 公共方法System.out.println(name + " makes a sound.");}
}// 继承
class Dog extends Animal {public Dog(String name) {super(name);}@Overridepublic void speak() { // 方法重写System.out.println("Woof!");}
}// 多态
public class JavaTest {public static void main(String[] args) {Animal myAnimal = new Dog("Buddy"); // 父类引用指向子类对象myAnimal.speak(); // 输出 "Woof!"}
}
总结
Java 的面向对象特性使其非常适合开发大型、复杂的应用程序,通过封装、继承、多态和抽象,可以提高代码的可维护性、可扩展性和复用性。
10、在Java中,final
、finally
和finalize
虽然拼写相似,但它们的用途和含义完全不同。以下是它们的区别:
1. final
- 用途:
final
是一个关键字,用于修饰类、方法和变量。 - 作用:
- 类:被
final
修饰的类不能被继承。 - 方法:被
final
修饰的方法不能被子类重写。 - 变量:被
final
修饰的变量一旦被赋值后,其值不能被修改(即常量)。
- 类:被
final class FinalClass {} // 不能被继承
class Parent {final void finalMethod() {} // 不能被子类重写
}
final int x = 10; // x的值不能被修改
2. finally
- 用途:
finally
是一个关键字,用于异常处理中的try-catch
块。 - 作用:
finally
块中的代码无论是否发生异常都会执行,通常用于释放资源或执行清理操作。
try {// 可能抛出异常的代码
} catch (Exception e) {// 异常处理
} finally {// 无论是否发生异常,都会执行的代码
}
3. finalize
- 用途:
finalize
是Object
类中的一个方法,用于垃圾回收。 - 作用:在对象被垃圾回收器回收之前,
finalize
方法会被调用。通常用于释放非Java资源(如文件句柄、网络连接等)。
@Override
protected void finalize() throws Throwable {try {// 清理资源} finally {super.finalize();}
}
总结
final
:用于修饰类、方法和变量,表示不可变。finally
:用于异常处理,确保代码块一定会执行。finalize
:用于垃圾回收,在对象被回收前执行清理操作。
这三者在Java中的作用和场景完全不同,理解它们的区别有助于更好地编写和维护Java代码。
11、
相关文章:
Java 面试笔记 - Java基础
1 、JDK、JRE 和 JVM 是 Java 开发与运行环境中的三个核心组件,它们之间的关系和区别如下: 1. JDK (Java Development Kit) 定义:JDK 是 Java 开发工具包,包含了开发 Java 应用程序所需的所有工具和库。包含内容: 编…...
基于MFC实现的键盘电子乐器演奏程序
基于MFC实现的键盘电子乐器演奏程序设计 1.项目简介 需要连接西电微机原理实验室提供的 QTH9054 微机试验箱,使用其蜂鸣器发声,若不连接,程序会直接播放 mp3 文件模拟钢琴声。 请在 release 处下载编译好的 exe 文件运行,如需计…...
支持批量导出的软件,效率拉满!
今天给大家分享一款超实用的软件,它能帮你批量导出PPT里的图片,简直是提升工作效率的神器! PPT转jpg PPT逐页导出为图片 这款软件超级简单易用,打开就能直接上手,不需要复杂的设置。 这个软件有三种功能, …...
AI前端开发:职业晋升的加速器
在数字经济时代,前端开发领域正在经历一场由人工智能 (AI) 技术驱动的深刻变革。掌握AI技能,已不再是锦上添花,而是成为前端工程师职业晋升的关键竞争力。本文将探讨AI写代码工具等AI技术如何重塑前端开发职业路径,以及如何通过学…...
在mfc中使用自定义三维向量类和计算多个三维向量的平均值
先添加一个普通类, Vector3.h, // Vector3.h: interface for the Vector3 class. // //#if !defined(AFX_VECTOR3_H__53D34D26_95FF_4377_BD54_57F4271918A4__INCLUDED_) #define AFX_VECTOR3_H__53D34D26_95FF_4377_BD54_57F4271918A4__INCLUDED_#if _MSC_VER > 1000 #p…...
RK3588配置成为路由器
文章目录 前言一、配置netplan二、安装hostapd1.创建hostapd.conf文件2.安装软件3.修改启动文件4.修改/etc/default/hostapd 文件 三、安装dnsmasq服务四、配置NET及重启验证五、常见问题总结 前言 RK3588开发板有两个网口,一个无线网卡。我需要配置为家用路由器模…...
力扣-回溯-40 组合总和Ⅱ
思路 需要实现树枝层面的去重,利用use数组来判别,如果前一个节点已经使用了,说明这是在往深处遍历了,允许重复,如果前一个节点没有使用且值相同的话,说明是在树枝上重复了 代码 class Solution { public…...
深入理解 Rust 中的 `Box<T>`:堆上的数据与递归类型
1. Box<T> 的基础知识 1.1 堆与栈的分工 在默认情况下,Rust 会将变量存储在栈上。然而,栈的空间有限,且对于大小未知或极大的数据来说,栈并不适用。使用 Box<T>,我们可以将数据存放在堆上,而…...
js原型和原型链,到底咋回事?
js原型和原型链,到底咋回事? js原型的原理 在 JavaScript 里,每个对象都有一个“隐藏的小伙伴”,这个“小伙伴”就是原型。可以把原型想象成一个模板或者一个仓库,对象能从它这个“小伙伴”那里借用一些属性和方法。…...
深入理解IP地址与端口:网络通信的基石
深入理解IP地址与端口:网络通信的基石 文章大纲 网络通信基础概念 1.1 什么是网络通信1.2 OSI模型与TCP/IP模型1.3 数据包传输原理 IP地址深度解析 2.1 IP地址定义与作用2.2 IPv4与IPv6对比2.3 子网划分与CIDR表示法2.4 公网IP与私网IP2.5 特殊IP地址详解 端口机…...
ubuntu系统本地部署deepseek
1、安装ollama 用Ollama部署deepseek模型,官网地址:https://ollama.com/download 根据官网给出的命令直接安装(安装linux版本) curl -fsSL https://ollama.com/install.sh | sh2、安装deepseek-r1模型 我这里用了8b,…...
nginx ngx_http_module(10) 指令详解
nginx ngx_http_module(10) 指令详解 nginx 模块目录 nginx 全指令目录 一、目录 1.1 模块简介 ngx_http_v2_module:HTTP/2支持模块,允许Nginx通过HTTP/2协议与客户端进行通信。HTTP/2带来了许多性能优化,如多路复用、头部压缩和服务器推…...
rman 备份恢复1
前提: rman用户必须具有sysdba权限 使用常用连接方式如下: rman target / rman target sys/oracle rman target sys/oracleprod1 catalog dav/oracledav_db 一个rman连接会产生两个进程,action字段为空的就是rman的监控进程,另…...
BeautifulSoup、lxml/XPath和正则表达式在数据爬取中的适用场景
在数据爬取中,BeautifulSoup、lxml/XPath和正则表达式的适用场景各有侧重,具体选择需根据数据特征和需求权衡: 1. BeautifulSoup(结合CSS选择器) 适用场景 简单结构页面:标签层级清晰、属性固定的HTML页面…...
Python装饰器本质250220
定义一个函数,在不修改这个函数的代码的情况下,让函数执行前后会有新的内容加入 def func():print("func")return def outer():def inner():print("new code before")func()print("new code after")returnreturn inner f…...
实时、分时、半实时半分时操作系统
在操作系统中,实时、分时、半实时半分时是三种不同的调度策略,它们决定了系统如何分配和管理CPU资源。以下是它们的定义和举例: 1. 实时操作系统(RTOS, Real-Time Operating System) 定义:实时操作系统是…...
玩转Docker | 使用Docker部署本地自托管reference速查表工具
玩转Docker | 使用Docker部署本地自托管reference速查表工具 前言一、Reference介绍Reference简介主要特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署reference服务下载镜像创建容器检查容器状态检查服务端口安全设置四、访问reference应用五、测试与…...
基于springboot校园健康系统的设计与实现(源码+文档)
大家好我是风歌,今天要和大家聊的是一款基于springboot的园健康系统的设计与实现。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 基于springboot校园健康系统的设计与实现的主要使用者管理员具有最高的权限,通…...
孤独症项目(1)
年也过了,也不能一直玩,该学习还是要学习。 过年前我算是把环境配置好,然后把项目跑起来了,现在的问题是我看不懂这个代码什么意思 代码还是要一行一行看,每一行都看懂了,全文自然就知道了 1 from pathlib…...
DeepSeek 冲击(含本地化部署实践)
DeepSeek无疑是春节档最火爆的话题,上线不足一月,其全球累计下载量已达4000万,反超ChatGPT成为全球增长最快的AI应用,并且完全开源。那么究竟DeepSeek有什么魔力,能够让大家趋之若鹜,他又将怎样改变世界AI格…...
《被讨厌的勇气》(七)
1.共同体感觉是幸福的人际关系的最重要的指标。 2.把对自己的执著变成对他人的关心。 3.不能进行“课题分离”、一味拘泥于认可欲求的人也是及其以自我为中心的人。 4.一味在意“他人怎么看”的生活方式正式只关心“我”的自我中心式的生活方式。 5.别人并不是为了满足你的期待…...
【Word转PDF】在线Doc/Docx转换为PDF格式 免费在线转换 功能强大好用
在日常办公和学习中,将Word文档转换为PDF格式的需求非常普遍。无论是制作简历、撰写报告还是分享文件,都需要确保文档格式在不同设备上保持一致。而小白工具的“Word转PDF”功能正是为此需求量身打造的一款高效解决方案。 【Word转PDF】在线Doc/Docx转换…...
SpringCloud面试题----eureka和zookeeper都可以提供服务注册与发现的功能,请说说两个的区别
dEureka 和 Zookeeper 都可以提供服务注册与发现的功能,它们的区别主要体现在以下几个方面: 设计理念 Eureka:是基于 RESTful 风格设计的,强调简单、轻量级,旨在为微服务架构提供一种易于使用的服务发现解决方案,注重服务的可用性和灵活性。Zookeeper:最初是为分布式协…...
Matplotlib中strpdate2num()函数报错的解决方法
在Matplotlib绘图时,有时会从文件中读取形如“2025/2/20”格式的日期数据,在读取了日期数据后,会通过Matplotlib.dates.strpdate2num()函数将日期格式变为浮点数进行绘制。 1 matplotlib.dates不再支持strpdate2num()函数 使用matplotlib.d…...
easyexcel 2.2.6版本导出excel模板时,标题带下拉框及其下拉值过多不显示问题
需求背景:有一个需求要做下拉框的值有100多条,同时这个excel是一个多sheet的导入模板 直接用easyexcel 导出,会出现下拉框的值过多,导致生成出来的excel模板无法正常展示下拉功能 使用的easyexcel版本:<depende…...
Java链表全解析:从单向链表到双向链表的实现与优化
一、链表的核心特性 链表是一种通过 节点 存储数据的线性数据结构,每个节点包含 数据域 和 指针域。节点在内存中 不连续存储,通过指针串联。 1.单向链表 2.双向链表 3.环形链表 环形单链表 环形双链表 4.链表的类型 类型结构描述典型应用场景单向链表每个节点只有 一个指…...
《动手学机器人学》笔记
目录 0.介绍1.概述|空间位置、姿态的描述(33)|《动手学机器人学》2.(2)-Robotics Toolbox①(V10.4)3.齐次坐标与变换矩阵4.一般形式的旋转变换矩阵5.(轴角法)…...
【小游戏】C++控制台版本俄罗斯轮盘赌
制作团队:洛谷813622(Igallta) 989571(_ayaka_) Mod:_ayaka_ 双人模式:Igallta 公告: 原先的9.8改名为 Alpha 1.0,以后每次更新都增加 0.1。 Alpha 1.11 改为 Beta 1…...
最新扣子(Coze)案例教程:全自动DeepSeek 写影评+批量生成 + 发布飞书,提效10 倍!手把手教学,完全免费教程
👨💻群里有同学是做影视赛道的博主,听说最近DeepSeek这么火,咨询能不能用DeepSeek写影评,并整理电影数据资料,自动发布到飞书文档,把每天的工作做成一个自动化的流程。 那今天斜杠君就为大家…...
Java集合框架之ArrayList解析
目录 一、ArrayList概述 二、优缺点分析 三、底层数据结构 四、源码分析ArrayList初始化容量 五、源码分析ArrayList扩容策略 六、ArrayList集合源码分析 1. 属性分析 2. 构造方法分析 无参构造方法 指定初始容量的构造方法 传入集合的构造方法 3. 添加元素 add(E…...
idea 2023.3.7常用插件
idea 2023.3.7常用插件 文档 idea 2019.3常用插件idea 2023.3.7常用插件 idea 2023.3.7常用插件 插件名称插件版本说明1AceJump3.5.9AceJump允许您快速将插入符号导航到编辑器中可见的任何位置。只需按“ctrl;”,键入一个字符,然后在Ace …...
IM聊天系统架构实现
一、IM系统整体架构 二、企业级IM系统如何实现心跳与断线重连机制; 1、重连机制(服务端下线) 服务端下线,客户端netty可以感知到,在感知的方法中进行重连的操作,注意重连可能连接到旧的服务器继续报错&…...
vue3可选链操作符(?.)
一、定义: 可选链操作符(?.)是 JavaScript 中的一个语法,用于安全地访问对象的属性,即使该对象为 null 或 undefined,也不会抛出错误,而是返回 undefined。 1、不使用可选链操作符࿱…...
科普:Docker run的相关事项
一、镜像名(含标签)太长 如,通过如下命令行: docker pull designthru2019/dify:56c6d1af0944dbdb5e0115cb623ff0e118a4ac62拉取的镜像名(及标签)太长,可以通过改名的方法变短。 在 Docker 中&…...
petalinux高版本设置自动登录和开机自启动配置
petalinux-config -c rootfs 依次选择 Image Features -> serial-autologin-root 这是配置 进来就是root权限 创建并安装名为 myapp-init 的新建应用程序 petalinux-create -t apps --template install -n myapp-init --enable 编辑 project-spec/meta-user/recipes-…...
算法刷题-哈希表的总结
什么时候用数组、什么时候用map呢? 经常会混淆。 混淆1:例如有时候题目可能要求在一大堆元素里找目标元素,要求不能利用用过的字母,这就会让我想到只包含一个键值的set或者是map,但实际上忽略了字母(限定大…...
如何通过 Homebrew 安装 Qt 并配置环境变量
如何通过 Homebrew 安装 Qt 并配置环境变量 Qt 是一个跨平台的应用程序开发框架,广泛用于开发图形界面应用。本文将详细介绍如何在 macOS 上通过 Homebrew 安装 Qt 并配置环境变量,以便在终端和 Qt Creator 中使用 Qt 工具。 步骤 1:安装 Ho…...
RESTful 的特点与普通 Web API 的区别
RESTful 是一种设计风格,而不仅仅是普通的 Web API。它遵循一些特定的原则和约束,使得 API 更加简洁、可扩展和易于理解。以下是 RESTful 的特点,以及与普通 Web API 的区别: RESTful 的特点 1. 资源导向 RESTful API 的核心是资…...
Java和JavaScript当中的json对象和json字符串分别讲解
Java和JavaScript当中的json对象和json字符串分别讲解 一、Java当中的json对象和json字符串 在 Java 中,JSON 对象和 JSON 字符串有不同的表示和操作方式。 1. JSON 对象: 如果你使用的是 org.json 库,创建 JSON 对象的代码如下࿱…...
ARM64 Trust Firmware [四]
完成第二阶段 BL2 的操作后就加载并进入 BL31,BL31 位于 DRAM 中,EL3 模式。除了做架构初始化和平台初始化外,还做了如下工作: 基本硬件初始化,比如 GIC,串口,timer 等;PSCI 服务的…...
CHARMM-GUI EnzyDocker: 一个基于网络的用于酶中多个反应状态的蛋白质 - 配体对接的计算平台
❝ "CHARMM-GUI EnzyDocker for Protein−Ligand Docking of Multiple Reactive States along a Reaction Coordinate in Enzymes"介绍了 CHARMM-GUI EnzyDocker,这是一个基于网络的计算平台,旨在简化和加速 EnzyDock 对接模拟的设置过程&…...
Sklearn常用算法及建模流程总结
Scikit-learn(简称 Sklearn)是 Python 中最流行的机器学习库之一,提供了丰富的算法和工具用于数据预处理、模型训练、评估和调优。下面整理了一些常用算法及建模流程,供大家参考学习。 1.常用算法分类 1. 监督学习(S…...
华为IPD简介
创作灵感 现在“熟悉华为IPD”经常出现在高级招聘岗位能力要求上,于是作者写下此文章以此巩固相关知识储备 名词解释 华为IPD(Integrated Product Development,集成产品开发)是华为引入并优化的一套产品开发管理体系࿰…...
【ISO 14229-1:2023 UDS诊断(ECU复位0x11服务)测试用例CAPL代码全解析⑰】
ISO 14229-1:2023 UDS诊断【ECU复位0x11服务】_TestCase17 作者:车端域控测试工程师 更新日期:2025年02月19日 关键词:UDS诊断协议、ECU复位服务、0x11服务、ISO 14229-1:2023 TC11-017测试用例 用例ID测试场景验证要点参考条款预期结果TC…...
html网络安全工具源码 网络安全前端
🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 前端常见的网络安全包括:xss(跨站脚本攻击)、csrf(跨站请求伪造)、sql注入攻击等。 1)跨站…...
广西壮族自治区园区投促中心党委书记陶德文率团到访深兰科技
2月16日,广西壮族自治区园区投促中心党委书记、主任,自治区园区办党组成员陶德文率团来到深兰科技集团上海总部考察调研,并与深兰科技集团创始人、董事长陈海波等集团管理层座谈交流,双方围绕深兰科技人工智能项目落地广西的相关事…...
vue3创建项目
vue3创建项目 在 Vue 3 中创建项目通常涉及到使用 Vue CLI 或者 Vite。 Vue CLI 是官方推荐的脚手架工具,而 Vite 是近年来非常流行的现代前端开发工具,它提供了更快的热模块更新(HMR)和优化的开发服务器。 一、使用 Vue CLI 创…...
MySQL5.7 创建用户并授予超管权限脚本
记录MySQL5.7 创建新用户并授予超管权限脚本 用户与密码可任意设置 创建用户并设置密码 CREATE USER zhangsan % identified by 123456oo;修改用户密码 UPDATE USER set authentication_stringpassword("Abc123!") where user"zhangsan ";授予用户超管权…...
ESP32鼠标驱动(ble hid device_demo)【ESP32指向鼠标】
ESP32鼠标驱动(ble hid device_demo)【ESP32指向鼠标】 我使用的vscode开发esp32,用的是ESP-IDF v5.12固件,其提供了很多例程,在搜索里面输入“ESP-IDF: Show Examples Projects”,便可看到例程,如下图所示࿰…...
CSDN文章质量分查询系统【赠python爬虫、提分攻略】
CSDN文章质量分查询系统 https://www.csdn.net/qc 点击链接-----> CSDN文章质量分查询系统 <------点击链接 点击链接-----> https://www.csdn.net/qc <------点击链接 点击链接-----> CSDN文章质量分查询系统 <------点击链接 点击链…...