当前位置: 首页 > article >正文

八股总结(Java)实时更新!

八股总结(java)

  1. ArrayList和LinkedList有什么区别

    • ArrayList底层是动态数组,LinkedList底层是双向链表;
    • 前者利于随机访问,后者利于头尾插入;
    • 前者内存连续分配,后者通过指针连接多块不连续的内存;
  2. 实现多线程的几种方式

    • 通过继承Tread并重写run();
    • 实现无返回值的Runnable接口;
    • 实现有返回值的Callable接口,通常于Future一起使用;
    • 使用ExecutorService线程池工厂;
    • 使用ThreadPoolExecutor自定义线程池;
    • 使用ComletetableFuture异步链式编程;
  3. 线程池有哪些核心参数

    • 核心线程数:线程池创建时就存在的线程数,并且不会因为任务运行完成而销毁;

    • 最大线程数:线程池最大承载的线程数,非核心线程任务运行完成后自动销毁;

    • 工作队列:用于存放待执行任务的阻塞队列,有基于数组的有界队列,基于链表的无界队列,不存储元素的队列但每个插入必须等待一个移除,支持优先级排序的无界队列;

    • 线程空闲时间:非核心线程任务运行完成后等待新任务的最长时间;

    • 时间单位:空闲时间的单位;

    • 拒绝策略:当任务数超过最大线程数时的行为,默认抛出异常,也可以由提交任务的线程直接执行任务,也可以丢弃任务不抛出异常,也可以丢弃队列最旧任务并重新提交;

  4. 线程的状态有哪些

    • 新建:线程new,但没有start();

    • 可运行:调用start(),但还在操作系统分配资源;

    • 阻塞:线程因为锁而阻塞;

    • 等待:线程无限期等待其他线程的操作;

    • 超时等待:线程等待其他线程的操作,但设置过期时间;

    • 终止:线程执行完毕或异常终止;

  5. String、StringBuilder、StringBuffer有什么区别

    • String,是定长字符串,对String的所有操作都会创建新的对象;

    • StringBuilder,可以在不创建新对象的情况下对字符串内容进行修改,线程并不安全,适用于单线程环境下;

    • StringBuffer,可以在不创建新对象的情况下对字符串内容进行修改,线程安全,适用于多线程环境下;

  6. 等于号(==)和equals方法有什么区别?

    • ==常用于基本数据类型之间的比较,对于引用数据类型,则对比的是其地址
    • equals常用于比较两个对象的内容是否相等,默认情况下Object类的equals方法比较的也是地址,但和许多包装类都重写了equals方法,使其比较的是对象的内容;
  7. final关键字有什么作用?修饰类时有什么效果?

    • final修饰的变量称为常量,如果修饰的是基本数据类型,则其值不能修改,若修饰的是引用数据类型则其指向的对象不能修改,但可以修改其对象内部状态;
    • 修饰方法,不能被子类重写;
    • 修饰类,不能被继承;
  8. HashMap的底层原理

    • 底层是一个默认长为16的动态数组,其存储链表或红黑树;
    • 当有键值对存入时,键会通过哈希函数映射当数组对应下标位置,值则会存入链表中;
    • 若链表长度超过8则转换为红黑树;若红黑树的数据量小于6,则退化为链表;
    • 若数组元素数量超过默认负载因子的0.75就成倍扩容;
  9. Hashmap的扩展知识

    • 为什么链表长度超过8要转换为红黑树

      • 在极端情况下,数据分配不均,导致大量键值对集中在一个元素链表中,会导致hashmap退化为链表影响效率;
      • 根据大数据统计,链表长度超过8是因为哈希冲突导致的;

      为什么选择红黑树而不是B+树

      • 红黑树是自适应平衡二叉树,内存占用小,在hashmap中性能足够;
      • B+树的适用情景为io数据流的读取,因为其节点可以有多个子节点,每个节点可以存储多个键,用于减少树的高度,降低磁盘io访问次数,并且所有子节点在同一层,用于平衡io的平均访问时间,叶子节点之间通过指针连接,形成一个有序链表,支持高效返回查询;
  10. ConcurrentHashMap的底层原理

  • concurrentHashMap的底层就是HashMap的基础上保证线程安全;

  • 在jdk8之前,采用分段锁实现线程安全,内部有多个段组成,每个段维护一部分数据,并各自有一把锁。修改某个段的数据时对该段加锁保证线程安全;读取则不用加锁,因为段内的数组使用volatile修饰,保证可见性;

  • jdk8后,采用CAS+synchronized实现线程安全,当要向数组中某一位置插入数据时,若该位置无数据就使用CAS进行写入,反之加锁后进行写入;

  • 当数组进行扩容时采用的是并发+CAS+锁的方式,让扩容的同时不影响读取操作;

  • 为什么改为CAS+锁,因为原来的分段锁每个段都需要维护一把锁,占用了过多的资源,并且段相比较节点的颗粒度较大;

  1. class的生命周期

    • class的生命周期指类从JVM虚拟机加载开始,直到卸载的过程,生命周期包括加载、验证、准备、解析、初始化、使用和卸载七个阶段;
    • 加载,new创建类的实例、访问类的静态方法或属性、使用反射时会将class文件加载到JVM中,生成字节码class文件;
    • 验证,确保字节码class文件的合法;
    • 准备,静态变量分配内存并设置默认值;
    • 解析,符号引用转为直接引用;
    • 初始化,执行static{}代码块和静态变量的显式赋值;
    • 使用;
    • 卸载,释放内存;
  2. JVM是什么

    • java的java虚拟机,负责执行java字节码,并提供内存管理、垃圾回收等机制;
    • JVM是java“一次编写,随处运行”的核心,将java源码编译为class字节码再解释或编译为机器码交由操作系统执行;
    • JVM主要组成有类加载器,运行时数据区,执行引擎等;
  3. JVM的工作流程

    • 编写java代码;

    • 使用javac编译为class字节码;

    • 加载字节码;

    • 执行字节码,交由JIT编译器与解释器,转换为机器码;

    • 内存管理,分为堆、栈、方法区等;

    • 程序结束,释放所有资源;

  4. JVM的内存模型与垃圾回收机制

  • 主要分为分为堆、栈、方法区(jdk8前叫永久代)、pc程序计数器、直接内存;
  • 方法区,用于存放类信息,常量池,静态变量等;
  • 堆,用于存放对象实例和数组,是垃圾回收的主要区域,分为新生代和老年代;
  • 栈,用于存放局部变量、方法调用帧;
  • 程序计数器,用于记录当前线程执行的字节码指令魏智用于线程切换后回复执行位置;
  • 直接内存,手动管理,不受JVM堆内存限制;
  1. 垃圾回收机制
  • 是JVM自动管理内存的核心机制,负责回收不再使用的对象,释放内存空间;

  • 垃圾回收的基本原理是,可达性分析,从GC根对象触发,遍历所有可达对象,不可达对象视为垃圾进行回收;

  • 垃圾回收算法:

    • 标记-清除算法:从根对象出发,标记所有可达对象,清除未被标记的对象;缺点是会产生内存碎片;
    • 标记-整理算法:在标记-清理算法的基础上,标记后先将存活的对象移动到另一片区域,之后进行清除;
    • 复制算法:将内存分为AB两块,A区存活的对象赋值到B区,清理A区的所有对象;
    • 分代收集:将堆分为新生代和老年代,新生代是新对象分配的区域,采用复制算法,老年代是长期存活的对象,使用标记-清除或标记-整理算法;
  • 垃圾回收器:

    • 单线程回收器,适用于单线程;
    • 多线程回收器,适用与多线程;
    • CMS回收器,采用三色标记法,并发执行,对象尚未被标记则为白色,对象已被标记但引用的对象还未标记则为灰色,对象及其引用对象都被标记则为黑色,适用于响应时间敏感的应用;工作流程是:
      • 初始标记:标记从GC根对象直接可达的对象,标记灰色,需要STW停顿;
      • 并发标记:标记所有灰色对象的引用对象;
      • 重新标记:重新标记并发标记阶段所有修改引用或者不在引用的对象,需要SWT停顿;
      • 并发清除:清除所有白色标记的对象;
    • G1回收器,分区回收,适用于低延迟的大内存应用;
    • ZGC回收器,超低延迟;
  1. G1垃圾回收器与CMS垃圾回收器的区别
  • G1是在可控的停顿时间内实现高吞吐量,并且适用于大内存。CMS尽量减少停顿时间,适用于中小内存;
  • G1堆内存管理基于分区管理,划分为多个大小相同的区域,每个区域可以是年轻代、老年代和永久代。而CMS则将堆内存划分为新生代和老年代;
  • G1内存管理采用并发标记整理算法,减少碎片,而CMS采用并发标记清除算法,容易造成FullGC堆溢出;
  1. 发生了OutOfMemoryError如何解决
  • 首先根据报错确认问题在哪;
  • 使用jmap生成堆转储文件;
  • 分析堆内存;
  • 根据原因调整JVM参数;
  • 选择合适的垃圾回收机制;
  1. CAS的原理

    • CAS是一种无锁原子操作,他有三个属性,变量的内存地址,预期值,新值,如果期望值与内存中的值一致则更新为新值;
    • CAS存在ABA问题,ABA问题是当一个变量从A变为B再变为A,CAS机制会误认为值没有被修改;
    • 常见的解决方案是通过给变量加上时间戳或是版本号,每次修改就会更新,这样修改值时,CAS就能检测到变化;
  2. volatile字段的原理,是否能替代锁

    • volatile是java的修饰词,用于确保变量的可见性与有序性,主要作用于解决多线程环境下的内存可见性问题;
    • 在多线程环境下,每个线程都有自己的工作内存,当线程对变量进行修改时,会先修改变量存放到自己的内存中,不会立即同步给主内存,导致其他线程不能看到最新的值;
    • volatile会强制修改后的值立即写会主内存,并强制其他线程重新读取该变量,保证可见性;
    • volatile会保证变量的读写操作按照代码的顺序执行;
    • volatile的底层原理是依赖于内存屏障,他是一种CPU指令用于控制指令的执行顺序与内存可见性;
    • 在写入变量时,会插入写屏障,确保之前操作都完成后,在将新的变量同步给主内存;
    • 在插入变量时,会插入读屏障,确保之后的操作都能看到最新的值;
    • volatile只能解决可见性与有序性的问题,无法解决复合操作的原子性问题;
  3. 双亲委派模型

    • 是java类的加载机制,采用逐级委派的方式加载类,主要目的是保证java核心类的安全性和避免类的重复加载;
    • 按照层次关系分为:
      • 启动类加载器:负责加载Java核心类库;
      • 扩展类加载器:负责加载扩展类库;
      • 应用类加载器:负责还在开发者自己编写的Java代码;
      • 自定义类加载器:开发者继承ClassLoader自定义类加载逻辑;
    • 工作机制:当类加载器需要加载一个类时,会由当前加载器先向父类加载器发送加载请求,直到启动类加载器,如果找不到则由当前加载器加载;
  4. AQS的底层原理

    • AQS(抽象队列同步器)是Java并发包中的核心组件,用于实现锁和同步器;
    • AQS采用FIFO队列+CAS操作来管理锁的同步和排队,其底层主要通过状态变量(state)和队列管理来实现线程的阻塞、唤醒、等待和竞争锁等功能,通过CAS操作保证线程安全;
    • state变量用于表示同步的当前状态,state==0表示锁为被占用,!=0表示已被占用;
    • FIFO队列来管理等待同步的线程,当线程尝试获取同步资源失败时会被放入队列,按照先进先出的顺序等待获取同步;
    • 队列数据结构是一个双向链表,每个等待的线程都是一个队列的节点,节点包含线程和前后指针;头部是等待同步的线程,尾部是最新加入的线程;
  5. Executors线程工厂类有哪些常见的工厂方法

    • newFixedThreadPool(int nThreads),创建一个固定大小的线程池,核心线程数与最大线程数相同,适用于执行长期稳定任务,保证一定并发量的情况;

    • newCachedThreadPool(),创建一个可缓存的线程池,无核心线程,最大线程数为Integer.MAX_VALUE,适用于执行大量短时间任务的情况,能够充分利用系统资源;

    • newSingleThreadExecutor(),创建单线程的线程池,保证所有任务按照顺序执行;

  6. 数组如何转为list

    • 使用Arrays.asList(T… a),返回定长list;
    • 使用new ArrayList<>(Arrays.asList(array));
    • 使用Stream,Arrays.stream(array).collect(Collectors.toList());
    • 使用for循环手动添加;
  7. 如何遍历list

    • 增强型for循环;
    • 普通循环,访问下标;
    • 迭代器;
    • Stream流,forEach(System.out::println);
  8. 任务提交给线程池后是怎么工作的

    • 线程池会先检查核心线程数,小于核心线程数,会创建新线程;
    • 任务队列未满则任务进入阻塞队列;
    • 如果任务队列(ArrayBlockingQueue)已满,且当前线程数小于最大线程数,则会创建新线程执行任务;
    • 如果已经达到最大线程数,线程池会执行拒绝策略;
  9. wait()和sleep()的区别

    • wait和sleep方法都用于使用线程暂停执行,但他们在使用方式、功能和影响上有显著区别;
    • sleep是Thread类的静态方法,可以在任何地方调用,无需持有对象锁,调用后线程会暂停执行指定的时间,但不会释放已持有的锁,其他县城无法获取这些锁;
    • wait是Object类的方法,必须在同步方法或同步代码块内调用,并且在调用时需要持有该对象的监视器锁,调用后,线程会释放已持有的锁,允许其他线程获取这些锁,线程会进入等待状态,直到被其他线程调用其对象的notify()方法唤醒。如果wait添加了过期时间,若未超过过期时间也可以被notify唤醒,超过时间后自动唤醒;
    • sleep常用于让线程暂停执行一段固定的时间,例如实现定时任务或控制线程执行频率;wait常用于线程间的通信;
  10. 并行与并发的区别:

    • 并行(Parallelism): 多个任务在同一时刻同时执行,通常需要多核处理器的支持。
    • 并发(Concurrency): 多个任务在同一时间段内交替执行,但不一定同时执行。
  11. Java常见的设计模式

    • 单例模式:
      • 在系统中一个类只存在一个实例,类自身负责创建并维护唯一实例,并提供一个全局方法,允许外部访问该实例;
      • 常用于资源管理、配置管理和日志记录;
      • 实现单例模式一般通过双重检查锁定,在需要时才创建实例,并通过双重检查和同步块确保线程安全,同时提高性能;
    • 普通工厂模式:
      • 由一个工厂类根据传入的不同参数创建不同的产品实例,将对象创建逻辑封装在工厂类中;
      • 将对象的创建与使用分离,降低了耦合性;
      • 缺点是集中力所有对象的创建逻辑,违反了单一职责原则,可能导致工厂类过于复杂。且当需要添加新产品时,需要修改工厂类的代码,不符合开闭原则;
    • 工厂方法模式:
      • 定义了一个创建对象的接口,由子类决定实例化哪个具体类;
      • 相比较普通工厂方法,符合开闭原则,增加新产品时无需修改现有代码;
      • 符合单一职责原则,每个具体工厂类只负责创建对应的产品;
      • 增加了系统的复杂度,需要对每个具体实现创建工厂类;
    • 抽象工厂方法:
      • 提供一个创建一系列相关或相互依赖对象的接口,也就是对多组产品抽象其方法,封装隐藏其产品创建的过程;
  12. threadLocal是什么?

    • TreadLocal是一个创建线程局部变量的类,通常情况下,多个线程共享同一变量,可能导致并发问题,使用TreadLocal,存储的变量只能由当前线程使用,保证线程隔离;
    • 使用TreadLocal时,可能会导致内存泄露,因为与线程生命周期绑定,如果不及时清理,可能会导致无法回收对象占用内存,所以需要在不需要TreadLocal时调用remove()清理;

相关文章:

八股总结(Java)实时更新!

八股总结&#xff08;java&#xff09; ArrayList和LinkedList有什么区别 ArrayList底层是动态数组&#xff0c;LinkedList底层是双向链表&#xff1b;前者利于随机访问&#xff0c;后者利于头尾插入&#xff1b;前者内存连续分配&#xff0c;后者通过指针连接多块不连续的内存…...

@emotion/css + react+动态主题切换

1.下载插件 npm install --save emotion/css 2.创建ThemeContext.tsx // src/ThemeContext.tsx import React, { createContext, useContext, useState } from "react";// 定义主题类型 export type Theme "light" | "dark";// 定义主题上下…...

Python Cookbook-4.16 用字典分派方法和函数

任务 需要根据某个控制变量的值执行不同的代码片段——在其他的语言中你可能会使用case 语句。 解决方案 归功于面向对象编程的优雅的分派概念&#xff0c;case语句的使用大多(但不是所有)都可以被替换成其他分派形式。在Python中&#xff0c;字典及函数是一等(first-class)…...

亚马逊玩具品类技术驱动型选品策略:从趋势洞察到合规基建

一、全球玩具电商技术演进趋势 &#xff08;技术化重构原市场背景&#xff09; 数据可视化分析&#xff1a;通过亚马逊SP-API抓取2023年玩具品类GMV分布热力图 监管技术升级&#xff1a; 美国CPSC启用AI质检系统&#xff08;缺陷识别准确率92.7%&#xff09; 欧盟EPR合规接口…...

【jQuery】插件

目录 一、 jQuery插件 1. 瀑布流插件&#xff1a; jQuery 之家 http://www.htmleaf.com/ 2. 图片懒加载&#xff1a; jQuery 插件库 http://www.jq22.com/ 3. 全屏滚动 总结不易~ 本章节对我有很大收获&#xff0c;希望对你也是~~~ 一、 jQuery插件 jQuery 功能…...

MATLAB导入Excel数据

假如Excel中存在三列数据需要导入Matlab中。 保证该Excel文件与Matlab程序在同一目录下。 function [time, voltage, current] test(filename)% 读取Excel文件并提取时间、电压、电流数据% 输入参数:% filename: Excel文件名&#xff08;需包含路径&#xff0c;如C:\data\…...

主流软件工程模型全景剖析

一、瀑布模型 阶段划分 需求分析&#xff1a;与用户深入沟通&#xff0c;全面了解软件的功能、性能、可靠性等要求&#xff0c;形成详细的需求规格说明书。设计阶段&#xff1a;包括总体设计和详细设计。总体设计确定软件的体系结构&#xff0c;如模块划分、模块之间的接口等&…...

python和Java的区别

Python和Java是两种流行的编程语言&#xff0c;它们之间有一些重要的区别&#xff1a; 语法&#xff1a;Python是一种动态类型的脚本语言&#xff0c;语法简洁明了&#xff0c;通常使用缩进来表示代码块。Java是一种静态类型的编程语言&#xff0c;语法更为严格&#xff0c;需要…...

孤码长征:破译PCL自定义点云注册机制源码迷局——踩坑实录与架构解构

在之前一个博客《一文搞懂PCL中自定义点云类型的构建与函数使用》中&#xff0c;清晰地介绍了在PCL中点云的定义与注册方法。我的一个读者很好奇其内部注册的原理以及机制&#xff0c;再加上最近工作中跟猛男开发自定义点云存储的工作&#xff0c;借着这些需求&#xff0c;我也…...

【SQL】MySQL基础2——视图,存储过程,游标,约束,触发器

文章目录 1. 视图2. 存储过程2.1 创建存储过程2.2 执行存储过程 3. 游标4. 约束4.1 主键约束4.2 外键约束4.3 唯一约束4.4 检查约束 5. 触发器 1. 视图 视图是虚拟的表&#xff0c;它是动态检索的部分。使用视图的原因&#xff1a;避免重复的SQL语句&#xff1b;使用表的部分而…...

Centos 7 搭建 jumpserver 堡垒机

jumpserver 的介绍 1、JumpServer 是完全开源的堡垒机, 使用 GNU GPL v2.0 开源协议, 是符合4A 的专业运维审计系统 1)身份验证 / Authentication 2)授权控制 / Authorization 3)账号管理 / Accounting 4)安全审计 / Auditing 2、JumpServer 使用 Python / Django 进行开…...

封装了一个优雅的iOS全屏侧滑返回工具

思路 添加一个全屏返回手势&#xff0c;UIPangesturerecognizer, 1 手势开始 在手势开始响应的时候&#xff0c;将navigationController的delegate代理设置为工具类&#xff0c;在工具类中执行代理方法&#xff0c;- (nullable id )navigationController:(UINavigationControll…...

HCIP-6 DHCP

HCIP-6 DHCP DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff09; 手工配置网络参数存在的问题 灵活性差 容易出错 IP地址资源利用率低 工作量大 人员素质要求高 DHCP服务器按照如下次序为客户端选择IP地址: ①DHCP服务器的数…...

OpenCV图像拼接(8)用于实现并查集(也称为不相交集合)数据结构类cv::detail::DisjointSets

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::detail::DisjointSets 类是OpenCV库中用于实现不相交集合&#xff08;也称为并查集&#xff09;数据结构的类。该数据结构常用于处理动态连接…...

opencv图像处理之指纹验证

一、简介 在当今数字化时代&#xff0c;生物识别技术作为一种安全、便捷的身份验证方式&#xff0c;正广泛应用于各个领域。指纹识别作为生物识别技术中的佼佼者&#xff0c;因其独特性和稳定性&#xff0c;成为了众多应用场景的首选。今天&#xff0c;我们就来深入探讨如何利…...

记一道CTF题—PHP双MD5加密+”SALT“弱碰撞绕过

通过分析源代码并找到绕过限制的方法&#xff0c;从而获取到flag&#xff01; 部分源码&#xff1a; <?php $name_POST[username]; $passencode(_POST[password]); $admin_user "admin"; $admin_pw get_hash("0e260265122865008095838959784793");…...

Text2SQL推理类大模型本地部署的解决方案

大家好,我是herosunly。985院校硕士毕业,现担任算法工程师一职,获得CSDN博客之星第一名,热衷于大模型算法的研究与应用。曾担任百度千帆大模型比赛、BPAA算法大赛评委,编写微软OpenAI考试认证指导手册。曾获得多项AI顶级比赛的Top名次,其中包括阿里云、科大讯飞比赛第一名…...

机器学习的一百个概念(3)上采样

前言 本文隶属于专栏《机器学习的一百个概念》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见[《机器学习的一百个概念》 ima 知识库 知识库广场搜索&…...

Electron应用生命周期全解析:从启动到退出的精准掌控

一、Electron生命周期的核心特征 1.1 双进程架构的生命周期差异 Electron应用的生命周期管理具有明显的双进程特征&#xff1a; 主进程生命周期&#xff1a;贯穿应用启动到退出的完整周期渲染进程生命周期&#xff1a;与浏览器标签页相似但具备扩展能力进程间联动周期&#…...

AI渗透测试:网络安全的“黑魔法”还是“白魔法”?

引言&#xff1a;AI渗透测试&#xff0c;安全圈的“新魔法师” 想象一下&#xff0c;你是个网络安全新手&#xff0c;手里攥着一堆工具&#xff0c;正准备硬着头皮上阵。这时&#xff0c;AI蹦出来&#xff0c;拍着胸脯说&#xff1a;“别慌&#xff0c;我3秒扫完漏洞&#xff0…...

分秒计数器设计

一、在VsCode中写代码 目录 一、在VsCode中写代码 二、在Quartus中创建工程与仿真 1、建立工程项目文件md_counter 2、打开项目文件&#xff0c;创建三个目录 3、打开文件trl&#xff0c;创建md_counter.v文件 4、打开文件tb&#xff0c;创建md_counter_tb.v文件 5、用VsCod…...

Flink介绍——发展历史

引入 我们整个大数据处理里面的计算模式主要可以分为以下四种&#xff1a; 批量计算&#xff08;batch computing&#xff09; MapReduce Hive Spark Flink pig流式计算&#xff08;stream computing&#xff09; Storm SparkStreaming/StructuredStreaming Flink Samza交互计…...

12. STL的原理

目录 1. 容器、迭代器、算法 什么是迭代器? 迭代器的作用&#xff1f; 迭代器的类型&#xff1f; 迭代器失效 迭代器的实现细节&#xff1a; 2. 适配器 什么是适配器&#xff1f; 适配器种类&#xff1a; 3. 仿函数 什么是仿函数&#xff1f; 仿函数与算法和容器的…...

OSPFv3 的 LSA 详解

一、复习&#xff1a; OSPFv3 运行于 IPv6 协议上&#xff0c;所以是基于链路&#xff0c;而不是基于网段&#xff0c;它实现了拓扑和网络的分离。另外&#xff0c;支持一个链路上多个进程&#xff1b;支持泛洪范围标记和泛洪不识别的报文&#xff08;ospfv2 的行为是丢弃&…...

python 原型链污染学习

复现SU的时候遇到一道python原型链污染的题&#xff0c;借此机会学一下参考&#xff1a; 【原型链污染】Python与Jshttps://blog.abdulrah33m.com/prototype-pollution-in-python/pydash原型链污染 文章目录 基础知识对父类的污染命令执行对子类的污染pydash原型链污染打污染的…...

Windows 图形显示驱动开发-WDDM 2.4功能-GPU 半虚拟化(十一)

注册表设置 GPU虚拟化标志 GpuVirtualizationFlags 注册表项用于设置半虚拟化 GPU 的行为。 密钥位于&#xff1a; DWORD HKLM\System\CurrentControlSet\Control\GraphicsDrivers\GpuVirtualizationFlags 定义了以下位&#xff1a; 位描述0x1 ​ 为所有硬件适配器强制设置…...

入栈操作-出栈操作

入栈操作 其 入栈操作 汇编代码流程解析如下&#xff1a; 出栈操作 其 出栈操作 汇编代码流程解析如下&#xff1a;...

C++ 多态:面向对象编程的核心概念(一)

文章目录 引言1. 多态的概念2. 多态的定义和实现2.1 实现多态的条件2.2 虚函数2.3 虚函数的重写/覆盖2.4 虚函数重写的一些其他问题2.5 override 和 final 关键字2.6 重载/重写/隐藏的对比 3. 纯虚函数和抽象类 引言 多态是面向对象编程的三大特性之一&#xff08;封装、继承、…...

传统策略梯度方法的弊端与PPO的改进:稳定性与样本效率的提升

为什么传统策略梯度方法&#xff08;如REINFORCE算法&#xff09;在训练过程中存在不稳定性和样本效率低下的问题 1. 传统策略梯度方法的基本公式 传统策略梯度方法的目标是最大化累积奖励的期望值。具体来说&#xff0c;优化目标可以表示为&#xff1a; max ⁡ θ J ( θ )…...

我的机器学习学习之路

学习python的初衷 • hi&#xff0c;今天给朋友们分享一下我是怎么从0基础开始学习机器学习的。 • 我是2023年9月开始下定决心要学python的&#xff0c;目的有两个&#xff0c;一是为了提升自己的技能和价值&#xff0c;二是将所学的知识应用到工作中去&#xff0c;提升工作…...