Java面试题及详细答案120道之(041-060)

前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,MySQL,Linux… 。

前后端面试题-专栏总目录

在这里插入图片描述

文章目录

  • 一、本文面试题目录
      • 41. 什么是工厂模式?简单工厂、工厂方法、抽象工厂的区别?
      • 42. Java中的泛型有什么作用?
      • 43. Java中的`Comparable`和`Comparator`有何区别?
      • 44. 什么是Java中的注解?
      • 45. Java中的线程池有什么作用?
      • 46. 解释Java中的`双亲委派模型`
      • 47. Java中的字符编码有哪些常见类型,它们有什么区别?
      • 48. 什么是Java中的函数式接口?如何使用Lambda表达式?
      • 49. 简述Java中的泛型擦除机制
      • 50. 什么是Java中的线程局部变量(ThreadLocal)?如何使用?
      • 51. 解释Java中的动态代理及其实现方式
      • 52. 什么是Java中的注解(Annotation)?如何自定义注解?
      • 53. 解释Java中的序列化与反序列化
      • 54. Java中的`equals()`和`==`有什么区别?
      • 55. 什么是Java中的Lambda表达式?适用于什么场景?
      • 56. 解释Java中的Stream API及其常用操作
      • 57. Java中的`volatile`关键字有什么作用?
      • 58. Java中的`try-with-resources`语法有什么作用?
      • 59. 解释Java中的深拷贝与浅拷贝
      • 60. Java中的`String`、`StringBuilder`、`StringBuffer`有什么区别?
  • 二、120道面试题目录列表

一、本文面试题目录

41. 什么是工厂模式?简单工厂、工厂方法、抽象工厂的区别?

答案
工厂模式:用于创建对象,隐藏实例化逻辑,解耦对象创建与使用。

区别

  • 简单工厂:一个工厂类根据参数创建不同产品(违反开闭原则)。

    class CarFactory {public static Car createCar(String type) {if ("Benz".equals(type)) return new Benz();else if ("BMW".equals(type)) return new BMW();return null;}
    }
    
  • 工厂方法:每个产品对应一个工厂类,通过继承扩展(符合开闭原则)。

    interface CarFactory { Car createCar(); }
    class BenzFactory implements CarFactory {public Car createCar() { return new Benz(); }
    }
    class BMWFactory implements CarFactory {public Car createCar() { return new BMW(); }
    }
    
  • 抽象工厂:创建一系列相关产品(产品族),如汽车工厂同时生产汽车和发动机。

42. Java中的泛型有什么作用?

  • 答案:泛型用于在编译时确保类型安全,可将类型作为参数传递,使代码更通用。例如List表示该列表只能存储String类型元素,避免了类型转换错误,提高了代码的可读性和可维护性。

43. Java中的ComparableComparator有何区别?

答案

特性ComparableComparator
定义位置类内部(implements Comparable类外部(单独实现Comparator接口)
方法int compareTo(T o)int compare(T o1, T o2)
排序逻辑类自身的默认排序(自然排序)外部定义的定制排序
适用场景固定排序逻辑灵活切换排序逻辑(如升序/降序)

代码示例

// Comparable:类内部实现
class Student implements Comparable<Student> {int age;@Overridepublic int compareTo(Student o) {return Integer.compare(this.age, o.age); // 按年龄升序}
}// Comparator:外部实现
class StudentNameComparator implements Comparator<Student> {@Overridepublic int compare(Student s1, Student s2) {return s1.name.compareTo(s2.name); // 按姓名排序}
}

44. 什么是Java中的注解?

  • 答案:注解是Java 5.0引入的新特性,用于为代码添加元数据。它可以用于类、方法、变量等上面,提供信息给编译器、开发工具或运行时环境。例如@Override注解用于标识方法重写,@Deprecated注解表示方法已过时等。

45. Java中的线程池有什么作用?

  • 答案:线程池用于管理和复用线程,避免频繁创建和销毁线程带来的开销,提高系统性能和资源利用率。常见的线程池类有ThreadPoolExecutor,可通过它创建不同类型的线程池,如FixedThreadPool(固定大小线程池)、CachedThreadPool(缓存线程池)等。

46. 解释Java中的双亲委派模型

原理:类加载器的委派机制,当加载类时,先委托父加载器加载,父加载器无法加载时才自己加载,避免类重复加载和安全问题(如自定义java.lang.String不会被加载)。
类加载器层次

  • 启动类加载器(Bootstrap ClassLoader):加载JAVA_HOME/lib下的类;
  • 扩展类加载器(Extension ClassLoader):加载JAVA_HOME/lib/ext下的类;
  • 应用类加载器(Application ClassLoader):加载类路径下的类;
  • 自定义类加载器:继承ClassLoader,重写findClass()

代码示例(类加载委派):

public class ClassLoaderDemo {public static void main(String[] args) {// 获取当前类的类加载器(应用类加载器)ClassLoader appClassLoader = ClassLoaderDemo.class.getClassLoader();System.out.println(appClassLoader); // 输出sun.misc.Launcher$AppClassLoader// 父加载器(扩展类加载器)ClassLoader extClassLoader = appClassLoader.getParent();System.out.println(extClassLoader); // 输出sun.misc.Launcher$ExtClassLoader// 启动类加载器(C++实现,返回null)ClassLoader bootstrapClassLoader = extClassLoader.getParent();System.out.println(bootstrapClassLoader); // 输出null}
}

47. Java中的字符编码有哪些常见类型,它们有什么区别?

  • 答案:常见的字符编码有ASCII、UTF - 8、UTF - 16等。ASCII编码用7位二进制数表示一个字符,只能表示英文字母、数字和一些特殊字符;UTF - 8是一种可变长度编码,可表示世界上几乎所有字符,对英文字符用1个字节表示,对其他字符根据需要用2 - 4个字节表示;UTF - 16通常用2个字节表示一个字符,但对于一些特殊字符需用4个字节。

48. 什么是Java中的函数式接口?如何使用Lambda表达式?

  • 原理:函数式接口是只包含一个抽象方法的接口(可以有默认方法和静态方法),用@FunctionalInterface注解标识。Lambda表达式是函数式接口的实例化方式,用于简化匿名内部类的写法。
  • 代码示例
import java.util.function.Predicate;// 自定义函数式接口
@FunctionalInterface
interface Calculator {int calculate(int a, int b);
}public class FunctionalInterfaceDemo {public static void main(String[] args) {// 使用Lambda表达式实现Calculator接口Calculator add = (a, b) -> a + b;System.out.println(add.calculate(2, 3)); // 输出5// 内置函数式接口Predicate(判断条件)Predicate<Integer> isEven = num -> num % 2 == 0;System.out.println(isEven.test(4)); // 输出trueSystem.out.println(isEven.test(5)); // 输出false}
}

49. 简述Java中的泛型擦除机制

  • 原理:Java泛型是“伪泛型”,在编译阶段会进行类型擦除:编译器将泛型类型参数替换为其边界类型(若无边界则替换为Object),并在必要时插入类型转换代码。这意味着泛型信息在运行时不存在,无法通过反射获取泛型参数的具体类型(除非通过匿名内部类等特殊方式)。
  • 代码示例
import java.util.ArrayList;public class GenericErasureDemo {public static void main(String[] args) {ArrayList<String> strList = new ArrayList<>();ArrayList<Integer> intList = new ArrayList<>();// 类型擦除后,两者的运行时类型相同System.out.println(strList.getClass() == intList.getClass()); // 输出true// 编译时泛型检查,运行时无限制(可通过反射绕过)try {strList.getClass().getMethod("add", Object.class).invoke(strList, 10);System.out.println(strList); // 输出[10],说明运行时无泛型限制} catch (Exception e) {e.printStackTrace();}}
}

50. 什么是Java中的线程局部变量(ThreadLocal)?如何使用?

  • 原理ThreadLocal用于为每个线程提供独立的变量副本,确保线程间数据隔离。其内部通过Thread类中的threadLocals(类型为ThreadLocalMap)存储数据,每个ThreadLocal对象作为key,对应的线程私有值作为value。
  • 注意:使用后需手动调用remove()方法清理数据,否则可能导致内存泄漏(ThreadLocalMap中的Entry是弱引用key,但value是强引用,若线程长期存活,value无法回收)。
  • 代码示例
public class ThreadLocalDemo {// 定义ThreadLocal变量,指定泛型类型为Stringprivate static ThreadLocal<String> threadLocal = new ThreadLocal<>();public static void main(String[] args) {// 线程1设置并获取值new Thread(() -> {threadLocal.set("线程1的数据");System.out.println(Thread.currentThread().getName() + ":" + threadLocal.get());threadLocal.remove(); // 清理数据}, "线程1").start();// 线程2设置并获取值new Thread(() -> {threadLocal.set("线程2的数据");System.out.println(Thread.currentThread().getName() + ":" + threadLocal.get());threadLocal.remove(); // 清理数据}, "线程2").start();}
}
// 输出:
// 线程1:线程1的数据
// 线程2:线程2的数据
No.大剑师精品GIS教程推荐
0地图渲染基础- 【WebGL 教程】 - 【Canvas 教程】 - 【SVG 教程】
1Openlayers 【入门教程】 - 【源代码+示例 300+】
2Leaflet 【入门教程】 - 【源代码+图文示例 150+】
3MapboxGL【入门教程】 - 【源代码+图文示例150+】
4Cesium 【入门教程】 - 【源代码+综合教程 200+】
5threejs【中文API】 - 【源代码+图文示例200+】

51. 解释Java中的动态代理及其实现方式

原理:动态代理允许在运行时创建目标类的代理对象,增强目标方法(如日志、事务)而不修改源码。
实现方式

  • JDK动态代理:基于接口,通过Proxy.newProxyInstance()生成代理类;
  • CGLIB动态代理:基于继承,通过生成目标类子类实现代理(需引入CGLIB库)。

代码示例(JDK动态代理):

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;// 目标接口
interface Target {void doSomething();
}// 目标实现类
class TargetImpl implements Target {@Overridepublic void doSomething() {System.out.println("执行目标方法");}
}// 代理处理器
class ProxyHandler implements InvocationHandler {private Object target;public ProxyHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("代理:方法执行前"); // 增强逻辑Object result = method.invoke(target, args); // 调用目标方法System.out.println("代理:方法执行后");return result;}
}public class DynamicProxyDemo {public static void main(String[] args) {Target target = new TargetImpl();// 生成代理对象(基于接口)Target proxy = (Target) Proxy.newProxyInstance(Target.class.getClassLoader(),new Class[]{Target.class},new ProxyHandler(target));proxy.doSomething();}
}
// 输出:代理:方法执行前 → 执行目标方法 → 代理:方法执行后

52. 什么是Java中的注解(Annotation)?如何自定义注解?

原理:注解是代码的元数据,用于标记类、方法等,可通过反射解析。内置注解如@Override@Deprecated,自定义注解需用@interface声明。
核心元注解

  • @Retention:指定注解保留阶段(源码、字节码、运行时);
  • @Target:指定注解可修饰的元素(类、方法等)。

代码示例

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;// 自定义注解
@Retention(RetentionPolicy.RUNTIME) // 运行时保留,可通过反射获取
@Target(ElementType.METHOD) // 仅修饰方法
@interface Log {String value() default "执行方法"; // 注解属性
}public class AnnotationDemo {@Log("测试方法") // 使用注解public void test() {System.out.println("测试方法执行");}public static void main(String[] args) throws Exception {// 反射获取注解Log log = AnnotationDemo.class.getMethod("test").getAnnotation(Log.class);System.out.println(log.value()); // 输出:测试方法}
}

53. 解释Java中的序列化与反序列化

原理:序列化将对象转换为字节流(便于存储/传输),反序列化则将字节流恢复为对象。需实现Serializable接口(标记接口,无方法),transient关键字修饰的字段不参与序列化。

代码示例

import java.io.*;class User implements Serializable { // 实现Serializable接口private String name;private transient int age; // transient字段不序列化public User(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "User{name='" + name + "', age=" + age + "}";}
}public class SerializationDemo {public static void main(String[] args) throws IOException, ClassNotFoundException {// 序列化User user = new User("Alice", 20);ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("user.ser"));oos.writeObject(user);oos.close();// 反序列化ObjectInputStream ois = new ObjectInputStream(new FileInputStream("user.ser"));User deserializedUser = (User) ois.readObject();ois.close();System.out.println(deserializedUser); // 输出:User{name='Alice', age=0}(age被transient修饰,未序列化)}
}

54. Java中的equals()==有什么区别?

原理

  • ==:比较基本类型时为值比较;比较引用类型时为内存地址(对象是否为同一实例)比较。
  • equals():Object类默认实现为==,但可重写(如String类重写为值比较)。

代码示例

public class EqualsDemo {public static void main(String[] args) {// 基本类型比较int a = 10;int b = 10;System.out.println(a == b); // true(值相等)// 引用类型比较String s1 = new String("hello");String s2 = new String("hello");System.out.println(s1 == s2); // false(地址不同)System.out.println(s1.equals(s2)); // true(String重写equals,比较值)}
}

55. 什么是Java中的Lambda表达式?适用于什么场景?

原理:Lambda是函数式接口的匿名实现,简化代码。格式:(参数) -> 表达式/代码块
适用场景:简化集合遍历(如forEach)、线程创建、Stream API等。

代码示例

import java.util.Arrays;
import java.util.List;public class LambdaDemo {public static void main(String[] args) {// 1. 简化线程创建(Runnable是函数式接口)new Thread(() -> System.out.println("Lambda线程运行")).start();// 2. 集合遍历List<String> list = Arrays.asList("a", "b", "c");list.forEach(str -> System.out.println(str)); // 输出a、b、c// 3. 简化Comparatorlist.sort((s1, s2) -> s2.compareTo(s1)); // 倒序排序System.out.println(list); // 输出[c, b, a]}
}

56. 解释Java中的Stream API及其常用操作

原理:Stream API用于处理集合数据,支持链式操作(过滤、映射、聚合等),类似SQL查询,分为中间操作(返回Stream)和终端操作(返回结果)。

常用操作

  • filter():过滤元素;
  • map():转换元素;
  • collect():收集结果(如转List);
  • count():统计元素数。

代码示例

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class StreamDemo {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);// 过滤偶数 → 乘以2 → 收集为ListList<Integer> result = numbers.stream().filter(n -> n % 2 == 0) // 中间操作:保留偶数.map(n -> n * 2) // 中间操作:乘以2.collect(Collectors.toList()); // 终端操作:转ListSystem.out.println(result); // 输出[4, 8, 12]}
}

57. Java中的volatile关键字有什么作用?

原理volatile保证变量的可见性和禁止指令重排序,但不保证原子性。

  • 可见性:线程修改volatile变量后,立即刷新到主内存,其他线程读取时从主内存加载;
  • 有序性:禁止编译器和CPU对volatile变量相关指令重排序(如单例模式中的双重检查锁)。

代码示例(禁止重排序):

public class VolatileDemo {private static volatile VolatileDemo instance; // 禁止重排序private VolatileDemo() {}public static VolatileDemo getInstance() {if (instance == null) {synchronized (VolatileDemo.class) {if (instance == null) {// 若不加volatile,可能发生指令重排序:// 1. 分配内存 → 2. 实例化对象 → 3. 赋值给instance// 重排序后可能为1→3→2,导致其他线程获取到未初始化的instanceinstance = new VolatileDemo();}}}return instance;}
}

58. Java中的try-with-resources语法有什么作用?

原理try-with-resources用于自动关闭实现AutoCloseable接口的资源(如流、连接),替代传统的try-finally,避免资源泄漏。

代码示例

import java.io.FileInputStream;
import java.io.IOException;public class TryWithResources {public static void main(String[] args) {// 资源在try块结束后自动关闭try (FileInputStream fis = new FileInputStream("test.txt")) {int data = fis.read();while (data != -1) {System.out.print((char) data);data = fis.read();}} catch (IOException e) { // 统一处理异常e.printStackTrace();}// 无需手动调用fis.close()}
}

59. 解释Java中的深拷贝与浅拷贝

原理

  • 浅拷贝:复制对象时,仅复制基本类型字段,引用类型字段仍指向原对象(如Object.clone()默认实现);
  • 深拷贝:复制对象及引用类型字段指向的所有对象,完全独立于原对象(需手动实现,如序列化/反序列化或递归克隆)。

代码示例

import java.util.Arrays;class Person implements Cloneable {private String name;private int[] ages; // 引用类型public Person(String name, int[] ages) {this.name = name;this.ages = ages;}// 浅拷贝(默认clone)@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}// 深拷贝(手动复制引用类型)public Person deepClone() throws CloneNotSupportedException {Person clone = (Person) super.clone();clone.ages = Arrays.copyOf(this.ages, this.ages.length); // 复制数组return clone;}// getter/setter省略
}public class CopyDemo {public static void main(String[] args) throws CloneNotSupportedException {int[] ages = {20, 30};Person original = new Person("Alice", ages);// 浅拷贝Person shallowClone = (Person) original.clone();shallowClone.ages[0] = 25;System.out.println(original.ages[0]); // 输出25(原对象被修改)// 深拷贝Person deepClone = original.deepClone();deepClone.ages[0] = 30;System.out.println(original.ages[0]); // 输出25(原对象未被修改)}
}

60. Java中的StringStringBuilderStringBuffer有什么区别?

原理

  • String:不可变字符序列(底层char[]final修饰),每次修改创建新对象,效率低;
  • StringBuilder:可变字符序列,非线程安全,效率高(单线程推荐);
  • StringBuffer:可变字符序列,线程安全(方法加synchronized),效率低(多线程推荐)。

代码示例

public class StringCompare {public static void main(String[] args) {String str = "a";str += "b"; // 创建新String对象(原对象不变)StringBuilder sb = new StringBuilder("a");sb.append("b"); // 直接修改内部数组,无新对象StringBuffer sbf = new StringBuffer("a");sbf.append("b"); // 线程安全的append}
}

二、120道面试题目录列表

文章序号Java面试题120道
1Java面试题及详细答案120道(01-20)
2Java面试题及详细答案120道(21-40)
3Java面试题及详细答案120道(41-60)
4Java面试题及详细答案120道(61-80)
5Java面试题及详细答案120道(81-100)
6Java面试题及详细答案120道(5101-120)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【尝试】本地部署openai-whisper,通过 http请求识别

安装whisper的教程&#xff0c;已在 https://blog.csdn.net/qq_23938507/article/details/149394418 和 https://blog.csdn.net/qq_23938507/article/details/149326290 中说明。 1、创建whisperDemo1.py from fastapi import FastAPI, UploadFile, File import whisper i…

Visual Studio 的常用快捷键

Visual Studio 作为主流的开发工具&#xff0c;提供了大量快捷键提升编码效率。以下按功能分类整理常用快捷键&#xff0c;涵盖基础操作、代码编辑、调试等场景&#xff08;以 Visual Studio 2022 为例&#xff0c;部分快捷键可在「工具 > 选项 > 环境 > 键盘」中自定…

Triton Server部署Embedding模型

在32核CPU、无GPU的服务器上&#xff0c;使用Python后端和ONNX后端部署嵌入模型&#xff0c;并实现并行调用和性能优化策略。方案一&#xff1a;使用Python后端部署Embedding模型 Python后端提供了极大的灵活性&#xff0c;可以直接在Triton中运行您熟悉的sentence-transformer…

Java动态调试技术原理

本文转载自 美团技术团队胡健的Java 动态调试技术原理及实践, 通过学习java agent方式进行动态调试了解目前很多大厂开源的一些基于此的调试工具。 简介 断点调试是我们最常使用的调试手段&#xff0c;它可以获取到方法执行过程中的变量信息&#xff0c;并可以观察到方法的执…

人工智能-python-OpenCV 图像基础认知与运用

文章目录OpenCV 图像基础认知与运用1. OpenCV 简介与安装OpenCV 的优势安装 OpenCV2. 图像的基本概念2.1. 图像的存储格式2.2. 图像的表示3. 图像的基本操作3.1. 创建图像窗口3.2. 读取与显示图像3.3. 保存图像3.4. 图像切片与区域提取3.5. 图像大小调整4. 图像绘制与注释4.1. …

Windows电脑添加、修改打印机的IP地址端口的方法

本文介绍在Windows电脑中&#xff0c;为打印机添加、修改IP地址&#xff0c;从而解决电脑能找到打印机、但是无法打印问题的方法。最近&#xff0c;办公室的打印机出现问题——虽然在电脑的打印机列表能找到这个打印机&#xff0c;但是选择打印时&#xff0c;就会显示文档被挂起…

告别复杂配置!Spring Boot优雅集成百度OCR的终极方案

1. 准备工作 1.1 注册百度AI开放平台 访问百度AI开放平台 注册账号并登录 进入控制台 → 文字识别 → 创建应用 记录下API Key和Secret Key 2. 项目配置 2.1 添加依赖 (pom.xml) <dependencies><!-- Spring Boot Web --><dependency><groupId>o…

「iOS」——内存五大分区

UI学习iOS-底层原理 24&#xff1a;内存五大区总览一、栈区&#xff08;Stack&#xff09;1.1 核心特性1.2 优缺点1.3函数栈与栈帧1.3 堆栈溢出风险二、堆区&#xff08;Heap&#xff09;;2.1 核心特性2.2 与栈区对比三、全局 / 静态区&#xff08;Global/Static&#xff09;3.…

每日一题【删除有序数组中的重复项 II】

删除有序数组中的重复项 II思路class Solution { public:int removeDuplicates(vector<int>& nums) {if(nums.size()<2){return nums.size();}int index 2;for (int i 2; i < nums.size();i ) {if(nums[i] ! nums[index-2]) {nums[index]nums[i];}}return ind…

兼容性问题记录

1、dialog设置高度MATCH_PARENT全屏后&#xff0c;三星机型和好像是一加&#xff0c;会带出顶部状态栏&#xff0c;设置隐藏状态栏属性无效。解决方法&#xff1a;高度不设置为MATCH_PARENT&#xff0c;通过windowmanager.getdefaultdisplay来获取并设置高度&#xff0c;再设置…

6.数组和字符串

在C语言中&#xff0c;数组和字符串是基础且重要的概念。它们用于存储和操作一系列相同类型的元素或字符序列。数组1. 数组定义与初始化数组是一系列相同类型的数据项的集合&#xff0c;这些数据项可以通过一个共同的名字来引用。数组中的每个元素都有一个索引&#xff08;也称…

odoo代码分析(一)

Odoo 是一套基于网络的开放式源代码商业应用套件,既可以作为独立应用运行,也可以作为集成的全功能 ERP 系统使用。Odoo 平台采用模块化架构,允许组织根据自身需求起步,并在需求增长时扩展功能。 什么是 Odoo? Odoo 提供了一个完整的商业应用生态系统,包括: 客户关系管…

从“人工眼”到‘智能眼’:EZ-Vision视觉系统如何重构生产线视觉检测精度?

制造业是我国实体经济的基础&#xff0c;是国内经济增长的重要引擎。制造业智能化建设是当下的必然趋势&#xff0c;然而目前依旧有很多中小型企业因为成本原因&#xff0c;无法加快智能化制造的步伐。在智能检测领域更是如此&#xff0c;很多企业依旧在采用人工检测&#xff0…

Etcd原理基础学习

etcd 是一个开源的分布式键值存储系统&#xff0c;专注于提供高可用性、强一致性的数据存储与访问&#xff0c;广泛应用于分布式系统的服务发现、配置管理和协调任务。以下是其核心特性和应用场景的详细介绍。接下来就看看Etcd如何实现服务注册&#xff0c;以及如何通过Raft算法…

【硬件-笔试面试题】硬件/电子工程师,笔试面试题-32,(知识点:模数转换器,信噪比,计算公式,)

目录 1、题目 2、解答 步骤一&#xff1a;明确理想 ADC 的信噪比公式 步骤二&#xff1a;推导公式的来源 步骤三&#xff1a;得出答案 3、相关知识点 一、信噪比&#xff08;SNR&#xff09;的定义 二、理想 ADC 的量化噪声 三、满量程正弦波信号的功率 四、信噪比公…

Redis过期数据的删除策略是什么?有哪些?

定时删除&#xff1a;- 每个设置了TTL的key中都会创建一个计时器&#xff0c;等到过期时间就会立即删除- 对内存友好&#xff0c;但是会占用大量的CPU资源去处理过期数据&#xff0c;从而影响缓存的吞吐量和响应时间惰性删除&#xff1a;- 设置了key的过期后&#xff0c;不会立…

linux dd命令详解

dd 是一个功能强大的 Unix/Linux 命令行工具&#xff0c;用于低级别的字节流操作&#xff0c;常用于创建、复制、转换和处理文件或设备数据。它在 macOS 和 Linux 系统上都可用&#xff0c;但在 macOS 上有一些细微差异。本文将详细讲解 dd 命令的用法&#xff0c;包括参数、常…

多线程同步技术是用于协调多个线程访问共享资源或执行顺序的机制,以避免数据竞争、死锁、线程不安全等问题

多线程同步技术是用于协调多个线程访问共享资源或执行顺序的机制,以避免数据竞争、死锁、线程不安全等问题。 在提供的代码中,存在多线程操作加热板的场景,涉及锁竞争和硬件资源访问,优化多线程同步可以显著提升程序性能和稳定性。 以下是多线程同步技术的详细解释、常见…

CRMEB标准版,从创建数据表到实现最基础增删改查的实现过程

很多使用了CRMEB单商户系统的童鞋在进行二开的时候&#xff0c;都会遇到新建了数据表之后不知道对数据表怎么进行操作。那么&#xff0c;这篇文章将带你完整的实现一遍&#xff0c;以后就不会怕啦。一、创建数据表就以最简单的为例&#xff0c;创建一个学生的信息表编号姓名性别…

J2EE模式---数据访问对象模式

数据访问对象模式基础概念数据访问对象模式&#xff08;Data Access Object Pattern&#xff0c;简称 DAO 模式&#xff09;是一种结构型设计模式&#xff0c;其核心思想是将数据访问逻辑与业务逻辑分离&#xff0c;通过一个抽象层&#xff08;DAO&#xff09;来处理数据的持久…