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

睡过头了,挺不好意思的

  • 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();
			}
		}

	}
}

输出结果:

list1 是否是泛型:true
class java.lang.String	
list2 是否是泛型:false
map1 是否是泛型:true
class java.lang.String	class java.lang.Integer	
map2 是否是泛型:false

    • 如果定义一个泛型,如何获取泛型的基类?比如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))
  • 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 开发实战 ↩︎

你可能感兴趣的:(面试,spring相关,java基础,大小端,UTF-8,Type,泛型,反射,join,CompleteFuture)