大家好我是程序员二叉。简介本文整理 Java 字符串模块经典面试考点包含 与 equals、hashCode、toString、String 不可变特性、常量池、intern 方法、字符串拼接、String/ StringBuffer/ StringBuilder 区别等核心知识点内容精简、直击考点适合面试复习与日常学习。欢迎点赞收藏关注。1. 和 equals 有什么区别基本数据类型比较值是否相等引用数据类型比较内存地址是否相同equals()默认和 一样比较对象地址重写后比较对象内容是否相等如String、Integer2. 为什么重写hashCode就要重写equals规范约定equals相等的两个对象hashCode必须相等不重写会导致HashMap/HashSet等集合无法正常工作集合判断逻辑先比较hashCode → 再比较equals → 决定是否视为同一对象3. toString() 方法的作用是什么为什么建议重写作用返回对象的字符串表示形式默认输出 类名哈希值无实际业务意义重写好处打印对象时直接看到属性值方便调试、日志输出4. hashCode相同equals一定为true吗反过来呢hashCode相同 → equals不一定为true哈希冲突equals为true → hashCode一定相同强制规范5. String的底层是怎么实现的JDK8及以前char数组存储private final char[] valueJDK9及以后byte数组编码标识private final byte[] value节约内存6. String为什么不可变不可变优势是什么不可变原因value数组被final修饰类被final修饰不能继承无setter方法所有修改操作都会返回新String对象优势线程安全多线程无风险字符串常量池复用节约内存哈希值可缓存提升HashMap效率安全避免密码、token被篡改7. String s new String(“abc”) 创建了几个对象1个或2个常量池无abc先创建常量池对象 → 再创建堆对象 →2个常量池已有abc只创建堆对象 →1个8. String s“a”“b”“c” 创建了几个对象编译器优化直接合并为abc常量池无则创建1个有则0个 →最终1个或0个9. 号拼接字符串的底层原理变量拼接如s1s2底层自动创建StringBuilder调用append()常量拼接编译器直接优化为完整字符串循环中慎用会创建大量StringBuilder效率低10. String的hashCode()如何实现publicinthashCode(){inthhash;if(h0value.length0){for(bytev:value){h31*hv;}hashh;}returnh;}公式s[0]*31^(n-1) s[1]*31^(n-2) ... s[n-1]11. 如何比较字符串内容相等为什么不能用 正确方式equals() 比较地址常量池复用可能地址相同但非常量字符串地址不同业务需求比较内容不是比较内存地址12. 字符串常量池工作原理存放编译期确定的字符串字面量相同内容字符串共用一份节约内存位置JDK7 移到堆内存13. intern () 方法的作用将字符串加入常量池池中已存在返回池中的对象引用池中不存在将当前字符串引用入池并返回作用大量重复字符串时节约内存14. String、StringBuffer、StringBuilder 区别类型可变线程安全效率String不可变安全最低StringBuffer可变安全synchronized中等StringBuilder可变不安全最高使用场景少量操作 / 常量String多线程大量拼接StringBuffer单线程大量拼接StringBuilder推荐总结面试必背 比地址 / 值equals 比内容重写后重写 equals 必须重写 hashCodeString 不可变 final 数组私有 无修改方法new String 可能创建 1~2 个对象纯常量 编译器直接合并字符串拼接优先 StringBuilder循环禁止直接用 比较字符串内容必须用 equals单线程首选 StringBuilder多线程用 StringBuffer