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

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

相关推荐
xmjd msup7 小时前
spring security 超详细使用教程(接入springboot、前后端分离)
java·spring boot·spring
952367 小时前
SpringBoot统一功能处理
java·spring boot·后端
有一个好名字7 小时前
工具即双手 —— 从 Bash 到 Tool Dispatch Map
开发语言·chrome·bash
Lyyaoo.7 小时前
优惠券秒杀业务分析
java·开发语言
消失的旧时光-19437 小时前
统一并发模型:线程、Reactor、协程本质是一件事(从线程到协程 · 第6篇·终章)
java·python·算法
勿忘初心12217 小时前
Java 国密 SM4 加密工具类实战(Hutool + BouncyCastle)|企业级数据加密 + 兼容 JDK8
java·数据安全·数据加密·后端开发·企业级开发·国密 sm4
庞轩px8 小时前
第8篇:原子类与CAS底层原理——无锁并发的实现
java·cas·乐观锁·aba·无锁编程·自旋
rleS IONS8 小时前
SpringBoot中自定义Starter
java·spring boot·后端
DevilSeagull8 小时前
MySQL(2) 客户端工具和建库
开发语言·数据库·后端·mysql·服务
苍煜8 小时前
慢SQL优化实战教学
java·数据库·sql