完整版Java类型

1. 基本数据类型(Primitive Types)

Java 有 8 种基本数据类型,这些类型直接存储值,占用固定内存,效率较高。它们不属于类,没有方法或属性。

基本数据类型关键字大小取值范围
整数类型byte8 位-128 到 127
整数类型short16 位-32,768 到 32,767
整数类型int32 位-2^31 到 2^31-1
整数类型long64 位-2^63 到 2^63-1
浮点类型float32 位单精度浮点数
浮点类型double64 位双精度浮点数
字符类型char16 位单个 Unicode 字符
布尔类型boolean不确定truefalse

2. 引用类型(Reference Types)

引用类型用于存储对象的引用,而不是对象本身。引用类型包括接口数组、和枚举,它们在 Java 中用于更复杂的数据结构和逻辑控制。

Object obj 参数的含义

在方法定义 参数类型 Object 表示可以传入任何对象类型,包含:

  • 所有包装类(IntegerDoubleCharacter 等)
  • 自定义类
  • String 类型
  • 其他引用类型(如数组、集合等)

2.1 类(Class)

  • Java 中的大部分数据类型都是通过类创建的,类可以表示数据和行为(即属性和方法)。

  • 类的实例称为对象,类的类型即为引用类型。

  • 示例:StringIntegerDoublePerson 等自定义类。

    String str = "Hello, World!";
    Person person = new Person("John", 25);
    

2.2 接口(Interface)

  • 接口是一种特殊的引用类型,用于定义类的公共行为。

  • 接口不能实例化,但可以被类实现,接口类型可以用于多态性,指定对象的行为。

  • 示例:ListMapRunnable 等都是接口类型。

    List<String> list = new ArrayList<>();  // List 是接口,ArrayList 是其实现
    Runnable task = new MyRunnable();       // Runnable 是接口
    

2.3 数组(Array)

  • 数组也是一种引用类型,表示一组相同类型的元素。

  • 数组类型可以是基本数据类型数组(如 int[])或引用类型数组(如 String[])。

    int[] numbers = {1, 2, 3};           // int 类型的数组
    String[] names = {"Alice", "Bob"};    // String 类型的数组
    

2.4 枚举(Enum)

  • 枚举类型用于表示一组有限的、固定的常量值,通常用于表示状态或一组相关常量。

  • 枚举类型是一个特殊的类,它使用 enum 关键字定义。

    enum Day {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
    }Day today = Day.MONDAY;
    

2.5 包装类(Wrapper Class)

  • 包装类是基本数据类型的对象版本,用于在需要对象类型的场景中使用基本类型的值。

  • 每种基本类型都有对应的包装类,例如 int 对应 Integerdouble 对应 Double

  • 包装类除了存储基本类型值,还提供了许多实用方法,如 parseInttoString 等。

    基本类型包装类
    intInteger
    doubleDouble
    booleanBoolean
    charCharacter
    byteByte
    shortShort
    longLong
    floatFloat
    Integer number = 42;
    Boolean flag = true;
    

所有包装类都具有 toString() 方法。这是因为所有包装类都继承自 Object 类,而 Object 类定义了 toString() 方法。因此,所有包装类(IntegerDoubleCharacter 等)都可以调用 toString() 方法。 

3. 使用包装类的场景

3.1. 集合框架的需求

使用原因:Java 集合框架(如 ListSetMap 等)只能存储对象,不能存储基本数据类型。当我们需要在集合中存储数值类型的数据时,必须使用包装类将基本类型转换为对象。这在统计、数据处理等需要存储大量数值的场景中非常常见。

示例场景

假设我们要存储一个班级中所有学生的分数,并计算平均分。我们可以使用 List<Integer> 来存储这些分数,因为集合只能存储对象类型。

List<Integer> scores = new ArrayList<>();
scores.add(85);  // 自动装箱,将 int 85 转换为 Integer 对象
scores.add(90);
scores.add(78);// 计算平均分
int total = 0;
for (Integer score : scores) {total += score;  // 自动拆箱,将 Integer 转换为 int 参与运算
}
double average = total / (double) scores.size();
System.out.println("Average score: " + average);  // 输出: Average score: 84.3333

3.2. 需要表示 null 值的场合

使用原因:基本数据类型(如 intdouble)不能表示 null,而包装类可以。这在数据库查询、数据初始化和用户输入处理中非常有用,因为 null 可以表示“未赋值”或“无效”状态。例如,当从数据库读取用户年龄时,未填写的年龄字段可以用 null 表示,而不是一个默认数值(如 0),以避免数据误解。

示例场景

假设我们从数据库中查询用户的年龄,如果用户未填写年龄,数据库会返回 null。在 Java 中,我们可以用 Integer 来存储用户年龄,以便准确表示“未填写”的状态。

Integer age = null;  // 表示年龄未填写// 判断是否填写了年龄
if (age == null) {System.out.println("Age is not provided.");
} else {System.out.println("Age: " + age);
}

3.3. 自动装箱和拆箱的便利性

使用原因:Java 支持自动装箱(基本类型自动转换为包装类)和自动拆箱(包装类自动转换为基本类型)。这种特性在集合和泛型的使用中尤其有用,因为我们可以直接操作基本类型的数值而无需手动转换,提升了代码的简洁性和可读性。

示例场景

假设我们有一个整数集合,想要将其中所有的分数加上 5 分。在遍历集合时,自动拆箱和装箱可以让我们直接进行数值操作,而无需手动转换。

List<Integer> scores = Arrays.asList(80, 85, 90);
List<Integer> updatedScores = new ArrayList<>();for (Integer score : scores) {updatedScores.add(score + 5);  // 自动拆箱为 int,计算后自动装箱为 Integer
}
System.out.println("Updated scores: " + updatedScores);  // 输出: [85, 90, 95]

3.4. 使用包装类的实用方法和常量

使用原因:包装类提供了许多实用方法和常量,便于数值转换、格式化、边界检查等操作。例如,Integer.parseInt() 可以将字符串转换为整数,Double.isNaN() 用于判断数值是否为 NaNInteger.MAX_VALUE 表示 int 的最大值。这些方法和常量使得包装类在数据处理和异常值检测中非常方便。

示例场景

假设我们从用户输入中获取一个字符串,并将其解析为整数。如果用户输入的是非数字内容,系统需要抛出异常。我们还可以检查浮点运算是否为 NaN 值。

try {int value = Integer.parseInt("123");  // 将字符串 "123" 转换为整数System.out.println("Parsed value: " + value);
} catch (NumberFormatException e) {System.out.println("Invalid number format");
}double result = 0.0 / 0.0;  // 计算无效值
if (Double.isNaN(result)) {System.out.println("Result is NaN (not a number)");
}

3.5. 泛型类型的需求

使用原因:Java 泛型只能接受引用类型,不能直接使用基本数据类型。这使得包装类在泛型类和方法中不可或缺。泛型设计使代码更具通用性和类型安全性,而包装类的引入确保了基本类型的兼容性。

示例场景

假设我们创建一个泛型类 Box,用于存储任意类型的数据。在泛型中,我们必须使用包装类来存储数值类型的数据。

class Box<T> {private T value;public Box(T value) { this.value = value; }public T getValue() { return value; }
}Box<Integer> intBox = new Box<>(100);  // 必须使用 Integer 而非 int
System.out.println("Boxed value: " + intBox.getValue());  // 输出: Boxed value: 100

3.6. 多态性和对象方法调用

使用原因:包装类作为对象,能够享受面向对象编程的特性,例如多态性和对象方法调用。Java 的 Number 类是 IntegerDouble 等包装类的父类,可以用作这些包装类的通用类型。此外,包装类的对象可以直接调用许多实用方法。

示例场景

假设我们编写一个方法,接收 Number 类型的参数。这种多态性允许该方法接受 IntegerDouble 等所有包装类类型的数值参数。

public static void printDoubleValue(Number num) {System.out.println("Double value: " + num.doubleValue());
}printDoubleValue(new Integer(10));   // 自动转为 double
printDoubleValue(new Double(15.5));

3.7. 比较和排序

使用原因:包装类实现了 Comparable 接口,因此支持对象的排序和比较操作。基本数据类型不具备对象的功能,而包装类提供的比较和排序接口使其可以直接用于集合的排序需求。在排序和优先级管理场景中,包装类广泛用于 ListSet 等集合的排序操作中。

示例场景

假设我们有一个学生分数的列表,想要按照分数从小到大排序。包装类 Integer 支持比较操作,可以直接在 Collections.sort() 中使用。

List<Integer> scores = Arrays.asList(88, 75, 90, 85);
Collections.sort(scores);  // 自动排序
System.out.println("Sorted scores: " + scores);  // 输出: [75, 85, 88, 90]

4.四种常用类型

4.1. String 类型

String 是 Java 中用于存储和处理文本数据的类。String 是不可变的,即一旦创建,字符串的内容就不能更改。每次对字符串进行修改时,都会创建一个新的 String 对象。

特点

  • 不可变性:字符串在创建后不可修改,修改字符串时会创建新的 String 对象。
  • 字符串池:Java 会将字符串字面量存储在一个字符串池(String Pool)中,以节省内存并提高性能。
  • 丰富的字符串操作方法String 类提供了多种方法,如 length()substring()charAt()equals()compareTo() 等,用于各种字符串操作。

常用方法

String str = "Hello, World!";// 获取字符串长度
int length = str.length();  // 13// 获取子字符串
String sub = str.substring(0, 5);  // "Hello"// 字符串比较
boolean isEqual = str.equals("Hello, World!");  // true// 转换为大写
String upper = str.toUpperCase();  // "HELLO, WORLD!"

在 Java 中,String 类型的对象可以通过两种方式创建:

  • 直接赋值(字符串字面量):例如 String str1 = "Java";
    • 这种方式会在 字符串池(String Pool) 中查找是否已有相同内容的字符串。
    • 如果字符串池中存在该内容的字符串,则会复用池中的对象。
    • 如果不存在,则会在字符串池中创建一个新对象。
  • 使用 new 关键字:例如 String str3 = new String("Java");
    • 这种方式会直接在 堆内存 中创建一个新的 String 对象,而不使用字符串池。
    • 即使内容相同,这样创建的对象也会与字符串池中的对象不同。

Stringchar 的相互转换

是的,Stringchar 类型可以相互转换。以下是常用的转换方法:

  • String 提取 char:可以使用 charAt(int index) 方法从 String 中提取指定位置的字符。

    String str = "Hello";
    char ch = str.charAt(1);  // 提取第二个字符 'e'
    
  • char 转换为 String:可以直接使用 Character.toString(char ch)String.valueOf(char ch),也可以通过字符串拼接的方式将 char 转换为 String

    char ch = 'A';
    String str = Character.toString(ch);  // 转换为 "A"
    // 或者使用
    String str2 = String.valueOf(ch);     // 转换为 "A"
    

示例

String str1 = "Java";
String str2 = "Java";
String str3 = new String("Java");// str1 和 str2 指向字符串池中的同一对象
System.out.println(str1 == str2);  // true// str3 是新创建的对象,虽然内容相同,但不是同一对象
System.out.println(str1 == str3);  // false
System.out.println(str1.equals(str3));  // true,内容相等

==equals 的区别

  • == 运算符:用于比较两个引用是否指向同一个对象,即比较两个对象的内存地址
    • str1 == str3 比较的是两个字符串引用是否指向同一对象。
    • 因为 str1 指向字符串池中的对象,而 str3 是一个新创建的对象,所以 str1 == str3false
  • equals 方法:用于比较两个字符串的内容是否相等。
    • str1.equals(str3) 比较的是两个字符串内容是否相同。
    • 即使两个字符串对象的引用不同,只要内容相同,equals 方法也会返回 true

  • String str1 = "Java";String str2 = "Java";

    • 这两个字符串都是通过字面量创建的,Java 作为字符串内容会被存储在字符串池中。
    • 因此,str1str2 指向的是字符串池中的同一个对象。
  • String str3 = new String("Java");

    • 使用 new 关键字创建的字符串对象总是会在堆内存中创建一个新对象。
    • 即使内容相同,str3 也是一个新的对象,不会指向字符串池中的对象。
    • 所以,str1 == str3 的结果为 false,因为它们不是同一个对象。


4.2. Character 类型

Characterchar 基本数据类型的包装类,用于表示单个字符。Character 提供了大量实用方法,用于处理字符的属性,如判断字符类型(字母、数字、空格等)或大小写转换。

特点

  • 字符操作方法Character 类提供了多种方法,用于判断字符类型、转换大小写等。
  • 字符编码Character 基于 Unicode 设计,因此可以表示世界上几乎所有语言的字符。

常用方法

Character charValue = Character.valueOf('A');  // 创建 Character 对象// 判断是否为字母
boolean isLetter = Character.isLetter('A');  // true// 判断是否为数字
boolean isDigit = Character.isDigit('1');  // true// 转换为小写
char lower = Character.toLowerCase('B');  // 'b'

示例

Character a = Character.valueOf('A');
Character b = Character.valueOf('A');// 字符在范围内时可能会缓存
System.out.println(a == b);  // true// 转换大小写
System.out.println(Character.toLowerCase('Z'));  // 'z'
System.out.println(Character.toUpperCase('z'));  // 'Z'

4.3. Integer 类型

Integerint 基本数据类型的包装类。包装类允许在需要对象的场合使用基本类型,例如在集合框架中。Integer 提供了许多静态方法,方便整数的处理和转换。

特点

  • 缓存机制:Java 对 -128127 之间的整数进行缓存,若数值在此范围内且通过 Integer.valueOf 创建,则会返回相同的对象。
  • 常用静态方法Integer 提供了一些实用的静态方法,如 parseInt() 将字符串转为 intvalueOf() 创建 Integer 对象。

常用方法

Integer intValue = Integer.valueOf(10);  // 创建 Integer 对象// 将字符串转换为 int
int parsedInt = Integer.parseInt("123");  // 123// 获取 Integer 的最大值
int maxValue = Integer.MAX_VALUE;  // 2147483647

Integer.parseInt("123") 的转换规则

  • Integer.parseInt("123"):这个方法用于将字符串表示的数值转换为 int 类型。例如 Integer.parseInt("123") 的结果是 123

  • 非法输入的处理:如果输入的字符串不是有效的数字(如包含字母),则会抛出 NumberFormatException 异常,而不会进行任何转换。

    • 例如,Integer.parseInt("abc") 会抛出异常,而不是转换为 ASCII 码。

示例

Integer a = Integer.valueOf(100);
Integer b = Integer.valueOf(100);
Integer c = Integer.valueOf(200);// a 和 b 指向相同的缓存对象
System.out.println(a == b);  // true// c 不在缓存范围内,创建新对象
System.out.println(a == c);  // false

4.4. Double 类型

Doubledouble 基本数据类型的包装类,表示双精度浮点数。Double 用于存储和处理小数数据,在需要对象的场合使用。

特点

  • 精度:双精度浮点数具有较高的精度,适合存储大范围或高精度的小数值。
  • NaN 和 InfinityDouble 提供了 NaN(非数值)和 Infinity(无穷大)等特殊值,用于表示非法或超出范围的结果。
  • 常用静态方法Double 提供了将字符串转换为 double 的方法 parseDouble(),还可以使用 Double.valueOf() 创建 Double 对象。

常用方法

Double doubleValue = Double.valueOf(5.5);  // 创建 Double 对象// 将字符串转换为 double
double parsedDouble = Double.parseDouble("123.45");  // 123.45// 检查是否为 NaN
boolean isNaN = Double.isNaN(0.0 / 0.0);  // true// 获取 Double 的最大值
double maxValue = Double.MAX_VALUE;  // 1.7976931348623157E308

示例

Double x = Double.valueOf(10.5);
Double y = Double.valueOf(10.5);// 浮点数没有缓存机制,不同对象
System.out.println(x == y);  // false// 内容相同
System.out.println(x.equals(y));  // true

5.Vector 

Vector 是 Java 中的一种动态数组实现类,位于 java.util 包中,因此它属于引用类型。与 ArrayList 类似,Vector 允许动态调整容量以容纳更多的元素,但与 ArrayList 不同的是,Vector 是线程安全的,所有方法都被同步(synchronized)修饰,因此可以在多线程环境中安全使用。

Vector 的主要特点

  • 动态数组Vector 是一个动态数组,可以自动调整容量。与普通数组不同,Vector 的大小不是固定的,它会根据需要自动扩展。
  • 线程安全Vector 是线程安全的,因为它的所有方法都被 synchronized 修饰。这样保证了在多线程环境中不会发生并发修改问题。
  • 有序存储Vector 按照插入顺序存储元素,即添加元素的顺序就是迭代时的顺序。
  • 支持随机访问Vector 通过索引可以快速访问元素,适合需要频繁按索引访问的场景。
  • 扩容机制Vector 默认的初始容量是 10,当容量不够时,会自动扩展到原容量的 2 倍,或者可以指定扩容因子来控制增长速度。

5.1. 创建 Vector

Vector 提供了多种构造方法,允许我们指定初始容量和容量增量(扩展大小)。

  • Vector():创建一个默认容量为 10 的空向量。
  • Vector(int initialCapacity):创建一个指定初始容量的空向量。
  • Vector(int initialCapacity, int capacityIncrement):创建一个指定初始容量和容量增量的空向量。容量增量用于控制扩展速度。
import java.util.Vector;public class VectorCreationExample {public static void main(String[] args) {Vector<String> vector1 = new Vector<>();  // 默认容量 10Vector<String> vector2 = new Vector<>(20);  // 指定初始容量为 20Vector<String> vector3 = new Vector<>(10, 5);  // 初始容量 10,扩展增量 5System.out.println("Vector1 capacity: " + vector1.capacity());  // 输出: 10System.out.println("Vector2 capacity: " + vector2.capacity());  // 输出: 20System.out.println("Vector3 capacity: " + vector3.capacity());  // 输出: 10}
}

5.2. 添加元素

Vector 提供了多种方法来添加元素:

  • add(E e):将元素添加到 Vector 的末尾。
  • add(int index, E element):在指定索引处插入元素。
  • addAll(Collection<? extends E> c):将另一个集合中的所有元素添加到 Vector
import java.util.Vector;public class VectorAddExample {public static void main(String[] args) {Vector<String> vector = new Vector<>();vector.add("Alice");  // 添加到末尾vector.add("Bob");vector.add(1, "Charlie");  // 在索引 1 处插入 "Charlie"Vector<String> moreNames = new Vector<>();moreNames.add("David");moreNames.add("Eve");vector.addAll(moreNames);  // 将 moreNames 中的元素添加到 vectorSystem.out.println("Vector after additions: " + vector);  // 输出: [Alice, Charlie, Bob, David, Eve]}
}

5.3. 访问和查询元素

Vector 支持通过索引访问元素,还可以检查元素是否存在,获取首尾元素等。

  • get(int index):返回指定索引处的元素。
  • firstElement():返回第一个元素。
  • lastElement():返回最后一个元素。
  • contains(Object o):检查 Vector 是否包含指定的元素。
  • indexOf(Object o):返回指定元素首次出现的索引位置。
  • size():返回 Vector 中的元素数量。
import java.util.Vector;public class VectorAccessExample {public static void main(String[] args) {Vector<String> vector = new Vector<>();vector.add("Alice");vector.add("Bob");vector.add("Charlie");// 访问元素System.out.println("First element: " + vector.firstElement());  // 输出: AliceSystem.out.println("Last element: " + vector.lastElement());    // 输出: CharlieSystem.out.println("Element at index 1: " + vector.get(1));     // 输出: Bob// 查询元素System.out.println("Contains 'Alice'? " + vector.contains("Alice"));  // 输出: trueSystem.out.println("Index of 'Charlie': " + vector.indexOf("Charlie"));  // 输出: 2System.out.println("Vector size: " + vector.size());  // 输出: 3}
}

5.4. 更新元素

使用 set(int index, E element) 方法可以替换 Vector 中指定索引位置的元素。

import java.util.Vector;public class VectorUpdateExample {public static void main(String[] args) {Vector<String> vector = new Vector<>();vector.add("Alice");vector.add("Bob");vector.add("Charlie");// 更新元素vector.set(1, "Bob Updated");  // 更新索引 1 的元素System.out.println("Vector after update: " + vector);  // 输出: [Alice, Bob Updated, Charlie]}
}

5.5. 删除元素

Vector 提供了多种方法删除元素,可以通过索引删除,也可以按值删除,还可以清空 Vector

  • remove(int index):删除指定索引位置的元素。
  • remove(Object o):删除首次出现的指定元素。
  • removeAll(Collection<?> c):删除 Vector 中包含在指定集合中的所有元素。
  • clear():清空 Vector,删除所有元素。
import java.util.Vector;public class VectorRemoveExample {public static void main(String[] args) {Vector<String> vector = new Vector<>();vector.add("Alice");vector.add("Bob");vector.add("Charlie");// 按索引删除元素vector.remove(1);  // 删除索引 1 的元素 "Bob"System.out.println("After removing index 1: " + vector);  // 输出: [Alice, Charlie]// 按值删除元素vector.remove("Alice");System.out.println("After removing Alice: " + vector);  // 输出: [Charlie]// 清空 Vectorvector.clear();System.out.println("After clearing: " + vector);  // 输出: []}
}

5.6. 遍历 Vector

可以使用 for 循环、增强 for 循环或 Iterator 来遍历 Vector

  • iterator():返回 Vector 的迭代器。
  • elements():返回 Enumeration 对象,适用于旧版本的代码,但现在更推荐使用 Iterator
import java.util.Iterator;
import java.util.Vector;public class VectorIterationExample {public static void main(String[] args) {Vector<String> vector = new Vector<>();vector.add("Alice");vector.add("Bob");vector.add("Charlie");// 使用 for 循环System.out.println("Using for loop:");for (int i = 0; i < vector.size(); i++) {System.out.println(vector.get(i));}// 使用增强型 for 循环System.out.println("Using enhanced for loop:");for (String name : vector) {System.out.println(name);}// 使用 IteratorSystem.out.println("Using Iterator:");Iterator<String> iterator = vector.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}}
}

5.7. 扩容机制

Vector 的容量不足以容纳新元素时,会自动扩容。默认情况下,Vector 每次扩容为原容量的 2 倍。不过,可以通过构造方法指定扩展因子,控制每次扩容的增量。

import java.util.Vector;public class VectorCapacityExample {public static void main(String[] args) {Vector<Integer> vector = new Vector<>(3, 2);  // 初始容量为 3,扩展因子为 2// 添加元素触发扩容for (int i = 1; i <= 5; i++) {vector.add(i);System.out.println("Capacity after adding element " + i + ": " + vector.capacity());}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/6001.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

探索魁北克:IT精英的理想移民地

在当今这个数字化时代&#xff0c;IT行业无疑是全球最具活力和发展潜力的领域之一。加拿大&#xff0c;尤其是魁北克省&#xff0c;以其开放的移民政策、优越的工作环境和高质量的生活&#xff0c;成为IT专业人士的理想移民目的地。 一、加拿大IT行业的吸引力 职业发展与稳定性…

Linux(CentOS)安装 Nginx

CentOS版本&#xff1a;CentOS 7 Nginx版本&#xff1a;1.24.0 1、下载 Nginx 打开Nginx官网&#xff1a;https://nginx.org/ 2、上传 Nginx 文件到 CentOS 使用FinalShell远程登录工具&#xff0c;并且使用 root 用户连接登录&#xff08;注意这里说的root用户连接登录是指…

Django安装

在终端创建django项目 1.查看自己的python版本 输入对应自己本机python的版本&#xff0c;列如我的是3.11.8 先再全局安装django依赖包 2.在控制窗口输入安装命令&#xff1a; pip3.11 install django 看到Successflully 说明我们就安装成功了 python的Scripts文件用于存…

Qt字符编码

目前字符编码有以下几种&#xff1a; 1、UTF-8 UTF-8编码是Unicode字符集的一种编码方式(CEF)&#xff0c;其特点是使用变长字节数(即变长码元序列、变宽码元序列)来编码。一般是1到4个字节&#xff0c;当然&#xff0c;也可以更长。 2、UTF-16 UTF-16是Unicode字符编码五层次…

微服务设计模式 - 网关路由模式(Gateway Routing Pattern)

微服务设计模式 - 网关路由模式&#xff08;Gateway Routing Pattern&#xff09; 定义 网关路由模式&#xff08;Gateway Routing Pattern&#xff09;是微服务架构中一种非常重要的设计模式&#xff0c;主要用于在客户端和微服务之间提供一个中间层。这一模式通过中央网关路…

【Axure高保真原型】PDF阅读器

今天和大家分享PDF阅读器的原型模板&#xff0c;我们点击左侧的PDF&#xff0c;点击后右侧能看到这个PDF的内容&#xff0c;每个PDF都可以点击查看&#xff0c;如果PDF内容太多&#xff0c;我们也可以通过鼠标滚动来查看。这个模板是用中继器制作的&#xff0c;所以使用也很方便…

uniapp学习(010-2 实现抖音小程序上线)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战&#xff0c;开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第113p的内容 文章目录 抖音小程序下载抖音开发者工具先去开发者工具里进行测试 抖音开放平台配置开始打包上传…

漏洞挖掘某电子商城类漏洞挖掘案例教程,手把手教你复现一个完整的漏洞挖掘全流程

前言 电子商城购物系统我们每天都能接触到&#xff0c;现在的商城系统&#xff0c;大多数已经在小程序、APP方向去开发了&#xff0c;因为灵活&#xff0c;方便管理且开发难度不高&#xff0c;当然&#xff0c;现在WEB系统还很多&#xff0c;我们本次会选几个SRC去浅挖一下那些…

C#入门013 表达式,语句详解 2

语句的定义 在计算机编程中&#xff0c;一条语句&#xff08;statement&#xff09;是命令式编程语言中表达某个要执行的动作的最小独立组成部分。用这种语言编写的程序是由一个或多个语句组成的序列构成的。语句可以包含内部组件&#xff0c;比如表达式&#xff08;expressio…

【运动的&足球】足球场景目标检测系统源码&数据集全套:改进yolo11-ASF-P2

改进yolo11-RetBlock等200全套创新点大全&#xff1a;足球场景目标检测系统源码&#xff06;数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.11.03 注意&#xff1a;由于项目一直在更新迭代&#xff0c;上面“1.图片效果展示”和“2.视频效果展示”展示的系统图片或…

数据结构之复杂度

hello everybody&#xff0c;好久不见&#xff0c;由于前些日子在学习文件操作&#xff0c;预处理相关知识&#xff0c;导致我好些天没写博客了&#xff0c;所以我先从数据结构开始写吧&#xff0c;等后面熟练些了再补回来&#xff0c;欧克&#xff0c;话不多说&#xff0c;进入…

使用Jest进行JavaScript单元测试

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Jest进行JavaScript单元测试 引言 Jest 简介 安装 Jest 创建基本配置 编写测试用例 运行测试 快照测试 模拟函数 代码覆盖率…

Node.js 应用程序中的文件写入提升为 RCE

在这篇博文中,我们将强调代码安全基础的重要性。我们会展示一个技术案例:攻击者如何能够把 Node.js 应用中的文件写入漏洞转化为远程代码执行,即便目标系统的文件系统是以只读方式挂载的。这个技术通过利用暴露的管道文件描述符来获得代码执行能力,从而绕过了这类加固环境中的限…

Oracle视频基础1.4.5练习

1.4.5 看bbk的框架 ls env | grep ORA cd /u01/oradata ls ll cd bbk ll cd /u01/admin/ ll ll bbk cd cd db cd dbs ls vi initbbk.ora clear ls ll env | grep ORA执行创建数据库语句。 sqlplus /nolog conn /as sysdba create spfile from pfile ! ls ll exit startup nom…

Echats柱状图的横坐标用图片显示

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>图片作为横坐标示例 - ECharts</title><!-…

vscode php Launch built-in server and debug, PHP内置服务xdebug调试,自定义启动参数配置使用示例

在vscode中&#xff0c;当我们安装了插件 PHP Debug&#xff08;xdebug.php-debug&#xff09;或者 xdebug.php-pack 后 我们通过内置默认的 php xdebug配置启动php项目后&#xff0c;默认情况下我们在vscode中设置断点是不会生效的&#xff0c;因为我们的内置php服务默认启动时…

城镇保障性住房管理:SpringBoot系统创新点

5系统详细实现 5.1 用户信息管理 管理员可以对用户信息进行添加&#xff0c;修改&#xff0c;删除操作。具体界面的展示如图5.1所示。 图5.1 用户信息管理界面 5.2 房屋类型管理 管理员可以对房屋类型信息进行添加&#xff0c;修改&#xff0c;删除操作。具体界面如图5.2所示…

积极助力信创工作,爱加密荣获麒麟系统优秀合作伙伴

近日&#xff0c;麒麟软件安全生态联盟2024年第三次工作会议顺利举行。麒麟软件安全生态联盟由工业和信息化部网络安全产业发展中心指导成立&#xff0c;旨在联合打造原创性、引领性的自主操作系统内生安全技术体系和自主创新安全生态。会上&#xff0c;麒麟软件相关领导为爱加…

用图说明 CPU、MCU、MPU、SoC 的区别

CPU CPU 负责执行构成计算机程序的指令&#xff0c;执行这些指令所指定的算术、逻辑、控制和输入/输出&#xff08;I/O&#xff09;操作。 MCU (microcontroller unit) 不同的 MCU 架构如下&#xff0c;注意这里的 MPU 表示 memory protection unit MPU (microprocessor un…

navicat pg库安装mysql fdw 外表扩展

在Windows上手动安装mysql_fdw&#xff08;MySQL Foreign Data Wrapper&#xff09;通常涉及一系列步骤&#xff0c;包括下载源码、编译、配置和测试。以下是一个详细的指南&#xff1a; 一、下载mysql_fdw源码 访问mysql_fdw的GitHub发布页面&#xff0c;选择最新版本的源码…