Java核心知识点整理大全11-笔记

Java核心知识点整理大全-笔记_希斯奎的博客-CSDN博客

Java核心知识点整理大全2-笔记_希斯奎的博客-CSDN博客

Java核心知识点整理大全3-笔记_希斯奎的博客-CSDN博客

Java核心知识点整理大全4-笔记-CSDN博客

Java核心知识点整理大全5-笔记-CSDN博客

Java核心知识点整理大全6-笔记-CSDN博客

Java核心知识点整理大全7-笔记-CSDN博客

Java核心知识点整理大全8-笔记-CSDN博客

Java核心知识点整理大全9-笔记-CSDN博客

Java核心知识点整理大全10-笔记-CSDN博客

往期快速传送门👆:

目录

4.1.24. 什么是 AQS(抽象的队列同步器)

同步器的实现是 ABS 核心(state 资源状态计数)

ReentrantReadWriteLock 实现独占和共享两种方式

5. JAVA 基础

5.1.1. JAVA 异常分类及处理

5.1.1.1. 概念

5.1.1.2. 异常分类

Error

5.1.1.3. 异常的处理方式

5.1.1.4. Throw 和 throws 的区别:

位置不同

功能不同:

5.1.2. JAVA 反射

5.1.2.1. 动态语言

5.1.2.2. 反射机制概念 (运行状态中知道类所有的属性和方法)

5.1.2.3. 反射的应用场合

5.1.2.4. Java 反射 API

调用某个对象的 getClass()方法

调用某个类的 class 属性来获取该类对应的 Class 对象

使用 Class 类中的 forName()静态方法(最安全/性能最好)

5.1.2.7. 创建对象的两种方法

Class 对象的 newInstance()

调用 Constructor 对象的 newInstance()

5.1.3. JAVA 注解

5.1.3.1. 概念

5.1.3.2. 4 种标准元注解

@Documented 描述-javadoc

@Inherited 阐述了某个被标注的类型是被继承的

5.1.4. JAVA 内部类

5.1.4.1. 静态内部类

5.1.4.2. 成员内部类

5.1.4.3. 局部内部类(定义在方法中的类)

5.1.4.4. 匿名内部类

5.1.5. JAVA 泛型

泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本 质是参数化类型,也就是说所操作的数据类型被指定为一个参数。比如我们要写一个排序方法, 能够对整型数组、字符串数组甚至其他任何类型的数组进行排序,我们就可以使用 Java 泛型。 5.1.5.1. 泛型方法()

5.1.5.2. 泛型类

5.1.5.3. 类型通配符?

5.1.5.4. 类型擦除


4.1.24. 什么是 AQS(抽象的队列同步器)

AbstractQueuedSynchronizer 类如其名,抽象的队列式的同步器,AQS 定义了一套多线程访问 共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch。

它维护了一个 volatile int state(代表共享资源)和一个 FIFO 线程等待队列(多线程争用资源被 阻塞时会进入此队列)。这里 volatile 是核心关键词,具体 volatile 的语义,在此不述。state 的 访问方式有三种:

getState()

setState()

compareAndSetState()

AQS 定义两种资源共享方式

Exclusive 独占资源-ReentrantLock

Exclusive(独占,只有一个线程能执行,如 ReentrantLock)

Share 共享资源-Semaphore/CountDownLatch

Share(共享,多个线程可同时执行,如 Semaphore/CountDownLatch)。

AQS 只是一个框架,具体资源的获取/释放方式交由自定义同步器去实现,AQS 这里只定义了一个 接口,具体资源的获取交由自定义同步器去实现了(通过 state 的 get/set/CAS)之所以没有定义成 abstract ,是 因 为独 占模 式 下 只 用实现 tryAcquire-tryRelease ,而 共享 模 式 下 只用 实 现 tryAcquireShared-tryReleaseShared。如果都定义成abstract,那么每个模式也要去实现另一模 式下的接口。不同的自定义同步器争用共享资源的方式也不同。自定义同步器在实现时只需要实 现共享资源 state 的获取与释放方式即可,至于具体线程等待队列的维护(如获取资源失败入队/ 唤醒出队等),AQS 已经在顶层实现好了。自定义同步器实现时主要实现以下几种方法:

1.isHeldExclusively():该线程是否正在独占资源。只有用到 condition 才需要去实现它。

2.tryAcquire(int):独占方式。尝试获取资源,成功则返回 true,失败则返回 false。

3.tryRelease(int):独占方式。尝试释放资源,成功则返回 true,失败则返回 false。

4.tryAcquireShared(int):共享方式。尝试获取资源。负数表示失败;0 表示成功,但没有剩余 可用资源;正数表示成功,且有剩余资源。

5.tryReleaseShared(int):共享方式。尝试释放资源,如果释放后允许唤醒后续等待结点返回 true,否则返回 false。

同步器的实现是 ABS 核心(state 资源状态计数)

同步器的实现是 ABS 核心,以 ReentrantLock 为例,state 初始化为 0,表示未锁定状态。A 线程 lock()时,会调用 tryAcquire()独占该锁并将 state+1。此后,其他线程再 tryAcquire()时就会失 败,直到 A 线程 unlock()到 state=0(即释放锁)为止,其它线程才有机会获取该锁。当然,释放 锁之前,A 线程自己是可以重复获取此锁的(state 会累加),这就是可重入的概念。但要注意, 获取多少次就要释放多么次,这样才能保证 state 是能回到零态的。

以 CountDownLatch 以例,任务分为 N 个子线程去执行,state 也初始化为 N(注意 N 要与 线程个数一致)。这 N 个子线程是并行执行的,每个子线程执行完后 countDown()一次,state 会 CAS 减 1。等到所有子线程都执行完后(即 state=0),会 unpark()主调用线程,然后主调用线程 就会从 await()函数返回,继续后余动作。

ReentrantReadWriteLock 实现独占和共享两种方式

一般来说,自定义同步器要么是独占方法,要么是共享方式,他们也只需实现 tryAcquiretryRelease、tryAcquireShared-tryReleaseShared 中的一种即可。但 AQS 也支持自定义同步器 同时实现独占和共享两种方式,如 ReentrantReadWriteLock

5. JAVA 基础

5.1.1. JAVA 异常分类及处理

5.1.1.1. 概念

如果某个方法不能按照正常的途径完成任务,就可以通过另一种路径退出方法。在这种情况下 会抛出一个封装了错误信息的对象。此时,这个方法会立刻退出同时不返回任何值。另外,调用 这个方法的其他代码也无法继续执行,异常处理机制会将代码执行交给异常处理器。

5.1.1.2. 异常分类

Throwable 是 Java 语言中所有错误或异常的超类。下一层分为 Error 和 Exception

Error

1. Error 类是指 java 运行时系统的内部错误和资源耗尽错误。应用程序不会抛出该类对象。如果 出现了这样的错误,除了告知用户,剩下的就是尽力使程序安全的终止。 Exception(RuntimeException、CheckedException)

2. Exception 又 有 两 个 分 支 , 一 个 是 运 行 时 异 常 RuntimeException , 一 个 是 CheckedException。 RuntimeException 如 : NullPointerException 、 ClassCastException ; 一 个 是 检 查 异 常 CheckedException,如 I/O 错误导致的 IOException、SQLException。 RuntimeException 是 那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。 如果出现 RuntimeException,那么一 定是程序员的错误.

检查异常 CheckedException:一般是外部错误,这种异常都发生在编译阶段,Java 编译器会强 制程序去捕获此类异常,即会出现要求你把这段可能出现异常的程序进行 try catch,该类异常一 般包括几个方面:

1. 试图在文件尾部读取数据

2. 试图打开一个错误格式的 URL

3. 试图根据给定的字符串查找 class 对象,而这个字符串表示的类并不存在

5.1.1.3. 异常的处理方式

遇到问题不进行具体处理,而是继续抛给调用者 (throw,throws) 抛出异常有三种形式,一是 throw,一个 throws,还有一种系统自动抛异常。

public static void main(String[] args) {
 String s = "abc";
 if(s.equals("abc")) {
 throw new NumberFormatException();
 } else {
 System.out.println(s);
 }
}
int div(int a,int b) throws Exception{
return a/b;}


try catch 捕获异常针对性处理方式

5.1.1.4. Throw 和 throws 的区别:
位置不同

1. throws 用在函数上,后面跟的是异常类,可以跟多个;而 throw 用在函数内,后面跟的 是异常对象。

功能不同:

2. throws 用来声明异常,让调用者只知道该功能可能出现的问题,可以给出预先的处理方 式;throw 抛出具体的问题对象,执行到 throw,功能就已经结束了,跳转到调用者,并 将具体的问题对象抛给调用者。也就是说 throw 语句独立存在时,下面不要定义其他语 句,因为执行不到。

3. throws 表示出现异常的一种可能性,并不一定会发生这些异常;throw 则是抛出了异常, 执行 throw 则一定抛出了某种异常对象。

4. 两者都是消极处理异常的方式,只是抛出或者可能抛出异常,但是不会由函数去处理异 常,真正的处理异常由函数的上层调用处理。

5.1.2. JAVA 反射

5.1.2.1. 动态语言

动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结 构上的变化。比如常见的 JavaScript 就是动态语言,除此之外 Ruby,Python 等也属于动态语言, 而 C、C++则不属于动态语言。从反射角度说 JAVA 属于半动态语言。

5.1.2.2. 反射机制概念 (运行状态中知道类所有的属性和方法)

在 Java 中的反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法; 并且对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象方 法的功能成为 Java 语言的反射机制。

5.1.2.3. 反射的应用场合

编译时类型和运行时类型 在 Java 程序中许多对象在运行是都会出现两种类型:编译时类型和运行时类型。 编译时的类型由 声明对象时实用的类型来决定,运行时的类型由实际赋值给对象的类型决定 。如:

Person p=new Student();

其中编译时类型为 Person,运行时类型为 Student。

的编译时类型无法获取具体方法 程序在运行时还可能接收到外部传入的对象,该对象的编译时类型为 Object,但是程序有需要调用 该对象的运行时类型的方法。为了解决这些问题,程序需要在运行时发现对象和类的真实信息。 然而,如果编译时根本无法预知该对象和类属于哪些类,程序只能依靠运行时信息来发现该对象 和类的真实信息,此时就必须使用到反射了。

5.1.2.4. Java 反射 API

反射 API 用来生成 JVM 中的类、接口或则对象的信息。

1. Class 类:反射的核心类,可以获取类的属性,方法等信息。

2. Field 类:Java.lang.reflec 包中的类,表示类的成员变量,可以用来获取和设置类之中的属性 值。

3. Method 类: Java.lang.reflec 包中的类,表示类的方法,它可以用来获取类中的方法信息或 者执行方法。

4. Constructor 类: Java.lang.reflec 包中的类,表示类的构造方法

5.1.2.5. 反射使用步骤(获取 Class 对象、调用对象方法)

1. 获取想要操作的类的 Class 对象,他是反射的核心,通过 Class 对象我们可以任意调用类的方 法。

2. 调用 Class 类中的方法,既就是反射的使用阶段。

3. 使用反射 API 来操作这些信息。

5.1.2.6. 获取 Class 对象的 3 种方法

调用某个对象的 getClass()方法

Person p=new Person();

Class clazz=p.getClass();

调用某个类的 class 属性来获取该类对应的 Class 对象

Class clazz=Person.class;

使用 Class 类中的 forName()静态方法(最安全/性能最好)

Class clazz=Class.forName("类的全路径"); (最常用)

当我们获得了想要操作的类的 Class 对象后,可以通过 Class 类中的方法获取并查看该类中的方法 和属性。

        //获取 Person 类的 Class 对象
         Class clazz=Class.forName("reflection.Person");
        //获取 Person 类的所有方法信息
         Method[] method=clazz.getDeclaredMethods()
         for(Method m:method){
             System.out.println(m.toString());
         }
         //获取 Person 类的所有成员属性信息
         Field[] field=clazz.getDeclaredFields();
         for(Field f:field){
             System.out.println(f.toString());
         }
         //获取 Person 类的所有构造方法信息
         Constructor[] constructor=clazz.getDeclaredConstructors();
         for(Constructor c:constructor){
             System.out.println(c.toString());
         }

5.1.2.7. 创建对象的两种方法

Class 对象的 newInstance()

1. 使用 Class 对象的 newInstance()方法来创建该 Class 对象对应类的实例,但是这种方法要求 该 Class 对象对应的类有默认的空构造器。

调用 Constructor 对象的 newInstance()

2. 先使用 Class 对象获取指定的 Constructor 对象,再调用 Constructor 对象的 newInstance() 方法来创建 Class 对象对应类的实例,通过这种方法可以选定构造方法创建实例。

//获取 Person 类的 Class 对象
 Class clazz=Class.forName("reflection.Person");
 //使用.newInstane 方法创建对象
 Person p=(Person) clazz.newInstance();
//获取构造方法并创建对象
 Constructor c=clazz.getDeclaredConstructor(String.class,String.class,int.class);
 //创建对象并设置属性
Person p1=(Person) c.newInstance("李四","男",20);

5.1.3. JAVA 注解

5.1.3.1. 概念

Annotation(注解)是 Java 提供的一种对元程序中元素关联信息和元数据(metadata)的途径 和方法。Annatation(注解)是一个接口,程序可以通过反射来获取指定程序中元素的 Annotation 对象,然后通过该 Annotation 对象来获取注解中的元数据信息。

5.1.3.2. 4 种标准元注解

元注解的作用是负责注解其他注解。 Java5.0 定义了 4 个标准的 meta-annotation 类型,它们被 用来提供对其它 annotation 类型作说明。

@Target 修饰的对象范围 @Target说明了Annotation所修饰的对象范围: Annotation可被用于 packages、types(类、 接口、枚举、Annotation 类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数 和本地变量(如循环变量、catch 参数)。在 Annotation 类型的声明中使用了 target 可更加明晰 其修饰的目标

@Retention 定义 被保留的时间长短

Retention 定义了该 Annotation 被保留的时间长短:表示需要在什么级别保存注解信息,用于描 述注解的生命周期(即:被描述的注解在什么范围内有效),取值(RetentionPoicy)由:

 SOURCE:在源文件中有效(即源文件保留)

  CLASS:在 class 文件中有效(即 class 保留)

 RUNTIME:在运行时有效(即运行时保留)

@Documented 描述-javadoc

@ Documented 用于描述其它类型的 annotation 应该被作为被标注的程序成员的公共 API,因 此可以被例如 javadoc 此类的工具文档化。

@Inherited 阐述了某个被标注的类型是被继承的

@Inherited 元注解是一个标记注解,@Inherited 阐述了某个被标注的类型是被继承的。如果一 个使用了@Inherited 修饰的 annotation 类型被用于一个 class,则这个 annotation 将被用于该 class 的子类。

5.1.3.3. 注解处理器

如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了。使用注解的过程中, 很重要的一部分就是创建于使用注解处理器。Java SE5 扩展了反射机制的 API,以帮助程序员快速 的构造自定义注解处理器。下面实现一个注解处理器。

 /1:*** 定义注解*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitProvider {
 /**供应商编号*/
public int id() default -1;
/*** 供应商名称*/
 public String name() default "";
/** * 供应商地址*/
 public String address() default "";
}
//2:注解使用
public class Apple {
 @FruitProvider(id = 1, name = "陕西红富士集团", address = "陕西省西安市延安路")
 private String appleProvider;
 public void setAppleProvider(String appleProvider) {
 this.appleProvider = appleProvider;
 }
 public String getAppleProvider() {
 return appleProvider;
 }
}
/3:*********** 注解处理器 ***************/
public class FruitInfoUtil {
 public static void getFruitInfo(Class<?> clazz) {
 String strFruitProvicer = "供应商信息:";
 Field[] fields = clazz.getDeclaredFields();//通过反射获取处理注解
 for (Field field : fields) {
 if (field.isAnnotationPresent(FruitProvider.class)) {
 FruitProvider fruitProvider = (FruitProvider) field.getAnnotation(FruitProvider.class);
//注解信息的处理地方
strFruitProvicer = " 供应商编号:" + fruitProvider.id() + " 供应商名称:"
 + fruitProvider.name() + " 供应商地址:"+ fruitProvider.address();
 System.out.println(strFruitProvicer);
 }
 }
 }
}
public class FruitRun {
 public static void main(String[] args) {
 FruitInfoUtil.getFruitInfo(Apple.class);
/***********输出结果***************/
// 供应商编号:1 供应商名称:陕西红富士集团 供应商地址:陕西省西安市延
 }
}


5.1.4. JAVA 内部类

Java 类中不仅可以定义变量和方法,还可以定义类,这样定义在类内部的类就被称为内部类。根 据定义的方式不同,内部类分为静态内部类,成员内部类,局部内部类,匿名内部类四种。

5.1.4.1. 静态内部类

定义在类内部的静态类,就是静态内部类。

public class Out {
 private static int a;
 private int b;
 public static class Inner {
 public void print() {
 System.out.println(a);
 }
 }
}


1. 静态内部类可以访问外部类所有的静态变量和方法,即使是 private 的也一样。

2. 静态内部类和一般类一致,可以定义静态变量、方法,构造方法等。

3. 其它类使用静态内部类需要使用“外部类.静态内部类”方式,如下所示:Out.Inner inner = new Out.Inner();inner.print();

4. Java集合类HashMap内部就有一个静态内部类Entry。Entry是HashMap存放元素的抽象, HashMap 内部维护 Entry 数组用了存放元素,但是 Entry 对使用者是透明的。像这种和外部 类关系密切的,且不依赖外部类实例的,都可以使用静态内部类。

5.1.4.2. 成员内部类

定义在类内部的非静态类,就是成员内部类。成员内部类不能定义静态方法和变量(final 修饰的 除外)。这是因为成员内部类是非静态的,类初始化的时候先初始化静态成员,如果允许成员内 部类定义静态变量,那么成员内部类的静态变量初始化顺序是有歧义的。

 public class Out {
 private static int a;
 private int b;
 public class Inner {
 public void print() {
 System.out.println(a);
 System.out.println(b);
 }
 }
}

5.1.4.3. 局部内部类(定义在方法中的类)

定义在方法中的类,就是局部类。如果一个类只在某个方法中使用,则可以考虑使用局部类。

 public class Out {
     private static int a;
     private int b;
     public void test(final int c) {
         final int d = 1;
         class Inner {
         public void print() {
             System.out.println(c);
         }
     }
 }

5.1.4.4. 匿名内部类

(要继承一个父类或者实现一个接口、直接使用 new 来生成一个对象的引用)

匿名内部类我们必须要继承一个父类或者实现一个接口,当然也仅能只继承一个父类或者实现一 个接口。同时它也是没有 class 关键字,这是因为匿名内部类是直接使用 new 来生成一个对象的引 用。

public abstract class Bird {
 private String name;
 public String getName() {
 return name;
 }
 public void setName(String name) {
 this.name = name;
 }
 public abstract int fly();
}
public class Test {
 public void test(Bird bird){
 System.out.println(bird.getName() + "能够飞 " + bird.fly() + "米");
 }
 public static void main(String[] args) {
 Test test = new Test();
 test.test(new Bird() {
 public int fly() {
 return 10000;
 }
 public String getName() {
 return "大雁";
 }
 });
 }
}

5.1.5. JAVA 泛型

泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本 质是参数化类型,也就是说所操作的数据类型被指定为一个参数。比如我们要写一个排序方法, 能够对整型数组、字符串数组甚至其他任何类型的数组进行排序,我们就可以使用 Java 泛型。 5.1.5.1. 泛型方法()

你可以写一个泛型方法,该方法在调用时可以接收不同类型的参数。根据传递给泛型方法的参数 类型,编译器适当地处理每一个方法调用。

 // 泛型方法 printArray
 public static < E > void printArray( E[] inputArray )
 {
     for ( E element : inputArray ){
         System.out.printf( "%s ", element );
     }
 }


1. 表示该通配符所代表的类型是 T 类型的子类。

2. 表示该通配符所代表的类型是 T 类型的父类。

5.1.5.2. 泛型类

泛型类的声明和非泛型类的声明类似,除了在类名后面添加了类型参数声明部分。和泛型方法一 样,泛型类的类型参数声明部分也包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数, 也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。因为他们接受一个或多个参数, 这些类被称为参数化的类或参数化的类型。

public class Box<T> {
     private T t;
     public void add(T t) {
     this.t = t;
     }
     public T get() {
     return t;
 }

5.1.5.3. 类型通配符?

类型通配符一般是使用 ? 代 替 具 体 的 类 型 参 数 。 例 如 List 在逻辑上是 List,List 等所有 List的父类。

5.1.5.4. 类型擦除

Java 中的泛型基本上都是在编译器这个层次来实现的。在生成的 Java 字节代码中是不包含泛 型中的类型信息的。使用泛型的时候加上的类型参数,会被编译器在编译的时候去掉。这个 过程就称为类型擦除。如在代码中定义的 List和 List等类型,在编译之后 都会变成 List。JVM 看到的只是 List,而由泛型附加的类型信息对 JVM 来说是不可见的。 类型擦除的基本过程也比较简单,首先是找到用来替换类型参数的具体类。这个具体类一般 是 Object。如果指定了类型参数的上界的话,则使用这个上界。把代码中的类型参数都替换 成具体的类。


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

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

相关文章

线性代数的艺术

推荐一本日本网友Kenji Hiranabe写的《线性代数的艺术》。这本书是基于MIT大牛Gilbert Strang教授的《每个人的线性代数》制作的。 虽然《线性代数的艺术》这本书仅仅只有12页的内容&#xff0c;就把线性代数的重点全画完了&#xff0c;清晰明了。 《线性代数的艺术》PDF版本&…

linux高级篇基础理论六(firewalld,防火墙类型,,区域,服务端口,富语言)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️不能因为人生的道路坎坷,就使自己的身躯变得弯曲;不能因为生活的历程漫长,就使求索的 脚步迟缓。 ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xff1a;云计算技…

010 OpenCV中的4种平滑滤波

目录 一、环境 二、平滑滤波 2.1、均值滤波 2.2、高斯滤波 2.3、中值滤波 2.4、双边滤波 三、完整代码 一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、平滑滤波 2.1、均值滤波 在OpenCV库中&#xff0c;blur函数是一种简…

【精选】框架初探篇之——MyBatis入门必知【面试常问】

什么是MyBatis? MyBatis是一个半自动的ORM框架&#xff0c;其本质是对JDBC的封装。使用MyBatis不需要写JDBC代码&#xff0c;但需要程序员编写SQL语句。之前是apache的一个开源项目iBatis&#xff0c;2010年改名为MyBatis。 补充&#xff1a; Hibernate也是一款持久层ORM框架&…

文章解读与仿真程序复现思路——电工技术学报EI\CSCD\北大核心《面向差异化电源成本结构的容量市场机制设计》

这个文章标题涉及到容量市场机制设计&#xff0c;着重考虑了电源成本结构的差异性。下面对标题中的关键词进行解读&#xff1a; 面向&#xff08;Facing&#xff09;&#xff1a; 表示该容量市场机制设计是以某种方向、取向或目标为基础的。在这里&#xff0c;可能指的是设计是…

第五天 用Python批量处理Excel文件,实现自动化办公

用Python批量处理Excel文件&#xff0c;实现自动化办公 一、具体需求 有以下N个表&#xff0c;每个表的结构一样&#xff0c;如下&#xff1a; 需要把所有表数据汇总&#xff0c;把每个人的得分、积分分别加起来&#xff0c;然后按总积分排名&#xff0c;总积分一致时&#xff…

Flutter学习(四)如何取消listview的越界效果

背景 在flutter的开发过程中&#xff0c;ListView是很常见的一个组件&#xff0c;但是&#xff0c;由于ListView的某些自带的体验&#xff0c;导致不太好的用户体验。例如ListView中&#xff0c;滑动到顶部或者底部的时候&#xff0c;再次滑动&#xff0c;会有越界的效果&…

Keil工程打开发现目标芯片无法选择解决方案

买了一个开发板&#xff0c;配套有一些底层驱动的例程&#xff0c;打开后发现目标芯片无法选择&#xff0c;对应的下载Flash FLM文件也无法选择。从提示框中可以知道所提供的例程是Keil4的例程&#xff0c;我电脑上安装的Keil版本是Keil版本&#xff0c;估计是这个原因导致工程…

机器人制作开源方案 | 智能图书搬运机器人

作者&#xff1a;张宸豪 戚益凡 陈世达 高梓钦 谭清 单位&#xff1a;华北科技学院 指导老师&#xff1a;罗建国 韩红利 阅读对于学生的重要性毋庸置疑&#xff0c;因此图书馆是一个校园非常重要的组成部分&#xff0c;图书馆的书籍借阅&#xff0c;能为学生提供非常大的…

人工智能对网络安全的影响越来越大

如果问当前IT行业最热门的话题是什么&#xff0c;很少有人会回答除了人工智能&#xff08;AI&#xff09;之外的任何话题。 在不到 12 个月的时间里&#xff0c;人工智能已经从一项只有 IT 专业人员才能理解的技术发展成为从小学生到作家、程序员和艺术家的每个人都使用的工具…

基于单片机设计的大气气压检测装置(STC89C52+BMP180实现)

一、前言 本项目设计一个大气气压检测装置&#xff0c;该装置以单片机为基础&#xff0c;采用STC89C52作为核心控制芯片&#xff0c;结合BMP180模块作为气压传感器。大气气压&#xff0c;也就是由气体重力在大气层中产生的压力&#xff0c;其变化与天气预报、气象观测以及高度…

Python Pyvis库详解:创建交互式网络图

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是涛哥&#xff0c;今天为大家分享 Python Pyvis库详解&#xff1a;创建交互式网络图&#xff0c;文章4000字&#xff0c;阅读大约15分钟&#xff0c;大家enjoy~~ Pyvis是一个基于JavaScript库NetworkX的Pytho…

【matlab程序】南海土台风画法

【matlab程序】南海土台风画法 图片 往期推荐 图片 【python海洋专题一】查看数据nc文件的属性并输出属性到txt文件 【python海洋专题二】读取水深nc文件并水深地形图 【python海洋专题三】图像修饰之画布和坐标轴 【Python海洋专题四】之水深地图图像修饰 【Python海洋专…

U-boot(四):start_armboot

本文主要探讨210的uboot启动的第二阶段&#xff0c;主要函数为start_armboot。 uboot 一阶段初始化SoC内部部件(看门狗、时钟等),初始化DDR,重定位 二阶段初始化其余硬件(iNand、网卡芯片)以及命令、环境变量等 启动打印硬件信息,进入bootdelay,读秒完后执行bootc…

二十一、文档操作

目录 一、添加文档 1、编写代码 2、运行并查看 二、查询文档 1、编写代码 2、运行并查看 三、删除文档 1、编写代码 2、运行并查看 四、修改文档 方式一&#xff1a;全量修改&#xff0c;会删除旧文档&#xff0c;添加新文档 方式二&#xff1a;局部修改。增量修改&…

nodejs 如何将 Buffer 数据转为 String

问题说明 使用webSocket的时候出现了一个问题&#xff0c;前端小程序和nodejs后端建立websocket连接后&#xff0c;使用send方法发送到后端为buffer格式&#xff0c;以下为我前后端代码 1、前端小程序代码 //创建webSocket连接 const socket uni.connectSocket({url: wss…

工作中死循环害死人

背景&#xff1a;研发的一段代码&#xff0c;循环一直没有跳出&#xff0c;导致其他依赖逻辑有问题&#xff0c;生产事故导致9万左右数据不正常。 这里while&#xff08;true&#xff09;真的不要轻易用 &#xff0c;后来研发改动限制mysql的id切分步长&#xff0c;控制不会有数…

FreeRTOS源码阅读笔记4--semphr.h

信号量是特殊的队列--无法存储消息的队列&#xff0c;相关的接口函数声明在semphr.h中&#xff0c;通过宏定义替换队列函数实现。 4.1创建二值信号量xSemaphoreCreateBinary() 4.1.1函数原型 queueQUEUE_TYPE_BINARY_SEMAPHORE&#xff1a;一个宏&#xff0c;表示创建队列的…

gitt开源项目的意义,公司为什么会对在gitt上有开源项目的人更大机会

Git是一种分布式版本控制系统&#xff0c;它可以帮助程序员管理代码的历史版本和协同工作。同时&#xff0c;Git也成为了开源项目的主要托管平台之一。Git的开源项目意义重大&#xff0c;因为这种开源项目托管平台可以帮助开发者将代码和项目分享给全球的开发者&#xff0c;并且…

node版本管理工具-nvm

1、 下载地址 https://github.com/coreybutler/nvm-windows/releases/tag/1.1.11 2、 选择安装地址不能有空格&#xff0c;中文 3、 使用命令