[Java笔试]易错点总结

一.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、反射 一定能获取 的(✅)

  1. 类名、包名
  2. 父类、接口
  3. 字段(成员变量)
    • public、protected、private、default 都能拿
  4. 方法
    • public、protected、private、default 都能拿
  5. 构造方法
  6. 注解(运行时保留的)
  7. 修饰符(public/private/static/final)

一句话:类上面定义的所有结构,反射都能拿到!


3.2、反射 绝对拿不到 的(❌)

  1. 局部变量(方法内部的变量)
  2. 方法内部的代码逻辑
  3. 临时变量
  4. 方法执行时的内部状态

一句话:方法运行时才有的东西,反射拿不到!


3.3、笔试最常考的 3 个坑(背会)

  1. private 方法 / 字段 → 反射能拿到 ✅
  2. 局部变量 → 反射拿不到 ❌
  3. 注解 → 反射能拿到 ✅

四.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() → 叫醒!

线程:立刻醒 → 抛异常 → 退出

相关推荐
linweidong26 分钟前
中科闻歌Java面试题及参考答案
java·python·大模型·提示词·ai agent·mcp·rag原理
OpenAnolis小助手32 分钟前
一句话看透 JVM,SysOM 诊断 Skill 新增 Java 应用诊断能力
java·开发语言·jvm·阿里云·操作系统控制台·sysom
小玮看世界34 分钟前
[Python]OD算法在OD实际运用转化参考清单
开发语言·python·算法
ForteScarlet1 小时前
Kotlin 2.4.20 现已发布,新特性多不多?
android·java·开发语言·开源·kotlin·jetbrains
萧瑟余晖1 小时前
Java深入解析篇六十二之安全机制详解
java·开发语言
小刘在重生~1 小时前
Java 常用类|包装类 装箱拆箱、Integer 缓存面试题
java·python·缓存
Orange_sparkle1 小时前
Pi Agent vs LangGraph:从人机交互、企业 RAG 到持久化工作流的完整选型指南
java·网络·人机交互
菜鸟~noob2332 小时前
【电子战】 第01篇:噪声、门限与虚警/检测概率(PFA/PD)【含matlab代码】
开发语言·matlab
奇牙coding1232 小时前
GPT-6-Astra API 接入教程:OpenRouter 路由配置 + Python/curl 示例 + 静默降级踩坑
开发语言·python·gpt·ai
lzx_0023 小时前
C++11(一)
开发语言·c++·算法