一.HTTP协议
1.1协议
1.2状态码
1.2.1 成功
200 OK:请求成功,最常见
1.2.2重定向(页面 / 资源跳转)
- 301 Moved Permanently:永久重定向(旧网址换新)
- 302 Found:临时重定向
- 304 Not Modified :资源未修改,使用缓存(高频)
1.2.3客户端错误(前端 / 用户的问题)
- 301 Moved Permanently:永久重定向(旧网址换新)
- 302 Found:临时重定向
- 304 Not Modified :资源未修改,使用缓存(高频)
1.2.4客户端错误(前端 / 用户的问题)
- 400 Bad Request:请求参数错误
- 401 Unauthorized :未登录、身份验证失败(JWT 过期就是这个)
- 403 Forbidden:登录了,但没权限访问
- 404 Not Found:资源不存在
- 405 Method Not Allowed:请求方法错误(GET/POST 用反)
二.equals,==,String,compareTo,BigDecimal
2.1String
2.1.1一个常见笔试题

选A,B
注意:
A:s1.compareTo(s3)返回的是数字-1,0,1。而不是true,false。这里s1.compareTo(s3)返回0,代表相等,与0 ==
2.1.2++和concat的区别

2.1.3 ++ new String("stringContent")的时候不会合成一个常量值,而是像new一样
- 这里的
+连接中包含了new String("llo"),这是一个运行时创建的对象,不是编译期可知的常量。 - 编译器不会对包含
new表达式的字符串拼接做常量优化,而是在运行时通过StringBuilder拼接,最终生成一个新的堆上 String 对象。 - 所以
str2指向的是堆中新创建的"hello",和str1指向的常量池对象地址不同。
2.2 equals() : 引用类型的比较
2.2.1java.lang.object.equals()源码
java
public boolean equals(Object obj) {
return (this == obj);
}
如果不重写equals方法,本质就是==(equals比较的是引用类型的变量,如果不重写equals方法,那么实质上就是比较引用的地址(栈存的地址),跟==一样)

2.3整数类Integer的 ==
在[-128,127]的范围内,整数包装类可以复用。
2.4整形包装类跟int比较
* Integer包装类,在[-128,127]区间内的值,会缓存,不会创建新的对象
* 1.整数包装类[-128,127]跟int 一样
* 2.包装类比大小用equals()
* 3.Integer 和 Integer 比较 → 比地址。 而Integer 和 int 比较 → 自动拆箱,比数值!
2.5BigDecimal的比较
2.5.1BigDecimal不可以使用new BigDecimal(double d) -- 会丢失精度

2.5.2BigDecimal需要使用new BigDecimal(String value)赋值

2.5.3BigDecimal的等值比较优先使用compareTo()而不是equals() -- equals()会丢失精度

三.反射可获取信息的速查(类级别的)
3.1、反射 一定能获取 的(✅)
- 类名、包名
- 父类、接口
- 字段(成员变量)
- public、protected、private、default 都能拿
- 方法
- public、protected、private、default 都能拿
- 构造方法
- 注解(运行时保留的)
- 修饰符(public/private/static/final)
一句话:类上面定义的所有结构,反射都能拿到!
3.2、反射 绝对拿不到 的(❌)
- 局部变量(方法内部的变量)
- 方法内部的代码逻辑
- 临时变量
- 方法执行时的内部状态
一句话:方法运行时才有的东西,反射拿不到!
3.3、笔试最常考的 3 个坑(背会)
- private 方法 / 字段 → 反射能拿到 ✅
- 局部变量 → 反射拿不到 ❌
- 注解 → 反射能拿到 ✅
四.IO流序列化

五.线程
5.1线程进入Dead态的几种方式
线程会以下面三种方式结束,结束后就是死亡状态。
正常结束
run()或 call()方法执行完成,线程正常结束。
异常结束
线程抛出一个未捕获的 Exception 或 Error。
调用 stop
直接调用该线程的 stop()方法来结束该线程。该方法通常容易导致死锁,不推荐。

5.2sleep()和wait()方法的区别?
sleep()属于Thread类的,而wait()属于Object类
最重要的区别:sleep()没有释放锁,而wait()释放了锁,进入等待此对象的等待锁定池,只有针对此对象调用 notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态
wait(),notify()和notifyAll()只能在同步控制方法或者同步代码块里面使用,而sleep()可以在任何地方使用
wait()是实例方法,sleep()是静态方法
-
sleep()
- Thread 类的方法
- 抱着锁睡觉
- 不释放锁!不释放资源!
- 时间到自己醒
- 不需要 synchronized
- notify唤醒不了sleep()的线程
- 一定是有限等待
-
wait()
- Object 类的方法
- 主动释放锁!释放资源!
- 进入等待队列
- 必须被 notify/notifyAll 唤醒
- 必须在 synchronized 里面用
- notify唤醒的对象就是wait的线程
- 可能是有限等待,可能是无限等待
5.3Thread类的方法
1. start()
- 启动线程,让线程进入就绪态
- 不会立即运行,等 CPU 调度
- 不能多次调用,否则报错
2. run()
- 线程的业务逻辑写在这里
- 直接调用 run () = 普通方法调用,不开启新线程
- 真正开启线程必须用 start()
3. sleep(long millis)
- 静态方法
- 当前线程休眠指定时间
- 抱着锁睡觉,不释放锁
- 进入 TIMED_WAITING
4. join()
- 调用线程等待该线程执行完毕再继续
- 比如:A 调用 B.join () → A 等 B 跑完
5. yield() -- yield:让行
- 静态方法
- 当前线程让出 CPU,回到就绪态
- 不释放锁
- 只是 "礼让一下",可能马上又被调度
6. interrupt()
- 中断线程
- 不是立刻停止
- 只是设置一个中断标志
- 让 sleep /wait 抛出异常退出
- interrupt () → 强制叫醒它们,让程序可以正常退出!
7.举例子
线程:我要睡 10 分钟!
程序:不行!现在要关闭服务了!
程序:t.interrupt() → 叫醒!
线程:立刻醒 → 抛异常 → 退出