【java分布式计算】分布式计算程序设计基础

期末复习 自留 重点只抓考点


目录

基本技术

SOCKETS网络套接字

多线程

数据序列化

Java I/O流

集合容器

范型

内部类、匿名类、Lambda(代码)

项目构建管理工具

高级技术

注解(代码)

反射(代码)

Stream api

动态代理设计模式

控制反转与依赖注入(代码)

应用案例


基本技术

  • SOCKETS网络套接字

  • 多线程

  • 数据序列化

  • Java I/O流

  • 集合容器

Set 、List 、Map 、Iterator & Enumeration

  • 范型

范型通配符?

        <? super E >固定下界限定

        <? extends E>固定上界限定

        <?> 无限定

  • 内部类、匿名类、Lambda(代码)

  1. 内部类
  2. 匿名类(内部类的简化)
  3. Lambda表达式(匿名类的简化):
  - 一种函数式接口的实现对象 函数式接口-仅含一个方法
  - 本质上是一个接口的匿名实现类的方法函数
  - ::方法引用

       内部类、匿名类和Lambda表达式都是Java中用于定义行为的方式。它们各有特点,并且可以相互转换。下面将通过具体例子说明这些概念及其关系。

内部类

内部类是定义在另一个类内部的类。它可以访问外部类的成员,包括私有成员。

public class OuterClass {
    private String outerField = "Outer field"; // 外部类的私有字段

    // 定义一个内部类
    public class InnerClass {
        public void display() {
            // 内部类可以访问外部类的私有字段
            System.out.println(outerField);
        }
    }

    // 创建内部类实例并调用其方法
    public void createInner() {
        InnerClass inner = new InnerClass(); // 创建内部类实例
        inner.display(); // 调用内部类的方法
    }

    public static void main(String[] args) {
        OuterClass outer = new OuterClass(); // 创建外部类实例
        outer.createInner(); // 调用方法创建并使用内部类
    }
}

 匿名类

public class AnonymousClassExample {
    interface MyInterface {
        void display(); // 定义一个接口方法
    }

    // 使用匿名类实现接口
    public void createAnonymousClass() {
        MyInterface myInterface = new MyInterface() {
            @Override
            public void display() {
                // 实现接口方法
                System.out.println("Anonymous class implementation");
            }
        };
        myInterface.display(); // 调用匿名类实现的方法
    }

    public static void main(String[] args) {
        AnonymousClassExample example = new AnonymousClassExample(); // 创建外部类实例
        example.createAnonymousClass(); // 调用方法使用匿名类
    }
}

Lambda表达式

对于lambda表达式来说,我们只需要入参和相关的执行逻辑即可

加上箭头,就成为了lambda表达式

public class LambdaExpressionExample {
    interface MyFunctionalInterface {
        void display(); // 定义一个函数式接口方法
    }

    // 使用Lambda表达式实现函数式接口
    public void createLambda() {
        MyFunctionalInterface myInterface = () -> {
            // Lambda表达式实现接口方法
            System.out.println("Lambda expression implementation");
        };
        myInterface.display(); // 调用Lambda表达式实现的方法
    }

    public static void main(String[] args) {
        LambdaExpressionExample example = new LambdaExpressionExample(); // 创建外部类实例
        example.createLambda(); // 调用方法使用Lambda表达式
    }
}

函数式接口

@FunctionalInterface
interface MyFunctionalInterface {
    void display(); // 仅含一个抽象方法的接口
}

方法引用

        方法引用的语法是:类名::方法名,其中 类名 是包含方法的类的名称,方法名 是要引用的方法的名称。方法引用可以替换 Lambda 表达式,并在更简洁的形式下提供相同的功能。

方法引用的类型有四种:

静态方法引用ClassName::staticMethodName
实例方法引用instance::methodName
构造方法引用ClassName::new
数组构造方法引用TypeName[]::new

静态方法引用:

静态方法引用用于引用类的静态方法。

import java.util.Arrays;
import java.util.List;

public class StaticMethodReferenceExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie");

        // 使用 Lambda 表达式和静态方法引用打印集合中的元素
        names.forEach(name -> System.out.println(name));
        names.forEach(System.out::println);
    }
}

实例方法引用:

实例方法引用用于引用某个对象的实例方法。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class ConstructorReferenceExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie");

        // 使用 Lambda 表达式和构造方法引用创建新集合
        List<String> upperCaseNames1 = names.stream()
                                            .map(name -> new String(name.toUpperCase()))
                                            .collect(Collectors.toList());

        List<String> upperCaseNames2 = names.stream()
                                            .map(String::toUpperCase)
                                            .collect(Collectors.toList());

        System.out.println(upperCaseNames1); // 输出: [ALICE, BOB, CHARLIE]
        System.out.println(upperCaseNames2); // 输出: [ALICE, BOB, CHARLIE]
    }
}

构造方法引用:

构造方法引用用于引用类的构造方法。

import java.util.function.Supplier;

public class ConstructorReferenceExample {
    private String message;

    // 构造方法
    public ConstructorReferenceExample() {
        this.message = "Default Message";
    }

    public String getMessage() {
        return message;
    }

    public static void main(String[] args) {
        // 使用构造方法引用
        Supplier<ConstructorReferenceExample> supplier = ConstructorReferenceExample::new;
        
        // 创建新对象
        ConstructorReferenceExample example = supplier.get();
        System.out.println(example.getMessage()); // 输出: Default Message
    }
}

数组构造方法引用

数组构造方法引用用于引用数组的构造方法。

import java.util.function.Function;

public class ArrayConstructorReferenceExample {
    public static void main(String[] args) {
        // 使用数组构造方法引用创建新数组
        Function<Integer, int[]> createIntArray = int[]::new;

        // 创建一个长度为5的整数数组
        int[] intArray = createIntArray.apply(5);

        // 输出数组长度以验证
        System.out.println("Array length: " + intArray.length);
    }
}

转换示例

内部类

public class ConversionExample {
    interface MyInterface {
        void display(); // 定义一个接口方法
    }

    // 定义一个内部类实现接口
    public class InnerClass implements MyInterface {
        @Override
        public void display() {
            System.out.println("Inner class implementation");
        }
    }

    // 使用内部类
    public void useInnerClass() {
        MyInterface myInterface = new InnerClass(); // 创建内部类实例
        myInterface.display(); // 调用内部类实现的方法
    }

    public static void main(String[] args) {
        ConversionExample example = new ConversionExample(); // 创建外部类实例
        example.useInnerClass(); // 调用方法使用内部类
    }
}

1. 内部类:可以访问外部类的成员,包括私有成员。适合需要访问外部类成员的场景。
2. 匿名类:没有名称,适合快速定义接口或类的实现,通常用于一次性使用的场景。
3. Lambda表达式:简化了匿名类的使用,主要用于实现仅含一个抽象方法的函数式接口,更加简洁和易读。
4. 方法引用:Lambda表达式的更简洁形式,用于引用现有的方法,进一步简化代码。

通过这些示例和解释,可以清楚地理解内部类、匿名类和Lambda表达式的关系,并且可以在不同场景下相互转换。

  • 项目构建管理工具

高级技术

  • 注解(代码)

自定义一段代码

package com.kuang.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

// 自定义注解
public class Test03 {
    // 注解可以显示属性,如果没有默认值,我们就必须给注解赋值
    @MyAnnotation2()
    public void test() {}
}

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation2 {
    // 注解的参数:参数类型 + 参数名 ()
    String name() default "";
    int age() default 0;
    int id() default -1; // 如果默认值为-1,代表不存在
    String[] schools() default {"上海大学", "下海大学"};
}

没有默认值的情况: 

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

// 自定义注解
public class Test03 {
    // 注解可以显示属性,如果没有默认值,我们就必须给注解赋值
    @MyAnnotation2(age = 18)
    public void test() {}
}

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation2 {
    // 注解的参数:参数类型 + 参数名 ()
    String name() default "";
    int age();
    int id() default -1; // 如果默认值为-1,代表不存在
    String[] schools() default {"上海大学", "下海大学"};
}

 

  • 反射(代码)

参考视频

考点:具体构建对象,执行方法,调用属性

构造一个简单的反射

// 什么是反射
public class Test02 {
    public static void main(String[] args) throws ClassNotFoundException {
        // 通过反射获取类的 Class 对象
        // Class.forName 方法会加载指定的类,并返回该类的 Class 对象
        Class<?> c1 = Class.forName("com.kuang.reflection.User");
        // 打印 Class 对象的信息
        System.out.println(c1);

        // 多次获取相同类的 Class 对象
        Class<?> c2 = Class.forName("com.kuang.reflection.User");
        Class<?> c3 = Class.forName("com.kuang.reflection.User");
        Class<?> c4 = Class.forName("com.kuang.reflection.User");

        // 验证一个类在内存中只有一个 Class 对象
        // 通过比较 Class 对象的 hashCode 来确认它们是同一个对象
        // hashCode 相同表示这些 Class 对象是同一个实例
        System.out.println(c2.hashCode());
        System.out.println(c3.hashCode());
        System.out.println(c4.hashCode());
    }
}

// 实体类:pojo,entity
// 定义一个简单的 User 类,用于反射操作示例
class User {
    // 示例中的实体类 User 的定义
    // 这里可以包含一些属性和方法

    private String name;
    private int age;

    // 构造方法
    public User() {
    }

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Getter 和 Setter 方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    // 一个简单的方法
    public void printInfo() {
        System.out.println("Name: " + name + ", Age: " + age);
    }
}

获得Class的方法

 

1. `object.getClass()`:获取指定实例对象的 `Class`。

import java.util.ArrayList;
import java.util.List;

public class Example1 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        Class<?> listClass = list.getClass();
        System.out.println("Class name: " + listClass.getName());
    }
}

输出:

Class name: java.util.ArrayList

2. `Class.getSuperclass()`:获取当前 `Class` 对象的继承类 `Class`。

import java.util.ArrayList;

public class Example2 {
    public static void main(String[] args) {
        Class<?> listClass = ArrayList.class;
        Class<?> superClass = listClass.getSuperclass();
        System.out.println("Superclass name: " + superClass.getName());
    }
}

输出:

Superclass name: java.util.AbstractList

3. `Object.class`:`.class` 直接获取 `Class`。

public class Example3 {
    public static void main(String[] args) {
        Class<?> listClass = ArrayList.class;
        System.out.println("Class name: " + listClass.getName());
    }
}

输出:

Class name: java.util.ArrayList

4. `Class.forName(类名)` :用 `Class` 的静态方法传入类的全名来获取 `Class` 对象。

public class Example4 {
    public static void main(String[] args) {
        try {
            Class<?> c = Class.forName("java.util.ArrayList");
            System.out.println("Class name: " + c.getName());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

输出:

Class name: java.util.ArrayList

5. `Primitive.TYPE`:基本数据类型的封装类获取 `Class` 的方式。

public class Example5 {
    public static void main(String[] args) {
        Class<?> longClass = Long.TYPE;
        Class<?> integerClass = Integer.TYPE;
        Class<?> voidClass = Void.TYPE;

        System.out.println("Long class: " + longClass.getName());
        System.out.println("Integer class: " + integerClass.getName());
        System.out.println("Void class: " + voidClass.getName());
    }
}

输出:

Long class: long
Integer class: int
Void class: void

通过反射实例化对象

平常情况我们通过new Object来生成一个类的实例,但有时候我们没法直接new,只能通过反射动态生成。

实例化无参构造函数的对象,两种方式:

①Class. newInstance();

②Class. getConstructor (new Class[]{}).newInstance(new Object[]{})

实例化带参构造函数的对象:

Class. getConstructor(Class<?>... parameterTypes) . newInstance(Object... initargs)

// 定义Person类
package com.example;

public class Person {
    private String name;

    public Person() {
        this.name = "Default Name";
    }

    @Override
    public String toString() {
        return "Person{name='" + name + "'}";
    }
}

示例 1:使用 `Class.newInstance()` 实例化无参构造函数对象

public class Example1 {
    public static void main(String[] args) {
        try {
            // 获取Class对象
            Class<?> clazz = Class.forName("com.example.Person");
            
            // 通过Class.newInstance()实例化对象
            Object instance = clazz.newInstance();
            
            // 打印实例对象信息
            System.out.println(instance);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

输出:
Person{name='Default Name'}

示例 2:使用 `Class.getConstructor().newInstance()` 实例化无参构造函数对象

public class Example2 {
    public static void main(String[] args) {
        try {
            // 获取Class对象
            Class<?> clazz = Class.forName("com.example.Person");
            
            // 通过getConstructor().newInstance()实例化对象
            Object instance = clazz.getConstructor().newInstance();
            
            // 打印实例对象信息
            System.out.println(instance);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

输出:
Person{name='Default Name'}

 示例 3:实例化带参构造函数的对象

public class Example3 {
    public static void main(String[] args) {
        try {
            // 获取Class对象
            Class<?> clazz = Class.forName("com.example.Person");
            
            // 获取带有String参数的构造函数
            java.lang.reflect.Constructor<?> constructor = clazz.getConstructor(String.class);
            
            // 通过构造函数实例化对象,并传递参数
            Object instance = constructor.newInstance("John Doe");
            
            // 打印实例对象信息
            System.out.println(instance);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

输出:
Person{name='John Doe'}
 

通过反射调用Method(方法)

获得当前类以及超类的public Method: Method[] arrMethods = classType. getMethods();

获得当前类申明的所有Method: Method[] arrMethods = classType. getDeclaredMethods();

获得当前类以及超类指定的public Method: Method method = classType. getMethod(String name, Class<?>... parameterTypes);

获得当前类申明的指定的Method: Method method = classType. getDeclaredMethod(String name, Class<?>... parameterTypes)

通过反射动态运行指定Method: Object obj = method. invoke(Object obj, Object... args)

import java.lang.reflect.Method;

public class ReflectionExample {
    public static void main(String[] args) {
        try {
            // 获取Class对象
            Class<?> clazz = Class.forName("com.example.Person");

            // 获取当前类及其超类的public方法
            Method[] publicMethods = clazz.getMethods();
            System.out.println("Public methods:");
            for (Method method : publicMethods) {
                System.out.println(method.getName());
            }

            // 获取当前类声明的所有方法
            Method[] declaredMethods = clazz.getDeclaredMethods();
            System.out.println("\nDeclared methods:");
            for (Method method : declaredMethods) {
                System.out.println(method.getName());
            }

            // 获取当前类及其超类指定的public方法
            Method getNameMethod = clazz.getMethod("getName");
            System.out.println("\ngetName method: " + getNameMethod);

            // 获取当前类声明的指定方法
            Method setNameMethod = clazz.getDeclaredMethod("setName", String.class);
            System.out.println("\nsetName method: " + setNameMethod);

            // 通过反射动态运行指定方法
            Object personInstance = clazz.getConstructor().newInstance();

            // 运行setName方法
            setNameMethod.invoke(personInstance, "John Doe");

            // 运行getName方法
            Object name = getNameMethod.invoke(personInstance);
            System.out.println("\nName: " + name);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

// 定义Person类
package com.example;

public class Person {
    private String name;

    public Person() {
        this.name = "Default Name";
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    private void privateMethod() {
        System.out.println("This is a private method.");
    }
}

运行结果

Public methods:
getName
wait
wait
wait
equals
toString
hashCode
getClass
notify
notifyAll

Declared methods:
getName
setName
privateMethod

getName method: public java.lang.String com.example.Person.getName()

setName method: public void com.example.Person.setName(java.lang.String)

Name: John Doe

1. 获取 `Class` 对象:
   Class<?> clazz = Class.forName("com.example.Person");
   - 通过类的全限定名获取 `Class` 对象。

2. 获取当前类及其超类的 `public` 方法:
   Method[] publicMethods = clazz.getMethods();
   - 使用 `getMethods` 方法获取当前类及其超类的所有 `public` 方法。

3. 获取当前类声明的所有方法:
   Method[] declaredMethods = clazz.getDeclaredMethods();
   - 使用 `getDeclaredMethods` 方法获取当前类声明的所有方法(包括 `public`、`protected`、`default` 和 `private` 方法)。

4. 获取当前类及其超类指定的 `public` 方法:
   Method getNameMethod = clazz.getMethod("getName");
   - 使用 `getMethod` 方法获取当前类及其超类中指定的 `public` 方法。

5. 获取当前类声明的指定方法:
   Method setNameMethod = clazz.getDeclaredMethod("setName", String.class);
   - 使用 `getDeclaredMethod` 方法获取当前类声明的指定方法。

6.通过反射动态运行指定方法:
   Object personInstance = clazz.getConstructor().newInstance();
   setNameMethod.invoke(personInstance, "John Doe");
   Object name = getNameMethod.invoke(personInstance);
   - 通过 `clazz.getConstructor().newInstance()` 创建类的实例。
   - 使用 `invoke` 方法调用 `setName` 和 `getName` 方法。

通过反射调用Field(变量)

获得当前类以及超类的public Field: Field[] arrFields = classType. getFields();

获得当前类申明的所有Field: Field[] arrFields = classType. getDeclaredFields();

获得当前类以及超类指定的public Field: Field field = classType. getField(String name);

获得当前类申明的指定的Field: Field field = classType. getDeclaredField(String name);

通过反射动态设定Field的值: fieldType.set(Object obj, Object value);

通过反射动态获取Field的值: Object obj = fieldType. get(Object obj) ;
 

import java.lang.reflect.Field;

public class ReflectionFieldExample {
    public static void main(String[] args) {
        try {
            // 获取Class对象
            Class<?> clazz = Class.forName("com.example.Person");

            // 获取当前类及其超类的public字段
            Field[] publicFields = clazz.getFields();
            System.out.println("Public fields:");
            for (Field field : publicFields) {
                System.out.println(field.getName());
            }

            // 获取当前类声明的所有字段
            Field[] declaredFields = clazz.getDeclaredFields();
            System.out.println("\nDeclared fields:");
            for (Field field : declaredFields) {
                System.out.println(field.getName());
            }

            // 获取当前类及其超类指定的public字段
            Field publicField = clazz.getField("publicField");
            System.out.println("\npublicField: " + publicField);

            // 获取当前类声明的指定字段
            Field privateField = clazz.getDeclaredField("privateField");
            System.out.println("\nprivateField: " + privateField);

            // 创建Person类的实例
            Object personInstance = clazz.getConstructor().newInstance();

            // 通过反射动态设定字段的值
            publicField.set(personInstance, "Public Field Value");
            privateField.setAccessible(true); // 设置私有字段可访问
            privateField.set(personInstance, "Private Field Value");

            // 通过反射动态获取字段的值
            Object publicFieldValue = publicField.get(personInstance);
            Object privateFieldValue = privateField.get(personInstance);

            System.out.println("\nPublic Field Value: " + publicFieldValue);
            System.out.println("Private Field Value: " + privateFieldValue);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

// 定义Person类
package com.example;

public class Person {
    public String publicField = "Initial Public Field Value";
    private String privateField = "Initial Private Field Value";

    public Person() {
    }

    @Override
    public String toString() {
        return "Person{publicField='" + publicField + "', privateField='" + privateField + "'}";
    }
}

运行结果

Public fields:
publicField

Declared fields:
publicField
privateField

publicField: public java.lang.String com.example.Person.publicField

privateField: private java.lang.String com.example.Person.privateField

Public Field Value: Public Field Value
Private Field Value: Private Field Value

1. 获取 `Class` 对象:
   Class<?> clazz = Class.forName("com.example.Person");
   - 通过类的全限定名获取 `Class` 对象。

2. 获取当前类及其超类的 `public` 字段:
   Field[] publicFields = clazz.getFields();
   - 使用 `getFields` 方法获取当前类及其超类的所有 `public` 字段。

3. 获取当前类声明的所有字段:
   Field[] declaredFields = clazz.getDeclaredFields();
   - 使用 `getDeclaredFields` 方法获取当前类声明的所有字段(包括 `public`、`protected`、`default` 和 `private` 字段)。

4. 获取当前类及其超类指定的 `public` 字段:

Field publicField = clazz.getField("publicField");
   - 使用 `getField` 方法获取当前类及其超类中指定的 `public` 字段。

5. 获取当前类声明的指定字段:
   Field privateField = clazz.getDeclaredField("privateField");
   - 使用 `getDeclaredField` 方法获取当前类声明的指定字段。

6. 通过反射动态设定字段的值:
   publicField.set(personInstance, "Public Field Value");
   privateField.setAccessible(true); // 设置私有字段可访问
   privateField.set(personInstance, "Private Field Value");
   - 使用 `set` 方法设置字段的值。
   - 使用 `setAccessible(true)` 方法使私有字段可访问。

7. 通过反射动态获取字段的值:
   Object publicFieldValue = publicField.get(personInstance);
   Object privateFieldValue = privateField.get(personInstance);
   - 使用 `get` 方法获取字段的值。

  • Stream api

  • 动态代理设计模式

考点:不使用框架,掌握AOP基本概念

  • 控制反转与依赖注入(代码)

考点:了解控制反转的基本模式,用依赖注入编写程序

见主页

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

信息学奥赛初赛天天练-29-CSP-J2022阅读程序-掌握递归、递推、动态规划、二分与极值函数应用

PDF文档公众号回复关键字:20240619 2022 CSP-J 阅读程序2 阅读程序(判断题1.5分 选择题3分 共计40分 ) 01 #include <algorithm> 02 #include <iostream> 03 #include <limits> 04 05 using namespace std; 06 07 const int MAXN 105; 08 const int MAX…

使用docker离线制作es镜像,方便内网环境部署

1、自己在本地安装docker以及docker-compose 2、拉取elasticsearch镜像 docker pull elasticsearch:7.14.0 docker pull kibana:7.14.0 3、将拉取到的镜像打包到本地目录 docker save elasticsearch:7.14.0 -o /Users/yanjun.hou/es/elasticsearch-7.14.0.tar docker save kib…

application/x-www-form-urlencoded和json的区别

application/x-www-form-urlencoded 和 application/json 是两种不同的数据格式&#xff0c;常用于HTTP请求中传递数据。 它们各自的特点和使用场景如下&#xff1a; 1. application/x-www-form-urlencoded •特点&#xff1a;这是一种传统的表单提交时采用的编码类型&#x…

# 消息中间件 RocketMQ 高级功能和源码分析(五)

消息中间件 RocketMQ 高级功能和源码分析&#xff08;五&#xff09; 一、 消息中间件 RocketMQ 源码分析&#xff1a;NameServer 路由元数据 1、消息中间件 RocketMQ 中&#xff0c;NameServer 路由管理 NameServer 的主要作用是为消息的生产者和消息消费者提供关于主题 To…

相交链表(Leetcode)

题目分析&#xff1a; . - 力扣&#xff08;LeetCode&#xff09; 相交链表&#xff1a;首先我想到的第一个思路是&#xff1a;如图可知&#xff0c;A和B链表存在长度差&#xff0c;从左边一起遍历链表不好找交点&#xff0c;那我们就从后面开始找&#xff0c;但是这是单链表&…

惊天大瓜陈晓与陈妍希婚姻生变

惊天大瓜&#xff01;陈晓与陈妍希婚姻生变&#xff0c;疑似去年底已走向终点娱乐圈再次掀起波澜&#xff01;今日&#xff0c;知名狗仔曝光了一段视频&#xff0c;内容直指陈晓与陈妍希这对曾经的金童玉女疑似婚姻破裂。据悉&#xff0c;陈晓在去年底单方面向陈妍希提出了离婚…

AI 已经在污染互联网了。。赛博喂屎成为现实

大家好&#xff0c;我是程序员鱼皮。这两年 AI 发展势头迅猛&#xff0c;更好的性能、更低的成本、更优的效果&#xff0c;让 AI 这一曾经高高在上的技术也走入大众的视野&#xff0c;能够被我们大多数普通人轻松使用&#xff0c;无需理解复杂的技术和原理。 其中&#xff0c;…

Gin 详解

Gin 介绍 gin框架是一个基于go语言的轻量级web框架&#xff0c;它具有高效性、灵活性、易扩展性路由 gin框架使用的是定制版的httprouter 其路由原理是大量使用公共前缀的树结构&#xff0c;注册路由的过程就是构造前缀树的过程。 具有公共前缀的节点也共享一个公共父节点。…

【第19章】Vue实战篇之主页面

文章目录 前言一、代码1. 主界面代码2. App.vue 二、展示总结 前言 登录完成之后&#xff0c;应该自动跳转到主页面&#xff0c;接下来我们搭建主界面。 一、代码 1. 主界面代码 <script setup> import {Management,Promotion,UserFilled,User,Crop,EditPen,SwitchBut…

Linux搭建Minio单机环境

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; Linux搭建Minio单机环境 ⏱️ 创作时间&#xff1a; 2024年06月19日 目…

群辉DSM7下ZeroTier的安装

目录 一、起因 二、具体操作 1、添加组件源: 2、安装套件 3、开启ssh 4、连接ssh执行修补 5、手工启动ZeroTier 6、使用终端命令加入网络 7、审核通过该节点的加入 三、测试链接 1、PC端测试 2、手机APP测试 ZeroTier 是一款异地组网工具,它可以将不同网络环境的设…

鸿蒙开发通信与连接:【@ohos.bluetooth (蓝牙)】

蓝牙 说明&#xff1a; 本模块首批接口从API version 7开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 蓝牙模块提供了基础的传统蓝牙能力以及BLE的扫描、广播等功能。 导入模块 import bluetooth from ohos.bluetooth;bluetooth.enableBluet…

PCB设计隐藏的陷进

1、BGA芯片的开窗和过油设计。 加工工艺中&#xff0c;范式过孔都需要盖油设计&#xff0c;实心焊盘需要开窗设计&#xff0c;坚决不能盖油。 2、通孔设计的互联连通性 比如H3芯片的wifi设计&#xff0c;实际上是没有联通的&#xff0c;虽然四层板的中间层有焊盘&#xff0c;但…

复旦大学:将推出至少100门AI领域课程

B站&#xff1a;啥都会一点的研究生公众号&#xff1a;啥都会一点的研究生 最近AI圈又发生了啥&#xff1f; 复旦大学&#xff1a;将在下一个学年推出至少100门AI领域课程 复旦大学召开2024年招生培养政策发布会&#xff0c;公布今年本科招生培养政策亮点。从今年秋季学期开…

【黑马TS】学习资料Day4

五、在 React 中使用 TypeScript 现在&#xff0c;我们已经掌握了 TS 中基础类型、高级类型的使用了。但是&#xff0c;如果要在前端项目开发中使用 TS&#xff0c;还需要掌握 React、Vue、Angular 等这些库或框架中提供的 API 的类型&#xff0c;以及在 TS 中是如何使用的。 …

ARCGIS 如何对河流等线条图形进行Smooth处理——具有多个断点高阶版

1.线转点折点&#xff08;注意&#xff01;很重要&#xff0c;不是线转点&#xff09; 2.点转线步骤 ## 3 线的融合 2.1 新建Filed 》短精度类型》利用选择工具的 线文件。全选同一条河流点&#xff0c;进入Tabel的选择界面。给同一条河赋值同一个值。 大功告成&#xff01;…

upload-labs第十三关教程

upload-labs第十三关教程 第十三关一、源代码分析代码审计 二、绕过分析1&#xff09;0x00绕过a.上传eval.pngb.使用burpsuite进行拦截修改之前&#xff1a;修改之后&#xff1a;进入hex模块&#xff1a; c.放包上传成功&#xff1a; d.使用中国蚁剑进行连接 2&#xff09;%00绕…

amov无人机连接;+数据传输;啊啊啊啊啊

socket传输数据: 局域网连接 连接---通信(命令行直接;)--- 传输数据(socket)--传输内容:launch文件; qgc连接; 1.局域网下的通信 1.1 局域网 厂家提供的方式是通过Homer图数传工具(硬件)构建的amov局域网实现通信连接. 好处是通信距离足够长,支持150m;坏处是"局部&qu…

SpringBoot配置第三方专业缓存技术Redis

Redis缓存技术 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的内存中数据结构存储系统&#xff0c;通常用作数据库、缓存和消息中间件。它支持多种数据结构&#xff0c;如字符串、哈希表、列表、集合、有序集合等&#xff0c;并提供了丰富的功能和灵活的…

用Selenium自动化Web应用测试!

在开发和维护Web应用时&#xff0c;测试是确保应用正常运行的关键环节。手动测试不仅费时费力&#xff0c;而且容易出错。而通过使用Selenium&#xff0c;程序员可以轻松模拟用户交互、验证页面元素&#xff0c;从而自动化测试过程&#xff0c;提升测试效率和准确性。 解决的问…