【八股战神篇】Java高频基础面试题
1 面向对象编程有哪些特性?
面向对象编程(Object-Oriented Programming,简称 OOP)是一种以对象为核心的编程范式,它通过模拟现实世界中的事物及其关系来组织代码。OOP 具有三大核心特性:封装、继承、多态。接下来我会逐一详细说明这些特性。
第一,封装
封装是指将数据(属性)和行为(方法)捆绑在一起,并对外隐藏对象的内部实现细节。通过访问修饰符(如 private、protected 和 public),我们可以控制哪些部分是对外可见的,哪些是内部私有的。这种机制提高了代码的安全性和可维护性。例如,在 Java 中,我们通常会将类的属性设置为 private,并通过 getter 和 setter 方法提供受控的访问方式。
第二,继承
继承允许一个类(子类)基于另一个类(父类)来构建,从而复用父类的属性和方法。通过继承,子类不仅可以拥有父类的功能,还可以扩展或重写父类的行为。Java 中使用 extends 关键字实现继承。例如,我们可以通过定义一个通用的 Animal 类,然后让 Dog 和 Cat 类继承它,这样就避免重复编写相同的代码。
第三,多态
多态是指同一个方法调用可以根据对象的实际类型表现出不同的行为。多态分为两种形式:编译时多态(方法重载)和运行时多态(方法重写)。运行时多态是通过动态绑定实现的,即程序在运行时决定调用哪个方法。例如,如果父类 Animal 有一个 eat() 方法,子类 Dog 和 Cat 可以分别重写这个方法,当调用 animal.eat() 时,具体执行的是 Dog 或 Cat 的实现。多态使得代码更加灵活和可扩展。
延伸
面向对象和面向过程的区别
(1)面向对象编程(OOP)
定义:面向对象编程是一种以对象为核心的编程范式,它将现实世界中的事物抽象为对象,并通过对象之间的交互来完成任务。OOP 的核心思想是“万物皆对象”。
特点:
以对象为中心,强调数据和行为的封装。
使用类(Class)作为模板来创建对象(Object)。
支持三大特性:封装、继承和多态。
优点:
模块化:代码结构清晰,易于维护和扩展。
复用性高:通过继承和组合可以复用已有代码。
灵活性强:支持多态,能够适应复杂需求的变化。
可读性强:贴近现实世界的思维方式,便于理解和协作。
缺点:
性能开销较大:由于引入了类、对象等概念,运行效率可能不如面向过程高效。
学习曲线较陡:需要理解类、对象、继承等概念,初学者可能觉得复杂。
(2)面向过程编程(POP)
定义:
面向过程编程是一种以过程(函数)为核心的编程范式,它将程序分解为一系列函数或步骤,按照顺序执行任务。
特点:
以函数为中心,强调逻辑流程。
数据和函数分离,通常通过参数传递数据。
程序由一个个独立的函数组成,函数之间通过调用关系协作。
优点:
简单直接:逻辑清晰,适合小型项目或简单任务。
性能较高:没有额外的对象开销,运行效率更高。
易于实现:不需要复杂的类设计,开发速度快。
缺点:
扩展性差:随着项目规模增大,代码容易变得混乱,难以维护。
复用性低:函数之间的耦合度高,难以复用代码。
不适合复杂系统:面对复杂业务逻辑时,代码会显得冗长且难以管理。
(3)举例
- 面向过程:实现一个简单计算器,用函数依次处理加减乘除。
-
public class Calculator {public static int add(int a, int b) {return a + b;}public static int subtract(int a, int b) {return a - b;}public static void main(String[] args) {System.out.println(add(3, 5)); // 输出 8} }
- 面向对象:为计算器定义一个类,通过实例化对象调用方法。
-
public class Calculator {private int result;public void add(int a) {result += a;}public int getResult() {return result;}public static void main(String[] args) {Calculator calc = new Calculator();calc.add(5);System.out.println(calc.getResult()); // 输出 5} }
2 接口、普通类和抽象类的区别和共同点
在 Java 中,接口、普通类和抽象类是构建面向对象程序的三种重要结构。我会从定义、方法实现、继承关系以及成员变量这4个方面详细讲解它们的区别,然后再总结它们的共同点。
第一个是定义上的区别
普通类是一个完整的、具体的类,可以直接实例化为对象。它包含属性和方法,并且可以有构造方法。
抽象类是一个不能直接实例化的类,通常用来作为其他类的基类。它可以包含抽象方法(没有实现的方法)和具体方法(有实现的方法)。
接口是一种完全抽象的结构,用于定义行为规范。它只包含抽象方法(Java 8 之后可以包含默认方法和静态方法)。
第二个是方法实现上的区别
普通类的所有方法都可以有具体实现(即方法体)。
抽象类可以包含具体方法和抽象方法。
接口默认只包含抽象方法(Java 8 后可以包含默认方法和静态方法)。
第三是继承关系上的区别
普通类支持单继承(一个类只能继承一个父类)。
抽象类也支持单继承(一个类只能继承一个抽象类)。
接口支持多实现(一个类可以实现多个接口)。
第四是成员变量上的区别
普通类和抽象类都可以有各种类型的成员变量(实例变量、静态变量等)。
接口只能有常量(public static final)。
最后是共同点,一共有3点
首先,它们都是面向对象编程的基础结构,都可以用来组织代码,实现封装、继承和多态等特性。
其次,它们都可以包含方法,尽管接口中的方法默认是抽象的。
最后,它们都可以被继承或实现,普通类可以通过继承扩展功能,抽象类和接口则需要子类继承或实现后才能使用。
3 深拷贝和浅拷贝区别
深拷贝和浅拷贝的核心区别在于是否递归地复制对象内部的引用类型数据,接下来,我会从定义、实现方式以及使用场景三个方面详细讲解它们的区别。
首先是定义上的区别,
浅拷贝是指创建一个新对象,但新对象中的引用类型字段仍然指向原对象中引用类型的内存地址。换句话说,浅拷贝只复制了对象本身,而没有复制对象内部的引用类型数据。修改新对象中的引用类型数据会影响原对象。
深拷贝是指创建一个新对象,并且递归地复制对象内部的所有引用类型数据。换句话说,深拷贝不仅复制了对象本身,还复制了对象内部的所有引用类型数据。修改新对象中的引用类型数据不会影响原对象。
其次是实现方式上的区别,
浅拷贝可以使用 Object 类的 clone() 方法,也可以使用实现 Cloneable 接口并重写 clone() 的方法。
深拷贝可以手动对引用类型字段进行递归拷贝,也可以使用序列化(Serialization)的方式将对象序列化为字节流,再反序列化为新对象。
最后是使用场景上的区别,
浅拷贝适用于当对象内部的引用类型数据不需要独立复制的情况。
深拷贝适用于当对象内部的引用类型数据需要完全独立的情况。
延伸
1,浅拷贝使用方法
public class Resume implements Cloneable {public Object clone() {try {return (Resume) super.clone();} catch (Exception e) {e.printStackTrace();return null;}}
}
2,深拷贝使用方法
class Student implements Cloneable {String name;int age;Professor p;Student(String name, int age, Professor p) {this.name = name;this.age = age;this.p = p;}public Object clone() {Student o = null;try {o = (Student) super.clone();} catch (CloneNotSupportedException e) {System.out.println(e.toString());}o.p = (Professor) p.clone();return o;}
}
4 int和Integer的区别
Integer 和 int 的区别如下:
类型
int 是基本数据类型,存储的是数值。
Integer 是 int 的包装类,是一个对象,存储的是 int 值的引用。
内存分配
int 存储在栈中,效率高,直接存储数值。
Integer 是对象,存储在堆中,效率相对较低。
用途
int 用于基本的数值运算。
Integer 提供了更多功能,比如可以与集合类(List、Map 等)一起使用,因为集合类只能存储对象。
延伸
1 自动装箱和拆箱
从 Java 5 开始,Java 提供了自动装箱和拆箱功能,Java 自动支持基本类型与其包装类之间的转换(自动装箱和拆箱)。
装箱:int 转换为 Integer。
拆箱:Integer 转换为 int。
自动装箱是指将基本数据类型(如 int、double、boolean 等)自动转换为对应的包装类对象(如 Integer、Double、Boolean 等)。这个过程由编译器自动完成,无需手动调用包装类的构造方法或静态方法。
当存储一个基本数据类型到需要用到对象的场景中(例如集合),Java 编译器会检测到基本数据类型需要被转换为包装类对象,编译器会自动调用包装类的 valueOf() 方法来创建对应的包装类对象,生成的对象会被存储到目标位置。
自动拆箱是指将包装类对象(如 Integer、Double、Boolean 等)自动转换为对应的基本数据类型(如 int、double、boolean 等)。同样,这个过程也是由编译器自动完成的。
当你从一个需要对象的场景中取出值并赋给基本数据类型时,Java 编译器会检测到目标变量是一个基本数据类型。编译器会自动调用包装类的 xxxValue() 方法,比如 intValue()、doubleValue() 等,来获取基本数据类型的值。返回的基本数据类型值会被赋给目标变量。
2 内存分配
int:
存储在栈内存中,直接保存值,效率高。
Integer:
是一个对象,存储在堆内存中,包含元数据(如值和方法),占用更多内存。
3 Integer 缓存机制
Java 对于 -128 到 127 之间的 Integer 对象进行了缓存。
当值在该范围内时,会直接返回缓存中的对象。
如果值超出范围,会创建新的对象。
public class Main {
public static void main(String[] args) {
Integer a = 100;
Integer b = 100;
Integer c = 200;
Integer d = 200;
System.out.println(a b); // true,使用缓存
System.out.println(c d); // false,超出缓存范围
}
}
输出结果:true
false
4 与集合的结合使用
int 不能直接存储在集合中,必须使用 Integer。
5 重载和重写的区别
重载(Overloading)和重写(Overriding)是 Java 中两个非常重要的概念,用于实现多态。它们的区别如下:
- 定义:
- 重载:同一个类中方法名称相同,但参数列表(参数个数或类型)不同。
- 重写:子类对父类方法进行重新定义,方法名、参数列表都相同。
- 作用域:
- 重载:只发生在同一个类中。
- 重写:发生在子类和父类之间。
- 方法签名:
- 重载:方法名相同,参数列表不同。
- 重写:方法名、参数列表相同。
- 返回值:
- 重载:返回值可以相同或不同。
- 重写:返回值必须与父类方法兼容(从 Java 5 开始可以是协变返回类型)。
- 访问修饰符:
- 重载:不受访问修饰符限制。
- 重写:子类方法的访问修饰符不能比父类方法的访问修饰符更严格。
- 关键字:
- 重写:需要用到
@Override
注解。 - 重载:无需特殊注解。
- 重写:需要用到
延伸
1.什么是重载?
重载是指在同一个类中,允许存在多个同名方法,但这些方法的参数列表必须不同。重载的核心在于方法签名的不同,而返回值类型不影响重载。
当定义一个重载方法时,
首先,方法名必须相同。
其次,参数列表必须不同,包括参数的数量、类型或顺序。
然后,返回值类型可以相同也可以不同,但它不影响重载的判断。
最后,访问修饰符(如 public
、private
等)和异常声明也不影响重载。
2.什么是重写?
重写是指子类对父类中已有的方法进行重新定义,以提供特定的实现。重写的核心在于**继承关系**,并且要求方法签名完全一致。
当定义一个重写方法时,
首先,方法名必须与父类中的方法名相同。
其次,参数列表必须与父类中的方法完全一致。
然后,返回值类型必须相同或是父类返回值类型的子类型(协变返回类型)。
最后,访问修饰符不能比父类更严格(例如,父类方法是 protected,子类方法可以是 protected 或 public,但不能是 private)。
3.重载的细节
重载是方法的编译时多态,即方法的调用在编译期由参数列表决定。以下是一个示例:
public class OverloadingExample {public int add(int a, int b) {return a + b;}public double add(double a, double b) {return a + b;}public String add(String a, String b) {return a + b;}
}这里 add 方法重载了三次,分别接收不同类型的参数。
在编译时,编译器会根据传入的参数类型选择对应的方法。
4.重写的细节
重写是方法的运行时多态,由子类在运行期决定具体调用哪个方法。以下是一个示例:
class Parent {public void display() {System.out.println("Parent display method");}
}class Child extends Parent {@Overridepublic void display() {System.out.println("Child display method");}
}
public class OverridingExample {public static void main(String[] args) {Parent obj = new Child();obj.display(); // 输出:Child display method}
}
这里 Child 类重写了 Parent 类的 display 方法。
在运行时,即使引用类型是 Parent,实际调用的是子类的 display 方法。
6 ==和 equals 的区别
==
比较的是 两个变量的内存地址,即是否引用了同一个对象。如果是基本数据类型,==
比较的是它们的值。equals()
是 对象的比较方法,默认实现(在Object
类中)是比较内存地址,和==
类似。但是,大多数类(例如String
、Integer
等)会重写equals()
方法,用于比较内容(值)是否相同。
示例代码:
public class Main {public static void main(String[] args) {String str1 = new String("hello");String str2 = new String("hello");String str3 = "hello";String str4 = "hello";// == 比较System.out.println(str1 == str2); // false,两个对象的内存地址不同System.out.println(str3 == str4); // true,字符串常量池优化// equals 比较System.out.println(str1.equals(str2)); // true,内容相同System.out.println(str3.equals(str4)); // true,内容相同}
}
延伸
1.为什么需要重写 equals()
方法?
- 默认的equals()方法比较的是对象地址,而在许多场景下,我们需要比较对象的内容是否相等。例如:比较两个
Person
对象的name
和age
是否相等。 - 当你重写
equals()
方法时,一般还需要重写hashCode()
方法,保证逻辑一致。
2.hashCode()
和 equals()
的关系
- 如果两个对象通过
equals()
方法相等,它们的hashCode()
必须相等。 - 如果两个对象的
hashCode()
相等,它们未必通过equals()
方法相等。 - 这条规则对于集合(如
HashMap
和HashSet
)非常重要。
示例:hashCode()
与 equals()
的一致性
class Person {private String name;public Person(String name) {this.name = name;}@Overridepublic boolean equals(Object obj) {if (this == obj) return true;if (obj == null || getClass() != obj.getClass()) return false;Person person = (Person) obj;return name.equals(person.name);}@Overridepublic int hashCode() {return name.hashCode();}
}
3.hashCode() 的作用
hashCode() 是 Java 中 Object 类的一个方法,用于返回对象的哈希码(Hash Code),它是一个整数值。这个哈希码的主要作用是确定对象在基于哈希表的数据结构中的存储位置。
(1) 哈希码的核心作用:定位对象
快速定位:
在基于哈希表的数据结构(如 HashMap、HashSet 和 Hashtable)中,hashCode() 被用来计算对象的存储位置。
哈希表通过将对象的哈希值映射到特定的“桶”(Bucket)中,从而实现高效的插入、查找和删除操作。
这种机制使得哈希表的时间复杂度通常为 O(1),即常数时间复杂度,极大提升了性能。
7 什么是泛型?有什么作用?
泛型(Generics) 是 Java 中的一种语言特性,允许我们在类、接口和方法中使用参数化类型。它提供了一种在编译时检测类型安全的机制,从而减少运行时的类型转换错误。泛型的主要目的是使代码更加类型安全、可读性强、通用性高。
泛型的作用主要有4点
第一点是提高代码的复用性,它允许我们编写与类型无关的通用代码。
第二点是增强类型安全性,在没有泛型的情况下,集合类(如 ArrayList)默认存储的是 Object 类型,取出元素时需要手动进行类型转换,容易引发 ClassCastException。而泛型在编译时就会进行类型检查,避免了运行时的类型错误。
第三点是简化代码,使用泛型后,我们无需显式地进行类型转换,减少了冗余代码,提高了代码的可读性和维护性。
第四点是支持复杂的类型约束,泛型可以通过通配符(如 ? extends T 和 ? super T)实现更复杂的类型限制,满足特定场景下的需求。
延伸
1.泛型的语法与使用
泛型类 泛型可以用于定义类,使类可以处理多种数据类型。
例子:
public class Box<T> {private T value;public T getValue() {return value;}public void setValue(T value) {this.value = value;}
}public class Example {public static void main(String[] args) {Box<String> stringBox = new Box<>();stringBox.setValue("Hello");System.out.println(stringBox.getValue()); // 输出:HelloBox<Integer> intBox = new Box<>();intBox.setValue(123);System.out.println(intBox.getValue()); // 输出:123}
}
T 是一个类型参数,表示该类可以接受任意类型。
使用时,通过指定具体类型(如String、Integer)实现类型安全。
泛型方法 泛型也可以用于方法,使方法可以接受不同类型的参数。
例子:
public class Example {// 泛型方法public static <T> void printArray(T[] array) {for (T element : array) {System.out.println(element);}}public static void main(String[] args) {Integer[] intArray = {1, 2, 3};String[] strArray = {"A", "B", "C"};printArray(intArray); // 输出:1 2 3printArray(strArray); // 输出:A B C}
}方法前面的<T>表示这是一个泛型方法,T是类型参数。
方法可以接受任意类型的数组作为参数。
泛型接口 泛型可以用于接口,使接口适配不同的实现类型。
例子:
public interface Pair<K, V> {K getKey();V getValue();
}public class KeyValue<K, V> implements Pair<K, V> {private K key;private V value;public KeyValue(K key, V value) {this.key = key;this.value = value;}public K getKey() {return key;}public V getValue() {return value;}
}public class Example {public static void main(String[] args) {Pair<String, Integer> pair = new KeyValue<>("Age", 25);System.out.println("Key: " + pair.getKey()); // 输出:Key: AgeSystem.out.println("Value: " + pair.getValue()); // 输出:Value: 25}
}
泛型接口允许在实现时指定不同的类型参数。
通配符:泛型可以使用通配符(?
)来表示未知类型
-
通配符的使用:
? extends T
:表示类型是T
或T
的子类(用于读取)。? super T
:表示类型是T
或T
的父类(用于写入)。-
?
:表示任意类型。例子:
import java.util.ArrayList; import java.util.List;public class Example {public static void printNumbers(List<? extends Number> list) {for (Number number : list) {System.out.println(number);}}public static void main(String[] args) {List<Integer> intList = new ArrayList<>();intList.add(1);intList.add(2);List<Double> doubleList = new ArrayList<>();doubleList.add(1.1);doubleList.add(2.2);printNumbers(intList); // 输出:1 2printNumbers(doubleList); // 输出:1.1 2.2} }? extends Number 表示列表中的元素必须是Number或其子类,保证类型安全。
2.泛型的限制
- Java 的泛型是通过类型擦除(Type Erasure)实现的,泛型信息只存在于编译阶段,运行时被擦除为
Object
。 - 例如,
List<Integer>
和List<String>
在运行时实际上是相同的类型。例子:
List<String> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
System.out.println(list1.getClass() == list2.getClass()); // 输出:true
3.泛型不能使用基本数据类型
- 泛型不支持基本数据类型(如
int
、double
等),只能使用包装类(如Integer
、Double
等)。 - 解决方案:自动装箱和拆箱。
4.泛型数组的创建
不能直接创建泛型数组,如T[]
,因为类型信息在运行时被擦除。
8 什么是反射?应用?
反射是一种在运行时动态获取类信息的能力。通过反射,我们可以在程序运行时加载类、获取类的结构(如字段、方法、构造器等),甚至可以调用类的方法或修改字段的值。
反射主要应用在这5个场景
第一个是框架开发,很多 Java 框架都有使用反射,比如如 Spring、Hibernate 等。
第二个是动态代理,动态代理是反射的一个重要应用,常用于 AOP(面向切面编程)。通过反射,我们可以在运行时动态生成代理类,拦截方法调用并添加额外逻辑。
第三个是注解处理,注解本身不会对程序产生任何影响,但通过反射,我们可以在运行时读取注解信息并执行相应的逻辑。
第四个是插件化开发,在某些场景下,我们需要动态加载外部的类或模块。反射可以帮助我们在运行时加载这些类并调用其方法,从而实现插件化开发。
第五个是测试工具,单元测试框架(如 JUnit)利用反射来发现和运行测试方法,而无需手动指定每个测试用例。
延伸
1.为什么引入反射
在传统的 Java 编程中,所有的类和方法调用必须在编译时确定。 这种模式虽然安全且高效,但在某些场景下显得不够灵活。而Java 引入反射是为了在运行时动态获取类的信息并操作类或对象,包括获取类的结构、创建对象、调用方法、访问 / 修改字段等,从而增强程序的灵活性和可扩展性。
2.反射的优缺点
优点:
灵活性强:允许程序动态操作未知类,非常适合框架开发或插件化设计。
动态性:反射支持运行时动态加载类和调用方法,避免了硬编码。
代码复用性高:通过反射,可以写出通用代码,减少重复。
缺点:
性能开销大:反射的调用比直接调用慢得多,因为需要进行许多运行时检查和处理。
安全风险:反射能绕过 Java 的访问控制机制,如访问私有字段或方法,可能导致安全问题。
代码可读性差:反射的代码往往复杂且难以维护,尤其对于大型项目而言。
编译时安全性降低:使用反射时,编译器无法验证被调用的方法或字段是否存在。
9 StringBuffer 的特点
StringBuffer 是一个可变的字符序列,与 String 不同,StringBuffer 的内容是可以被修改的。它的核心特点是线程安全和高效的字符串操作。
StringBuffer有四个特点:
第一个是它具有可变性,我们可以在原有对象上直接修改字符串内容,而无需创建新的对象。
第二个它是线程安全的,StringBuffer 的所有方法都通过 synchronized 关键字修饰,因此它是线程安全的。 在多线程环境下,多个线程可以同时操作同一个 StringBuffer 对象,而不会引发数据竞争或不一致问题。
第三个是性能相对较好,StringBuffer 内部使用一个可扩容的字符数组来存储数据,当容量不足时会自动扩展。相比于 String 的不可变性(每次修改都会生成新对象),StringBuffer 在频繁修改字符串时性能更高。而相比于非线程安全的 StringBuilder ,性能略低。
第四个是包含丰富的 API,比如:append():追加内容到字符串末尾。 insert():在指定位置插入内容。delete():删除指定范围的内容。 reverse():反转字符串内容。 toString():将 StringBuffer 转换为 String。
延伸
1.String、StringBuffer、StringBuilder 的区别?
String
- 不可变:
String
是不可变类,每次对字符串的修改都会生成新的字符串对象。 - 线程安全:因为不可变,所以天然线程安全。
- 性能:由于每次修改都会创建新对象,频繁操作时效率较低。
- 不可变:
StringBuilder
- 可变:
StringBuilder
是可变类,对字符串的操作会直接在原对象上修改。 - 线程不安全:不适用于多线程场景。
- 性能:在单线程环境中,操作效率比
String
和StringBuffer
高。
- 可变:
StringBuffer
- 可变:和
StringBuilder
类似,也是可变类。 - 线程安全:通过同步方法实现线程安全,适用于多线程场景。
- 性能:由于线程安全机制的开销,操作效率比
StringBuilder
略低。
- 可变:和
适用场景:
- 如果字符串内容 不会改变,用
String
。 - 如果字符串内容会频繁修改,且在 单线程 环境下使用,选
StringBuilder
。 - 如果字符串内容会频繁修改,且在 多线程 环境下使用,选
StringBuffer
。
相关文章:
【八股战神篇】Java高频基础面试题
1 面向对象编程有哪些特性? 面向对象编程(Object-Oriented Programming,简称 OOP)是一种以对象为核心的编程范式,它通过模拟现实世界中的事物及其关系来组织代码。OOP 具有三大核心特性:封装、继承、多态。…...
matlab建立整车模型,求汽车的平顺性
在MATLAB中建立整车模型评估汽车平顺性,通常采用多自由度振动模型。以下是基于四分之一车模型的详细步骤和代码示例,可扩展至整车模型。 1. 四分之一车模型(简化版) 模型描述 自由度:2个(车身垂直位移 z2…...
在Linux服务器上部署Jupyter Notebook并实现ssh无密码远程访问
Jupyter notebook版本7.4.2(这个版本AI提示我Jupyter7(底层是 jupyter_server 2.x) 服务器开启服务 安装Jupyter notebook 7.4.2成功后,终端输入 jupyter notebook --generate-config 这将在 ~/.jupyter/ 目录下生成 jupyter_…...
C#数组与集合
🧠 一、数组(Array) 1. 定义和初始化数组 // 定义并初始化数组 int[] numbers new int[5]; // 默认值为 0// 声明并赋值 string[] names { "Tom", "Jerry", "Bob" };// 使用 new 初始化 double[] scores …...
服务器内部可以访问外部网络,docker内部无法访问外部网络,只能docker内部访问
要通过 iptables 将容器中的特定端口请求转发到特定服务器,你需要设置 DNAT(目标地址转换)规则。以下是详细步骤: 假设场景 容器端口: 8080(容器内服务监听的端口)目标服务器: 192.168.1.100(请…...
mathematics-2024《Graph Convolutional Network for Image Restoration: A Survey》
推荐深蓝学院的《深度神经网络加速:cuDNN 与 TensorRT》,课程面向就业,细致讲解CUDA运算的理论支撑与实践,学完可以系统化掌握CUDA基础编程知识以及TensorRT实战,并且能够利用GPU开发高性能、高并发的软件系统…...
ssti刷刷刷
[NewStarCTF 公开赛赛道]BabySSTI_One 测试发现过滤关键字,但是特殊符号中括号、双引号、点都能用 可以考虑拼接或者编码,这里使用拼接 ?name{{()["__cla"~"ss__"]}}?name{{()["__cla"~"ss__"]["__ba&…...
Zephyr OS Nordic芯片的Flash 操作
目录 概述 1. 软硬件环境 1.1 软件开发环境 1.2 硬件环境 2 Flash操作库函数 2.1 nRF52832的Flash 2.2 Nordic 特有的 Flash 操作 2.2.1 nrfx_nvmc_bytes_write 函数 2.2.2 nrfx_nvmc_page_erase函数 2.2.3 nrfx_nvmc_write_done_check 函数 3 操作Flash的接口函数…...
傅里叶变换实战:图像去噪与边缘提取
傅里叶变换在图像处理中的应用与实践详解(超详细教程实战代码) 🚀 本文从零开始详解傅里叶变换在图像处理中的应用,手把手教你实现图像去噪与边缘提取!全文配套Python代码,新手也能轻松上手! 一…...
go-中间件的使用
中间件介绍 Gin框架允许开发者在处理请求的过程中加入用户自己的钩子(Hook)函数这个钩子函数就是中间件,中间件适合处理一些公共的业务逻辑比如登录认证,权限校验,数据分页,记录日志,耗时统计 1.定义全局中间件 pac…...
昇腾NPU环境搭建
如果进入服务器输入npu-smi info可以看到npu情况,请直接跳转第三步 STEP1: 服务器安装依赖 sudo yum install -y gcc gcc-c make cmake unzip zlib-devel libffi-devel openssl-devel pciutils net-tools sqlite-devel lapack-devel gcc-gfortran python3-develyu…...
【HTML5学习笔记2】html标签(下)
1表格标签 1.1表格作用 显示数据 1.2基本语法 <table><tr> 一行<td>单元格1</td></tr> </table> 1.3表头单元格标签 表头单元格会加粗并且居中 <table><tr> 一行<th>单元格1</th></tr> </table&g…...
开源轻量级地图解决方案leaflet
Leaflet 地图:开源轻量级地图解决方案 Leaflet 是一个开源的 JavaScript 库,用于在网页中嵌入交互式地图。它以轻量级、灵活性和易用性著称,适用于需要快速集成地图功能的项目。以下是关于 Leaflet 的详细介绍和使用指南。 1. Leaflet 的核心…...
LLM学习笔记(六)线性代数
公式速查表 1. 向量与矩阵:表示、转换与知识存储的基础 向量表示 (Vectors): 语义的载体 在LLM中,向量 x ∈ R d \mathbf{x}\in\mathbb{R}^d x∈Rd 是信息的基本单元,承载着丰富的语义信息: 词嵌入向量 (Word Embeddings)&am…...
Vue 3.0双向数据绑定实现原理
Vue3 的数据双向绑定是通过响应式系统来实现的。相比于 Vue2,Vue3 在响应式系统上做了很多改进,主要使用了 Proxy 对象来替代原来的 Object.defineProperty。本文将介绍 Vue3 数据双向绑定的主要特点和实现方式。 1. 响应式系统 1.1. Proxy对象 Vue3 …...
Quasar组件 Carousel走马灯
通过对比两个q-carousel组件来,了解该组件的属性 官方文档请参阅:Carousel 预览 源代码 <template><div class"q-pa-md"><div class"q-gutter-md"><q-carouselv-model"slide"transition-prev&quo…...
Vue 2.0学习
个人简介 👨💻个人主页: 魔术师 📖学习方向: 主攻前端方向,正逐渐往全栈发展 🚴个人状态: 研发工程师,现效力于政务服务网事业 🇨🇳人生格言&…...
LangFlow技术深度解析:可视化编排LangChain应用的新范式 -(3)组件系统
Component System | langflow-ai/langflow | DeepWiki 组件系统 相关源文件 组件系统是核心基础设施,使 Langflow 能够在工作流中创建、配置和连接模块化构建块。该系统通过为组件提供一致的接口来定义其输入、输出、执行行为以及与其他组件的连接,从…...
【Win32 API】 lstrcmpA()
作用 比较两个字符字符串(比较区分大小写)。 lstrcmp 函数通过从第一个字符开始检查,若相等,则检查下一个,直到找到不相等或到达字符串的末尾。 函数 int lstrcmpA(LPCSTR lpString1, LPCSTR lpString2); 参数 lpStr…...
LabVIEW光谱检测系统
腔衰荡光谱技术(CRDS)凭借高精度和高灵敏度特性,成为微量气体浓度检测的常用方法,而准确获取衰荡时间是该技术应用的关键。基于LabVIEW平台设计腔衰荡信号在线处理系统,实现对衰荡信号的实时采集、平均、拟合、显示和保…...
深入解读WPDRRC信息安全模型:构建中国特色的信息安全防护体系
目录 前言1 WPDRRC模型概述2 模型结构详解2.1 预警(Warning)2.2 保护(Protect)2.3 检测(Detect)2.4 响应(React)2.5 恢复(Restore)2.6 反击(Count…...
uniapp-商城-59-后台 新增商品(属性的选中,进行过滤展示,filter,some,every和map)
前面讲了属性的添加,添加完成后,数据库中已经存在数据了,这时再继续商品的添加时,就可以进行属性的选择了。 在商品添加过程中,属性选择是一个关键步骤。首先,界面需要展示嵌套的属性数据,用户通…...
RDIFramework.NET Web敏捷开发框架 V6.2发布(.NET6+、Framework双引擎)
1、框架介绍 .NET6、Framework双引擎、全网唯一 RDIFramework.NET敏捷开发框架,是我司重磅推出的支持.NET6和.NET Framework双引擎的快速信息化系统开发、整合框架,为企业快速构建企业级的应用提供了强大支持。 依托框架强大的基座,开发人员只…...
JMeter 教程:编写 GET 请求脚本访问百度首页
目录 练习要求: 练习步骤: 效果图: 练习要求: 练习步骤: 效果图:...
JSP 实现二级联动下拉菜单:一次加载,前端动态更新
在Web开发中,二级联动下拉菜单(或多级联动)是一种非常常见的用户交互形式,例如选择省份后动态加载对应的城市列表。本文将详细介绍一种在JSP中实现二级联动的方法:后端一次性将所有联动数据加载到前端,然后通过JavaScript在客户端动态更新二级下拉菜单。这种方法对于数据…...
Room数据库
Room数据库 Room是Android Jetpack组件中的一款SQLite数据库抽象层框架,旨在简化本地数据库操作,提供编译时SQL校验、类型与安全、与LiveData/Flow无缝集成等特性。 1. 什么是Room 定义: Room 是 Android Jetpack 提供的一个 ORMÿ…...
文件上传Ⅲ
#文件-解析方案-执行权限&解码还原 1、执行权限 文件上传后存储目录不给执行权限(即它并不限制你上传文件的类型,但不会让相应存有后门代码的PHP文件执行,但是PNG图片是可以访问的) 2、解码还原 数据做存储,解…...
前端取经路——量子UI:响应式交互新范式
嘿,老铁们好啊!我是老十三,一枚普通的前端切图仔(不,开玩笑的,我是正经开发)。最近前端技术简直跟坐火箭一样,飞速发展!今天我就跟大家唠唠从状态管理到实时渲染…...
15 C 语言字符类型详解:转义字符、格式化输出、字符类型本质、ASCII 码编程实战、最值宏汇总
1 字符类型概述 在 C 语言中,字符类型 char 用于表示单个字符,例如一个数字、一个字母或一个符号。 char 类型的字面量是用单引号括起来的单个字符,例如 A、5 或 #。 当需要表示多个字符组成的序列时,就涉及到了字符串。在 C 语言…...
AlphaEvolve:LLM驱动的算法进化革命与科学发现新范式
AlphaEvolve:LLM驱动的算法进化革命与科学发现新范式 本文聚焦Google DeepMind最新发布的AlphaEvolve,探讨其如何通过LLM与进化算法的结合,在数学难题突破、计算基础设施优化等领域实现革命性进展。从48次乘法优化44矩阵相乘到数据中心资源利…...
比较文本搜索策略 pgsearch、tsvector 和外部引擎
大家好,这里是架构资源栈!点击上方关注,添加“星标”,一起学习大厂前沿架构! 在应用程序中实现搜索功能时,您需要选择合适的文本搜索方法。本指南比较了 PostgreSQL 的内置搜索引擎tsvector、pg_search扩展…...
58. 区间和
题目链接: 58. 区间和 题目描述: 给定一个整数数组 Array,请计算该数组在每个指定区间内元素的总和。 输入描述 第一行输入为整数数组 Array 的长度 n,接下来 n 行,每行一个整数,表示数组的元素。随后…...
MySQL中表的增删改查(CRUD)
一.在表中增加数据(Create) INSERT [INTO] TB_NAME [(COLUMN1,COLUMN2,...)] VALUES (value_list1),(value_list2),...;into可以省略可仅选择部分列选择插入,column即选择的列, 如图例可以选择仅在valuelist中插入age和id如果不指…...
SQL练习(6/81)
目录 1.寻找连续值 方法一:使用自连接(Self-Join) 方法二:使用窗口函数(Window Functions) 2.寻找有重复的值 GROUP BY子句 HAVING子句 常用聚合函数: 3.找不存在某属性的值 not in no…...
Android 中 打开文件选择器(ACTION_OPEN_DOCUMENT )
在 Android 中,打开文件选择器(File Picker)通常是指启动一个系统提供的界面,让用户可以选择存储在设备上的文件。可以通过发送一个带有 Intent.ACTION_OPEN_DOCUMENT 或 Intent.ACTION_GET_CONTENT 的 Intent 来实现。 1、启动文…...
AWS中国区CloudFront证书管理和应用指南
在AWS中国区使用CloudFront时,SSL/TLS证书的管理和应用是一个重要的环节。本文将详细介绍如何在AWS中国区上传、管理和应用SSL证书到CloudFront分配。 1. 准备证书文件 首先,我们需要准备好SSL证书相关的文件。通常,这包括: 私钥文件(.key)公钥证书文件(.crt)证书链文…...
Python之三大基本库——Matplotlib
好久没来总结了,今天刚好有时间,我们来继续总结一下python中的matplotlib 一、什么是Matplotlib Matplotlib是一个Python的2D绘图库,主要用于将数据绘制成各种图表,如折线图、柱状图、散点图、直方图、饼图等。它以各种硬拷贝…...
随笔:hhhhh
第一题 ∫ − ∞ ∞ x e x − e x d x ∫ 0 ∞ ln t ⋅ e ln t − t ⋅ 1 t d t ∫ 0 ∞ ln t ⋅ e − t ⋅ 1 t ⋅ t d t ∫ 0 ∞ ln t ⋅ e − t d t ψ ( 1 ) − γ \begin{align*} \int_{-\infty}^{\infty}xe^{x-e^x}\text{d}x&\int_{0}^{\infty}…...
计算机网络-----6分层结构
目录 “分层” 的设计思想: 计算机网络要完成的功能: 计算机网络的分层结构: 网络体系结构的概念: 各层之间的关系: 数据的传输过程 水平视角: 垂直视角: 相关概念 协议三要素&#x…...
初识SOC:RK3588
目录 一、高性能计算与边缘计算 二、多媒体处理与显示 三、图形与游戏开发 四、物联网与嵌入式系统 五、操作系统兼容性 RK3588作为瑞芯微推出的高性能处理器,凭借其多核架构、高算力NPU和多媒体处理能力,可广泛应用于以下领域: 一、高…...
卡顿检测与 Choreographer 原理
一、卡顿检测的原理 卡顿的本质是主线程(UI 线程)未能及时完成某帧的渲染任务(超过 16.6ms,以 60Hz 屏幕为例),导致丢帧(Frame Drop)。检测卡顿的核心思路是监控主线程任务的执行时…...
第十天——贪心算法——深度总结
文章目录 贪心算法深度解析:原理与应用 1. 贪心算法的基本原理 1.1 贪心选择性质 1.2 最优子结构 1.3 贪心算法与动态规划的对比 2. 贪心算法的应用场景 3. 具体应用案例 3.1 分配饼干 (Assign Cookies) 3.2 分糖果 (Candy Distribution) 3.3 种花问题 (C…...
python自学笔记2 数据类型
字符串操作 f字符串: for index, char in enumerate(greeting_str):print(f"字符:{char}, 索引:{index}")f字符串可以方便的在字符串中插入变量 字符串切片 指定步长: print(greeting_str[::2])指定步长为2的取字符…...
nacos配置文件快速部署另一种方法
提交nacos配置的另一种一种方法,批命令/shell: 以下脚本直接把当前目录下的所有yaml文件一键提交到nacos上 前提是要先安装curl 以及 jq 然后 把下面的shell保存为 import-all.sh 然后 chmod x import-all.sh && ./import-all.sh 就好了. 记得修改一下的NAMESPACE_…...
RTK哪个品牌好?2025年RTK主流品牌深度解析
在测绘领域,RTK 技术的发展日新月异,选择一款性能卓越、稳定可靠的 RTK 设备至关重要。2025 年,市场上涌现出众多优秀品牌,本文将深入解析几大主流品牌的核心竞争力。 华测导航(CHCNAV):技术创…...
游戏引擎学习第285天:“Traversables 的事务性占用”
回顾并为当天的工作做准备 我们有一个关于玩家移动的概念,玩家可以在点之间移动,而且当这些点移动时,玩家会随之移动。现在这个部分基本上已经在工作了。我们本来想实现的一个功能是:当玩家移动到某个点时,这个点能“…...
HNUST湖南科技大学-安卓Android期中复习
使用说明:除了选择判断就看习题外,推荐重点复习三四章多复习案例,这里应该是编程空题,把界面控件、活动单元熟悉一下。第五章(数据存储方式,尤其是文件存储)、第六章(重点内容提供者…...
一种应用非常广泛的开源RTOS(实时操作系统):nuttx
什么是NuttX? NuttX(读音接近“纳特-艾克斯”)是一种应用非常广泛的开源RTOS(实时操作系统),由Gregory Nutt博士主要推动开发。RTOS,即 Real-Time Operating System,直译为“实时操…...
WebSocket 客户端 DLL 模块设计说明(基于 WebSocket++ + Boost.Asio)
WebSocket 客户端 DLL 模块设计说明(基于 WebSocket Boost.Asio) 📌 目录 一、模块总览二、导出接口说明(EXPORTS)三、状态变量功能解读四、连接启动流程详解五、事件回调说明六、消息发送流程七、心跳与断连 JSON …...
微信小程序:封装request请求、解决请求路径问题
一、创建文件 1、创建请求文件 创建工具类文件request.js,目的是用于发送请求 二、js接口封装 1、写入接口路径 创建一个变量BASE_URL专门存储api请求地址 2、获取全局的token变量 从缓存中取出token的数据 3、执行请求 (1)方法中接收传递的参数 function request(url,…...