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

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

相关推荐
crescent_悦1 小时前
C++:Invert a Binary Tree
开发语言·c++
SimonKing1 小时前
企微、QQ统统接入OpenClaw,蓄水池已满,准备养虾
java·后端·程序员
:1212 小时前
java---过滤器,监听器
java·开发语言
2401_873204652 小时前
C++与Docker集成开发
开发语言·c++·算法
实心儿儿2 小时前
C++ —— map和set的使用
开发语言·c++
j_xxx404_2 小时前
力扣--分治(归并排序)算法题II:计算右侧小于当前元素的个数,翻转对(无痛通关困难题)
开发语言·数据结构·c++·算法·leetcode
娇娇yyyyyy2 小时前
QT编程(16): Qt Model
开发语言·qt
洛阳泰山2 小时前
我用 Java 21 虚拟线程重写了一个 RAG 平台:从架构设计到踩坑实录
java·人工智能·后端
setmoon2142 小时前
多协议网络库设计
开发语言·c++·算法