Java随笔1

 1.编程中组件的概念:

在编程中,组件(Component)通常指的是一种可重用的、模块化的代码单元,它封装了特定的功能或用户界面元素,并提供了与其他代码进行交互的接口。组件可以看作是对数据和方法的简单封装,具有自己的属性和方法。属性是组件数据的简单访问者,而方法则是组件的一些简单而可见的功能。

在不同的编程语言和框架中,组件的具体实现方式可能有所不同。例如,在C++ Builder中,一个组件就是一个从TComponent派生出来的特定对象;在Delphi中,它被称为部件;而在Visual BASIC中,它被称为控件。

使用组件的主要优点是可以提高代码的可重用性、可维护性和灵活性。通过将复杂的应用程序分解为一系列相互关联的组件,程序员可以更容易地管理和维护代码,同时也可以更方便地进行团队协作和代码共享。此外,组件还可以使应用程序的架构更加清晰和模块化,从而更容易进行扩展和定制。

需要注意的是,虽然组件可以提高代码的效率和可维护性,但过度使用或不当使用组件也可能导致性能损失或结构不合理等问题。因此,在使用组件时需要根据具体情况进行权衡和选择。

2.Java中源文件中可以有多个类,但为什么最多只能有一个public类?

3.脚手架的概念

在编程中,脚手架(scaffold)是一个预设的项目结构或代码模板,用于快速搭建起一个新的项目。脚手架可以提供一套约定俗成的目录结构、文件模板以及基本代码,从而帮助开发人员快速开始一个新的项目,减少繁杂的配置和初始化工作。

使用脚手架可以提高开发效率,节省开发人员的时间和精力。一些常见的脚手架工具包括:

1. Angular CLI:用于快速创建Angular项目的命令行工具;
2. Create React App:用于快速创建React项目的脚手架工具;
3. Express Generator:用于生成Express.js应用的代码模板;
4. Vue CLI:用于快速创建Vue.js项目的脚手架工具。

通过使用这些脚手架工具,开发人员可以更加专注于业务逻辑的实现,而不需要手动配置和搭建项目的基础结构。同时,脚手架也提供了一些常用的功能和依赖库的集成,使得开发过程更加高效和规范化。

4.什么是异步操作

异步操作指的是一种非阻塞性的操作方式,它允许程序在执行某个任务时,不必等待该任务完成,而是可以继续执行其他任务,或者执行一些回调函数。这种方式可以提高程序的响应性和效率,因为它避免了因为等待某个任务完成而导致的程序阻塞。

在Vue中,异步操作通常用于处理一些需要花费较长时间完成的任务,例如网络请求、定时器、文件读写等。Vue提供了多种方式来处理异步操作,例如使用axios进行网络请求、使用setTimeout设置定时器、使用Promise处理异步任务等。

需要注意的是,异步操作可能会导致一些问题,例如回调地狱(Callback Hell)、竞态条件(Race Condition)等。因此,在使用异步操作时,需要仔细考虑程序的逻辑和流程,以避免出现这些问题。同时,也需要注意错误处理和异常捕获,以确保程序的稳定性和可靠性。

5.为什么异步操作可以确保页面不会因为等待后端数据而白屏

异步操作可以确保页面不会因为等待后端数据而白屏,主要归功于它们非阻塞性的特性。以下是具体的原因:

  1. 非阻塞主线程:当执行一个异步操作时,如网络请求,它不会阻塞主线程的执行。这意味着,即使后端数据还没有返回,浏览器的主线程也可以继续执行其他任务,例如渲染页面、处理用户交互等。

  2. 事件循环:JavaScript是单线程的,但是它使用了一个事件循环(Event Loop)来处理异步操作。当异步操作完成时,它会把一个回调函数放入事件队列中。只有当主线程空闲时,事件循环才会从队列中取出事件并执行相应的回调函数。这种方式允许程序在等待异步操作完成时继续执行其他任务。

  3. 更好的用户体验:由于页面不会因为等待后端数据而阻塞,用户可以继续浏览页面、与页面交互,甚至进行其他操作,如滚动页面、点击按钮等。这种无延迟的交互给用户一种更流畅的体验。

  4. 防止线程死锁:在多线程环境中,如果多个线程等待同一个资源,可能会导致线程死锁。而在JavaScript的单线程环境中,由于异步操作的存在,这种死锁问题被避免了。

  5. 更好的资源利用:如果所有操作都是同步的,那么浏览器可能会花费大量时间等待后端响应,而在此期间,其他可以并行处理的任务将被阻塞。异步操作允许浏览器在等待一个任务完成时,处理其他任务,从而更有效地利用系统资源。

在Web开发中,通过合理地使用异步操作,可以显著提高应用程序的性能和用户体验。这也是现代Web开发中经常使用的技术,如Ajax、Fetch API、Axios等,它们都是基于异步操作来优化Web应用的性能。

6.Docker中镜像的概念

在 Docker 中,镜像(Image)是用于创建容器(Container)的静态文件,它包含了运行容器所需的所有文件系统内容、库、工具以及设置。镜像是一个只读的文件,它由多个层(Layers)组成。每一层都包含了文件系统的一部分,以及定义如何改变文件系统内容的指令。当你运行一个容器时,Docker 引擎会从镜像中创建一个可写容器层作为容器的文件系统,并在其上添加一个读写层,使得容器可以被修改而不影响原始镜像。

镜像可以通过 Dockerfile 来创建,Dockerfile 是一个文本文件,包含了创建镜像所需的指令,比如基于哪个基础镜像、安装什么软件、运行什么命令等。通过执行 `docker build` 命令可以根据 Dockerfile 创建镜像。

镜像通过标签(Tag)来管理,标签一般用来指定镜像的版本号或者其他特征。比如一个镜像可以有多个不同的标签,通常包括最新版本、特定版本、开发版本等。通过执行 `docker tag` 命令可以为镜像添加或修改标签。

总的来说,镜像是 Docker 容器的基础,它定义了容器的文件系统结构和运行环境,用户可以通过构建、拉取、上传和分享镜像来方便地部署和管理应用程序。

7.ip地址中的端口号的作用

IP地址中的端口号用于标识一个网络通信中的特定应用程序或服务。在计算机网络中,一个IP地址可以识别网络中的一台设备,而端口号则可以识别这台设备上运行的具体应用程序。通过将数据包发送到目标设备的特定端口,发送方和接收方可以确保数据包正确地传递给相应的应用程序,从而实现数据交换。常见的端口号包括HTTP的80端口、HTTPS的443端口、FTP的21端口等,不同的应用程序使用不同的端口号来提供服务。

IP地址用于标识计算机网络中的不同设备,类似于人的身份证号码。而端口号则用于标识计算机网络中的不同进程或应用程序,类似于人的不同手机号码。端口号是一个2字节16位的整数,它的主要作用包括:

  1. 标识进程:告诉操作系统,当前的这个数据要交给哪一个进程来处理。
  2. 实现网络通信:在计算机网络中,端口号是用于标识应用程序或进程的数字标识符。它们允许在同一个IP地址下运行多个应用程序或服务,并确保数据包被正确地发送到正确的应用程序或服务。
  3. 提高网络通信效率、可靠性和安全性:通过为每个应用程序或服务分配唯一的数字标识符,网络中的端口号能够实现这一目标。

8.Map中的of方法

在Java 8及以后的版本中,Map接口提供了一个静态方法of,它允许你以更简洁的方式创建不可变的Map实例。这是一个非常实用的方法,尤其是在你需要创建一个小的、不可变的Map时。

Map.of方法有几个重载版本,可以接受不同数量的键值对参数。

以下是一些示例:

  1. Map.of(K key1, V value1):创建一个只包含一个键值对的Map

Map<String, Integer> map = Map.of("one", 1); 
System.out.println(map); // 输出:{one=1}
  1. Map.of(K key1, V value1, K key2, V value2, ...):创建一个包含多个键值对的Map。注意,这种方法最多只接受10个键值对。

Map<String, Integer> map = Map.of("one", 1, "two", 2, "three", 3); 
System.out.println(map); // 输出:{one=1, two=2, three=3}

需要注意的是,使用Map.of创建的Map实例是不可变的。这意味着一旦创建,你就不能向其中添加或删除键值对。如果尝试这样做,将会抛出UnsupportedOperationException

这种方法在你需要创建一个常量映射或者一个不需要修改的映射时非常有用。它也可以用于创建配置映射,这些映射在应用程序的生命周期中不会改变。

如果你需要一个可以修改的Map,你可以使用new HashMap<>()Map.newHashMap()(取决于你的具体需求和Java版本)来创建一个新的HashMap实例。

9.代理模式

我们先了解一下代理模式:

在开发中,当我们要访问目标类时,不是直接访问目标类,而是访问器代理类。通过代理类调用目标类完成操作。简单来说就是:把直接访问变为间接访问。

这样做的最大好处就是:我们可以在代理类调用目标类之前和之后去添加一些预处理和后处理操作。来扩展一些不属于目标类的功能。

比如说:我们可以在方法开始和结束前记录日志:在方法执行前进行额外的参数校验,进行事务管理,如手动提交、权限校验等。

代理模式是一种设计思想,实际实现方式上有静态代理动态代理之分。

 9.1.静态代理

静态代理:在程序运行前,我们就给目标类编写了其代理类的代码,然后编译了其代理类。这样在程序运行之前,我们就已经生成了它代理类的字节码文件,即我们事先编写,然后编译,在程序运行的时候直接去读这些字节码文件进行运行。

例:定义静态代理类

使用静态代理类:

这里使用student调用dowork和使用staticProxy调用dowork效果不一样,后者在原有功能基础上增加了调用方法前和调用方法后的打印功能。

这就我们代理模式的最大特点:它可以控制对原有对象的访问。在原有对象的访问的基础上去做一些额外的能力。

这些类已经被编译为字节码文件了,我们可以拿这几个文件去任何一个机器上执行。

如果是静态代理的话,我们需要编写一个与其绑定的代理类。这个类会被编译成字节码文件,然后再运行。

9.2.动态代理

而如果是动态代理的话,我们就不需要是献给目标去编写代理代码,而是在运行中通过反射自动生成代理对象!

在Java中,动态代理主要通过两种机制实现:JDK动态代理和CGLIB动态代理。

9.2.1JDK动态代理

JDK动态代理基于Java的反射机制,它只能为接口创建代理对象。要使用JDK动态代理,需要实现java.lang.reflect.InvocationHandler接口,并重写其invoke()方法。invoke()方法会在代理对象上的方法被调用时被执行。

例:

这里最核心的就是通过Proxy.newProxyInstance方法去生成动态代理类以及访问它的实例。

使用动态代理:

这里dynamicProxyList就是动态代理对象,它会自动调用动态代理类DynamicProxy重写的invoke方法,打印两次开始执行是因为调用了dynamicProxyList的toString方法。

在这里我们并没有编写ArrayList的代理类,但是却把它代理了,这就是动态代理的魅力。

问题来了:这个它的动态代理类生成在哪里呢?我们怎么没看见呢?

原理:

@CallerSensitive
    public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) {
        Objects.requireNonNull(h);
        Class<?> caller = System.getSecurityManager() == null ? null : Reflection.getCallerClass();
        Constructor<?> cons = getProxyConstructor(caller, loader, interfaces);
        return newProxyInstance(caller, cons, h);
    }
caller

        caller是一个内部类,用于代表创建代理实例的调用者。这个caller类实际上是一个

InvocationHandler的实现,它负责在代理实例上转发方法调用。

newProxyInstance方法的实现中,caller类并不是直接作为参数传递给newProxyInstance方法的,而是在内部被创建和使用。这个类通常是一个匿名内部类,它的主要作用是持有对原始InvocationHandler的引用,并将方法调用转发给该处理器。

cons

        在 Java 中,`Proxy.newProxyInstance()` 方法的源码中的 `cons` 表示 `constructor`,它用来表示代理类的构造函数。在 `Proxy.newProxyInstance()` 方法内部,会调用代理类的构造函数来创建实际的代理对象。

具体来说,`Proxy.newProxyInstance()` 方法的源码中会根据传入的类加载器(`ClassLoader`)、接口数组(`Class[]`)和 `InvocationHandler` 对象来动态生成代理类,并通过代理类的构造函数来创建代理对象。生成的代理类会实现传入的接口,并将接口中的方法调用委托给传入的 `InvocationHandler` 对象来处理。

代理类的构造函数在代理对象实例化时会被调用,并在内部完成代理对象的初始化工作,比如将 `InvocationHandler` 对象赋值给代理对象。

因此,在 `Proxy.newProxyInstance()` 方法源码中的 `cons` 所指的就是代理类的构造函数,用来创建代理对象并完成代理对象的初始化工作。

实现思路:代理类(运行时生成的代理类)和被代理类(这里就是ArrayList)实现同一个接口,有被代理类的所有方法,然后代理类把被代理类所有方法原先的调用通通先去调用代理类的InvocationHandler(也就是我们自己写的那个代理类)

在这个例子中共有32个Method(方法)对象,对应的就是List的32个方法。

如这里某个方法进行代理,我们可以看到这里它调用的是h的invoke方法,这个h就是我们之前写的InvocationHandler的实现类(DynamicProxy(我们自己写的实现Invocation的动态代理类)和这个$Proxy0代理类是两个东西!!!)  这样目标类的所有方法都会走我们写的那个通用代理类(DynamicProxy)的invoke方法。

10.newProxyInstance方法

newProxyInstance 方法是 Java 反射 API 中的一个静态方法,用于在运行时动态地创建一个代理实例。这个方法属于 java.lang.reflect.Proxy 类。当你想要为一个接口动态地生成一个代理类并创建其实例时,你可以使用这个方法。

newProxyInstance 方法的签名如下:

public static Object newProxyInstance(  
    ClassLoader loader,  
    Class<?>[] interfaces,  
    InvocationHandler h  
)

这个方法接受三个参数:

  1. ClassLoader loader:类加载器,用于加载代理类。通常,你可以传递目标对象(被代理的对象)的类加载器。

  2. Class<?>[] interfaces:一个接口数组,表示代理类要实现的接口。这些接口定义了代理实例可以调用的方法。

  3. InvocationHandler h:一个 InvocationHandler 实例,用于处理代理实例上的方法调用。当代理实例上的方法被调用时,invoke 方法会被执行。

newProxyInstance 方法返回一个实现了给定接口的代理实例,该实例将所有方法调用委托给指定的 InvocationHandler

下面是一个简单的例子,展示了如何通过动态代理使用 newProxyInstance 方法来创建一个代理实例:

import java.lang.reflect.InvocationHandler;  
import java.lang.reflect.Method;  
import java.lang.reflect.Proxy;  
  
interface MyInterface {  
    void doSomething();  
}  
  
class MyInvocationHandler implements InvocationHandler {  
    @Override  
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {  
        System.out.println("Before method call");  
        Object result = method.invoke(null, args); // 注意这里传入null,因为我们没有实现类,只是做演示  
        System.out.println("After method call");  
        return result;  
    }  
}  
  
public class Main {  
    public static void main(String[] args) {  
        // 创建InvocationHandler实例  
        MyInvocationHandler handler = new MyInvocationHandler();  
  
        // 使用newProxyInstance创建代理实例  
        MyInterface proxy = (MyInterface) Proxy.newProxyInstance(  
            MyInterface.class.getClassLoader(),  
            new Class<?>[] { MyInterface.class },  
            handler  
        );  
  
        // 调用代理实例的方法,会触发InvocationHandler的invoke方法  
        proxy.doSomething();  
    }  
}

在这个例子中,MyInvocationHandler 实现了 InvocationHandler 接口,并重写了 invoke 方法来添加额外的逻辑。newProxyInstance 方法被用来创建一个实现了 MyInterface 接口的代理实例,并将 MyInvocationHandler 实例作为处理器传递给它。当代理实例的 doSomething 方法被调用时,MyInvocationHandler.invoke 方法会被执行。

11.过滤器

基本介绍
        过滤器,顾名思义就是对事物进行过滤的,在Web中的过滤器,当然就是对请求进行过滤,我们使用过滤器,就可以对请求进行拦截,然后做相应的处理,实现许多特殊功能。如登录控制,权限管理,过滤敏感词汇等.

过滤器原理
        当我们使用过滤器时,过滤器会对游览器的请求进行过滤,过滤器可以动态的分为3个部分,1.放行之前的代码,2.放行,3.放行后的代码,这3个部分分别会发挥不同作用。

第一部分代码会对游览器请求进行第一次过滤,然后继续执行
第二部分代码就是将游览器请求放行,如果还有过滤器,那么就继续交给下一个过滤器
第三部分代码就是对返回的Web资源再次进行过滤处理
我们使用过滤器,也就是说,不止请求会经过过滤器,我们的响应也会经过过滤器。

12.拦截器

拦截器 是 SpringMVC 框架自己的,只有使用了 SpringMVC 框架的工程才能用。

作用:可以构成拦截器栈,完成特定功能。比如日志记录、登录判断、权限检查等作用。

好处:拦截器也可以让你将通用的代码模块化并作为可重用的类。

拦截器的应用:AOP、需要有一些业务逻辑(需要注入Bean等)

理解:
拦截器可以说相当于是个过滤器:就是把不想要的或不想显示的内容给过滤掉。拦截器可以抽象出一部分代码可以用来完善原来的方法。同时可以减轻代码冗余,提高重用率。
比如在登入一个页面时,如果要求用户密码、权限等的验证,就可以用自定义的拦截器进行密码验证和权限限制。对符合的登入者才跳转到正确页面。这样如果有新增权限的话,不用在action里修改任何代码,直接在interceptor里修改就行了。

拦截器执行流程:

(1)、程序先执行preHandle()方法,如果该方法的返回值为true,则程序会继续向下执行处理器中的方法,否则将不再向下执行;

(2)、在业务处理器(即控制器Controller类)处理完请求后,会执行postHandle()方法,然后会通过DispatcherServlet向客户端返回响应;

(3)、在DispatcherServlet处理完请求后,才会执行afterCompletion()方法。

13.拦截器和过滤器的区别

过滤器和拦截器的区别:

 ①拦截器是基于java的反射机制的,而过滤器是基于函数回调。
 ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
 ③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
 ④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
 ⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。     ⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。

触发时机

有个专业词语叫触发时机

1.过滤器和拦截器触发时间和地点不一样:

  过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。

总结:过滤器包裹住servlet,servlet包裹住拦截器。

如下图所示:

2.过滤器的触发时机是容器后,servlet之前,所以过滤器的doFilter(

ServletRequest request, ServletResponse response, FilterChain chain

)的入参是ServletRequest ,而不是httpservletrequest。因为过滤器是在httpservlet之前。

3.SpringMVC的机制是由同一个Servlet来分发请求给不同的Controller,其实这一步是在Servlet的service()方法中执行的。

4.,SpringMVC的机制是由同一个Servlet来分发请求给不同的Controller,其实这一步是在Servlet的service()方法中执行的。

5.SpringMVC的机制是由同一个Servlet来分发请求给不同的Controller,其实这一步是在Servlet的service()方法中执行的。

6.还有,拦截器是spring容器的,是spring支持的

总结:拦截器功在对请求权限鉴定方面确实很有用处,在我所参与的这个项目之中,第三方的远程调用每个请求都需要参与鉴定,所以这样做非常方便,而且他是很独立的逻辑,这样做让业务逻辑代码很干净。和框架的其他功能一样,原理很简单,使用起来也很简单,大致看了下SpringMVC这一部分的源码,其实还是比较容易理解的。

  我们项目中仅仅用到了preHandle这个方法,而未用其他的,框架提供了一个已经实现了拦截器接口的适配器类HandlerInterceptorAdapter,继承这个类然后重写一下需要用到的方法就行了,可以少几行代码,这种方式Java中很多地方都有体现。

14.监听器

一、Listener 监听器简介:

1.  Listener监听器是Javaweb的三大组件之一。Javaweb的三大组件分别是:servlet程序,filter过滤器,listener监听器。
2.  Listener是JavaEE的规范,就是接口。
3.  监听器的作用:用来监听某种事物的变化,然后通过回调函数,反馈给客户或者程序。
4.  监听器可以监听就是在application,session,request三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。
5.  Listener分类:JavaWeb中提供了8个监听器。
 

二、监听器的分类:
按照监听对象的划分,可以分为三种:

1.ServletContext监控:对应监控application内置对象的创建跟销毁.

        当web容器开启时,执行contextInitialized方法;当容器关闭或者重启时,执行contextDestroyed方法.实现方式:直接实现ServletContextListener接口。

2.HttpSession监控:对应监控session内置对象的创建和销毁。

  当打开一个新的页面时,开启一个session会话,执行sessionCreated方法;当页面关闭session过期时,或者容器关闭销毁时,执行sessionDestroyed方法实现方式:直接实现HttpSessionListener接口。

3.ServletRequest监控:对应监控request内置对象的创建和销毁。
        当访问某个页面时,出发一个request请求,执行requestInitialized方法;当页面关闭时,执行requestDestroyed方法。实现方式,直接实现ServletRequestListener接口。

三、监听器的用途

*监听器利用HttpServletLisener 统计在线人数

*加载初始化信息:利用ServletContextListener

*统计网站的访问量

*实现访问监控

15.ThreadLocal

ThreadLocal叫做线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的,也就是说该变量是当前线程独有的变量。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。

ThreadLoal 变量,线程局部变量,同一个 ThreadLocal 所包含的对象,在不同的 Thread 中有不同的副本。这里有几点需要注意:

因为每个 Thread 内有自己的实例副本,且该副本只能由当前 Thread 使用。这是也是 ThreadLocal 命名的由来。
既然每个 Thread 有自己的实例副本,且其它 Thread 不可访问,那就不存在多线程间共享的问题。
ThreadLocal 提供了线程本地的实例。它与普通变量的区别在于,每个使用该变量的线程都会初始化一个完全独立的实例副本。ThreadLocal 变量通常被private static修饰。当一个线程结束时,它所使用的所有 ThreadLocal 相对的实例副本都可被回收。

总的来说,ThreadLocal 适用于每个线程需要自己独立的实例且该实例需要在多个方法中被使用,也即变量在线程间隔离而在方法或类间共享的场景

ThreadLocal 适用于如下两种场景

1、每个线程需要有自己单独的实例
2、实例需要在多个方法中共享,但不希望被多线程共享


对于第一点,每个线程拥有自己实例,实现它的方式很多。例如可以在线程内部构建一个单独的实例。ThreadLoca 可以以非常方便的形式满足该需求。

对于第二点,可以在满足第一点(每个线程有自己的实例)的条件下,通过方法间引用传递的形式实现。ThreadLocal 使得代码耦合度更低,且实现更优雅。

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

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

相关文章

ADS基础操作篇2

上篇文章《ADS基础介绍篇1》,对ADS界面,常用小工具及自带设计模板进行了介绍。ADS使用非常方便,含大量的控件和仿真模板。这篇文章我们主要讲解ADS的基础操作,包含Workspace、原理图、symbol的创建,仿真结果查看及优化。 1. 新建Workspace 添加名称及路径后,点击create…

共享充电宝语音芯片ic方案支持远程4g无线更新语音

一、简介 共享充电宝语音芯片ic方案支持远程4g无线wifi蓝牙更新语音 共享充电宝已经是遍布在大街小巷的好产品&#xff0c;解决了携带充电宝麻烦的痛点 但是很多的共享充电宝在人机交互方便&#xff0c;还做得不够好&#xff0c;比如&#xff1a;借、还设备没有语音提示&…

基于SSM的计算机课程实验管理系统的设计与实现(源码)

| 博主介绍&#xff1a;✌程序员徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f44…

AI视频教程下载:用ChatGPT制作 YouTube视频的指南

课程大纲&#xff1a; 面向 YouTuber 的 ChatGPT YouTube关键词研究 YouTube标题 YouTube缩略图 YouTube社区帖子 组织您的 YouTube 视频 本课程将通过两个不同领域的YouTube视频&#xff0c;展示如何使用Chat GPT来创建关键词、标题、缩略图、描述和社区帖子。 关键词研…

【Linux网络】Https【下】{CA认证/证书的签发与认证/安全性/总结}

文章目录 1.引入证书【为方案五铺垫】1.1再谈https1.2SSL/TLS1.3CA机构1.4理解数字签名1.4继续铺垫1.5方案五服务端申请证书回顾一二三回顾方案四方案五过程寻找方案五的漏洞客⼾端对证书进⾏认证 2.查看证书2.1查看浏览器的受信任证书发布机构2.2中间⼈有没有可能篡改该证书2.…

Postman工具介绍与安装

一、Postman介绍 Postman 乃是一款对 HTTP 协议予以支持的接口调试及测试工具&#xff0c;其突出特性在于功能强大&#xff0c;并且使用简便、易用性良好。不管是开发人员开展接口调试工作&#xff0c;还是测试人员进行接口测试任务&#xff0c;Postman 均属于首选工具之一。 接…

会声会影2024中文旗舰免费版(Corel VideoStudio)下载安装包附带会声会影软件注册机

一、软件背景及版本概述 会声会影&#xff08;Corel VideoStudio&#xff09;是由加拿大Corel公司发布的一款视频编辑软件&#xff0c;该软件以其功能丰富、操作简便而广受好评。2024年版本在继承之前版本优点的基础上&#xff0c;进行了诸多创新和改进&#xff0c;为用户提供…

2万字干货:如何从0到1搭建一套会员体系(4)

开始本节前还是一样来个灵魂发问&#xff1a;为什么产品需要用户标签&#xff0c;或者用户标签有什么意义/价值&#xff1f; 某些业务场景下使用会员等级无法满足业务需要。比如新用户激活、老用户福利以及沉默客户唤醒等等。 用户等级划分的逻辑和维度有些局限性&#xff0c;…

java项目之共享汽车管理系统(springboot+mysql+vue)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的共享汽车管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 共享汽车管理系统的主要…

什么是数据恢复软件?数据恢复软件怎么下载使用?

“我一直在寻找一款出色的 PC Android数据恢复软件&#xff0c;我可以下载。有很多&#xff0c;但大多数都需要我付钱。你能推荐一个我可以免费下载的好书吗&#xff1f; 奇客数据恢复安卓版是恢复已删除或丢失的Android数据的最安全工具。免费下载奇客数据恢复安卓版下面尝试所…

一分钟带你了解什么是等保测评

等保测评&#xff0c;即网络安全等级保护测评&#xff0c;是依据国家信息安全等级保护制度规定&#xff0c;对信息系统进行安全技术测评和安全管理测评&#xff0c;以确定系统的安全保护水平是否达到预定的安全等级要求。以下是等保测评的相关知识点总结&#xff1a; 测评概述&…

Google: 在新知识上微调大语言模型是否会鼓励产生幻觉?

摘要 当大型语言模型通过监督式微调进行对齐时,它们可能会遇到在预训练期间没有获得的新事实信息。人们经常推测,这可能会教导模型产生事实上不正确的回应的行为,因为模型被训练成生成没有基于其预先存在的知识的事实。在这项工作中,Google研究了这种暴露在新知识下对微调后模…

PCB的盘中孔

目录 一、什么时候可以在焊盘上打孔&#xff1f; 二、什么时候可以在焊盘上打孔&#xff1f; 绘制PCB时经常会遇到空间不够无法走线&#xff0c;这时我们会放置过孔使信号线穿过电路板一侧到达另一侧进行走线&#xff0c;这样既方便走线&#xff0c;也能够节省板子空间。有时…

Python悬置动刚度模拟及复数绘制

Python悬置动刚度模拟及复数绘制 1、复数绘制极坐标图2、动刚度的计算公式3、悬置动刚度的影响因素4、 AVL Excite 悬置动刚度的模拟 1、复数绘制极坐标图 # _*_ coding:UTF-8 _*_import matplotlib.pyplot as plt import numpy as np# 定义复数数组 complexNums [1.5 1.2j,…

PyCharm运行程序遇到‘[WinError 1455] 页面文件太小’的问题

最近在云环境的PyCharm运行程序&#xff0c;第一次遇到了WinError 1455的问题&#xff0c;感谢大神们给出的解决方法&#xff0c;特此记录一下。 错误提示是‘页面文件小’导致的问题&#xff0c;那么将页面调大即可。 电脑默认情况下没给D盘分配虚拟内存, 如果Python装在D盘…

遨游 JavaScript 对象星际:探索面向对象编程的深邃世界

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 &#x1f4af;面向对象编程&#x1f517;1 什么是对象&#x1f517;2 什么是…

lint 代码规范,手动修复,以及vscode的第三方插件eslint自动修复

ESlint代码规范 不是语法规范&#xff0c;是一种书写风格&#xff0c;加多少空格&#xff0c;缩进多少&#xff0c;加不加分号&#xff0c;类似于书信的写作格式 ESLint:是一个代码检查工具&#xff0c;用来检查你的代码是否符合指定的规则(你和你的团队可以自行约定一套规则)…

程序员最趁手的SVM算法,学完你会哭着感谢努力的自己!下篇.

支持向量机上篇内容更重要。 上篇地址&#xff1a;程序员最趁手的SVM算法&#xff0c;学完你会哭着感谢努力的自己&#xff01;上篇。-CSDN博客 废话不说直接进入主题&#xff1a; 6核贝叶斯支持向量机 核贝叶斯支持向量机通过学习一些已知的例子&#xff0c;并找到一个特殊…

JSON 转为json串后出现 “$ref“

问题描述 转为JSON 串时出现 "$ref":"$.RequestParam.list[0]" $ref&#xff1a; fastjson数据重复的部分会用引用代替&#xff0c;当一个对象包含另一个对象时&#xff0c;fastjson就会把该对象解析成引用 “$ref”:”..” 上一级 “$ref”:”” 当前对…

资料总结分享:瀑布图,GESA,生存曲线

目录 瀑布图 GESA 生存曲线 瀑布图 肿瘤的瀑布图是一种常用的数据可视化方式&#xff0c;用于展示个体患者或研究样本的肿瘤基因组学数据&#xff0c;通常包括基因突变、基因拷贝数变异、染色体重排等信息。 颜色编码&#xff1a; 柱状图通常会使用颜色编码来表示不同类型…