• 哲寻面试(部分)(未完全解析)


    睡过头了,挺不好意思的

    • Mysql要实现没有指定数据时自动插入,否则自动更新,应该怎么做?newBing: 使用 insert into … on duplicate key update … 语句,这种方法要求插入的字段有唯一索引或主键

    • 网络传输的大小端序是什么?newbing: 网络传输的大小端序是指在网络上传输数据时,数据的字节顺序是大端字节序(Big Endian)还是小端字节序(Little Endian)。大端字节序是指高位字节在前,低位字节在后,这是人类读写数值的方法。例如,数值 0x12345678 的大端字节序表示为 12 34 56 78。小端字节序是指低位字节在前,高位字节在后,这是计算机内部处理数据的方法。例如,数值 0x12345678 的小端字节序表示为 78 56 34 12。网络传输的大小端序通常是大端字节序

    • CLOSE-WAIT状态是TCP连接中的哪种状态

    • UTF-8编码是什么机制,一个英文字符占几个字节,一个汊字占几个字节?Mysql的UTF-8有什么缺陷吗?newBing:
      UTF-8编码是一种针对Unicode的可变长度字符编码,也是一种前缀码。它可以用一至四个字节对Unicode字符集中的所有有效编码点进行编码,属于Unicode标准的一部分。
      一个英文字符占一个字节,一个汉字占3到4个字节。这是因为英文字符的Unicode码在0x00-0x7F的范围内,只需要一个字节就能表示,而汉字的Unicode码在0x0800-0xFFFF的范围内,需要三个字节才能表示。
      MySQL的UTF-8有一个缺陷,就是它并不是真正的UTF-8,而是阉割版的,最长只有三个字节。这意味着它无法存储那些占四个字节的UTF-8编码,例如emoji字符或者复杂的汉字。这会导致存储异常或乱码。为了解决这个问题,MySQL引入了utf8mb4编码,它是真正的UTF-8编码,可以存储四个字节的UTF-8编码。

    • HTTP转为WebSocket时要发什么命令?newBing: HTTP转为WebSocket时,要发出一个包含Upgrade: websocketConnection: Upgrade等头部字段的HTTP请求,表示申请升级协议¹。服务器若支持WebSocket协议,则返回一个包含Upgrade: websocketConnection: Upgrade等头部字段的HTTP响应,表示同意升级协议。这样,HTTP连接就转为了WebSocket连接。
      ¹: HTML5 WebSocket | 菜鸟教程

    • ThreadLocal用的什么引用?弱引用的含义是什么?现在发起一次垃圾回收,它马上就会被回收吗?

    • Class与Type有什么区别?Type有几种?newBing: Class类实现了Type接口。Type是为了支持泛型而引入的,它可以表示更复杂的类型信息,如参数化类型、类型变量等。作为反射类型的Type有五种,分别是:
      Class:表示具体的类或接口,如String.class, List.class等。
      ParameterizedType:表示参数化类型,如List, Map等。
      TypeVariable:表示类型变量,如T, E, K, V等。
      GenericArrayType:表示泛型数组类型,如T[], List[]等。
      WildcardType:表示通配符类型,如? extends Number, ? super Integer等。

    ParameterizedType的使用示例:

    package type;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.ParameterizedType;
    import java.lang.reflect.Type;
    import java.util.List;
    import java.util.Map;
    
    public class ReflectTestBean {
    	List<String> list1;
    	List list2;
    	Map<String, Integer> map1;
    	Map map2;
    
    	public static void main(String[] args) {
    		Class<ReflectTestBean> cls = ReflectTestBean.class;
    		Field[] fields = cls.getDeclaredFields();
    		for (Field field : fields) {
    			System.out.println(field.getName() + " 是否是泛型:" + (field.getGenericType() instanceof ParameterizedType));
    			if (field.getGenericType() instanceof ParameterizedType) {
    				ParameterizedType fpt = (ParameterizedType) field.getGenericType();
    				Type[] types = fpt.getActualTypeArguments();
    				for (Type t : types) {
    					System.out.print(t + "\t");
    				}
    				System.out.println();
    			}
    		}
    
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    输出结果:

    list1 是否是泛型:true
    class java.lang.String	
    list2 是否是泛型:false
    map1 是否是泛型:true
    class java.lang.String	class java.lang.Integer	
    map2 是否是泛型:false
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
      • 如果定义一个泛型,如何获取泛型的基类?比如List,你派生一个类继承List,你要获取String这个参数类,应该怎么做? 面试官说这个在序列化时经常用到。
    • sleep方法与join方法有什么区别?相关知识:sleep方法不会释放锁,而join方法底层调用的是Object.wait方法,所以会释放锁。

    • 在一个while(true)的死循环里调用Thread.interrupt方法,线程会中断吗? newBing(未校验):线程的中断效果取决于线程本身的状态和处理方式:
      如果线程处于被阻塞状态(例如sleep, wait, join等),那么线程会立即退出被阻塞状态,并抛出一个InterruptedException异常。
      如果线程处于正常活动状态,那么会将该线程的中断标志设置为true,但线程会继续运行,除非线程自己检查中断标志并做出相应的处理。

    • IO多路复用的一个关键类叫Selector, 它可以让一个线程监控多个Channel的可读写事件。

    • Stream流API熟悉吗?如果现在有一堆学生对象,每个学生对象有班级属性,要实现学生按班级分组,最终得到一个Map, Map的key为班级,value为对应的学生列表,如何做?

    • CompleteFuture用过吗,它的底层是什么线程池?参考答案1ForkJoinPool.commonPool() CompleteFuture执行中遇到异常可以怎么处理

    • 使用Guava作为内存缓存时,如何保证数据库与它的一致性?newBing: 使用 CacheLoader 来加载数据,当缓存中不存在数据时,会自动调用 load 方法从数据库中获取,并写入缓存。这样可以保证缓存中的数据是最新的。
      使用 expireAfterWrite 或 expireAfterAccess 来设置缓存的过期时间,当缓存中的数据超过一定时间没有被写入或访问时,会自动失效,下次读取时会重新从数据库中获取。
      使用 maximumSize 或 maximumWeight 来设置缓存的最大容量或权重,当缓存中的数据达到或接近最大值时,会根据最近最少使用(LRU)算法清除一些缓存项,释放空间。
      使用 invalidate 或 invalidateAll 方法来显式清除缓存中的某个键或全部键,当数据库中的数据发生变化时,可以手动删除对应的缓存项。

    • Spring默认的序列化工具是Jackson,如果想换成Gson或者FastJson应该怎么做?newBing: 如果想换成Gson或者FastJson,你需要先移除SpringBoot默认的jackson依赖,然后添加Gson或者FastJson的依赖。你还需要提供自定义的HttpMessageConverter来配置Gson或者FastJson的特性。
      SpringBoot - Jackson、Gson、fastJson返回JSON数据 - CSDN博客

    • 如果Spring想让所有Controller的入参继承同一个基类,比如可以统一在这个基类做校验入参合法性等,应该如何实现?

    • AOP表达式里切所有Controller类,表达式应该怎么写?newBing: 使用@annotation注解,匹配所有带有@Controller或者@RestController注解的类。例如:

    @Pointcut(@annotation(org.springframework.stereotype.Controller) || @annotation(org.springframework.web.bind.annotation.RestController))
    
    • 1
    • Spring事务注解失效,可能是哪些原因引起的? newBing:Spring事务注解失效可能有以下几种原因:
      数据库本身不支持事务,比如MySQL的MyISAM引擎
      事务没有被Spring管理,比如没有用@Service或@Component等注解修饰类
      同一类中的自身方法调用,比如this.B(),此时B方法并非是代理类调用,而是直接通过原有的Bean直接调用
      方法不是Public,比如用private或protected修饰
      事物传播性问题,比如使用了PROPAGATION_NOT_SUPPORTED,PROPAGATION_NEVER,PROPAGATION_SUPPORTS这三种传播行为

    • 延时发消息,怎么实现? 答:RocketMQ。问:介绍下DelayedQueue,它支持多线程吗?newBing: DelayedQueue支持多线程,它是一个线程安全的阻塞队列,可以用于生产者消费者模式。DelayedQueue的内部使用了一个优先级队列来存储实现了Delayed接口的对象,并根据对象的剩余延迟时间进行排序。当消费者从队列中取出元素时,只有当元素的延迟时间为0或负数时,才能获取到该元素,否则会阻塞等待 。DelayedQueue可以用于实现定时任务,比如ScheduledThreadPoolExecutor就是利用了DelayedQueue来保存和执行任务。

    • 作为架构师,你有写过哪些出彩的组件


    1. 异步编程利器:CompletableFuture详解 |Java 开发实战 ↩︎

  • 相关阅读:
    腾讯云、阿里云、华为云便宜云服务器活动整理汇总
    java设计模式---策略模式
    linux每处理器内存分配
    Axure RP PC电商平台Web端交互原型模板
    Azure DevOps构建CICD流水线
    python从入门到精通(一)
    【探索AI】十三 深度学习之第2周:深度神经网络(二)参数初始化策略
    《流畅的python》阅读笔记 - 第一章:python数据模型
    RabbitMQ(四)【Docker安装&AMQP协议】
    亚马逊英国站自动洒水器、自动浇花器UKCA认证检测标准
  • 原文地址:https://blog.csdn.net/qq_23204557/article/details/132639406