当前位置: 首页 > news >正文

【Java】String 全套高频面试题详解

大家好,我是程序员二叉。


简介

本文整理 Java 字符串模块经典面试考点,包含 == 与 equals、hashCode、toString、String 不可变特性、常量池、intern 方法、字符串拼接、String/ StringBuffer/ StringBuilder 区别等核心知识点,内容精简、直击考点,适合面试复习与日常学习。欢迎点赞收藏关注。


1. == 和 equals 有什么区别

  • ==
    基本数据类型:比较值是否相等
    引用数据类型:比较内存地址是否相同
  • equals()
    默认:和 == 一样,比较对象地址
    重写后:比较对象内容是否相等(如String、Integer)

2. 为什么重写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[] value
  • JDK9及以后:byte数组+编码标识private final byte[] value节约内存

6. String为什么不可变?不可变优势是什么

不可变原因

  • value数组被final修饰
  • 类被final修饰,不能继承,无setter方法
  • 所有修改操作都会返回新String对象

优势

  1. 线程安全,多线程无风险
  2. 字符串常量池复用,节约内存
  3. 哈希值可缓存,提升HashMap效率
  4. 安全(避免密码、token被篡改)

7. String s = new String(“abc”) 创建了几个对象

  • 1个或2个
  1. 常量池无"abc":先创建常量池对象 → 再创建堆对象 →2个
  2. 常量池已有"abc":只创建堆对象 →1个

8. String s=“a”+“b”+“c” 创建了几个对象

  • 编译器优化:直接合并为"abc"
  • 常量池无则创建1个,有则0个 →最终1个或0个

9. +号拼接字符串的底层原理

  • 变量拼接(如s1+s2):底层自动创建StringBuilder调用append()
  • 常量拼接:编译器直接优化为完整字符串
  • 循环中慎用+:会创建大量StringBuilder,效率低

10. String的hashCode()如何实现

publicinthashCode(){inth=hash;if(h==0&&value.length>0){for(bytev:value){h=31*h+v;}hash=h;}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 必须重写 hashCode
  • String 不可变 = final + 数组私有 + 无修改方法
  • new String 可能创建 1~2 个对象,纯常量 + 编译器直接合并
  • 字符串拼接优先 StringBuilder,循环禁止直接用 +
  • 比较字符串内容必须用 equals
  • 单线程首选 StringBuilder,多线程用 StringBuffer
http://www.jsqmd.com/news/968223/

相关文章:

  • 别再手动拼接字符串了!XXL-Job参数传递的3种优雅方案(附SpringBoot实战代码)
  • 技术博客创作指南:从获奖案例看高质量内容的价值与创作方法
  • EMS行业转型:从人力依赖到自动化与供应链韧性构建
  • 芯片测试基石:Open/Short测试原理、实践与陷阱全解析
  • OBS虚拟摄像头终极指南:如何在5分钟内让所有软件用上专业级视频特效
  • HarmonyOS原子化服务开发指南:免安装、跨设备流转与实战避坑
  • 嵌入式Linux开机自动登录root并启动应用:原理、配置与避坑指南
  • 梁灿彬广义相对论习题解答LaTeX源码包(XeLaTeX+VS Code一键配置)
  • 告别副本动画等待:FFXIV ACT CutsceneSkip插件终极指南
  • 好用还专业!AI论文写作工具2026最新测评与推荐
  • 轻松下载B站视频:从大会员4K到充电专属内容
  • 如何快速掌握AKShare:面向新手的完整Python财经数据接口指南
  • Android Studio本地化架构优化:分布式协作方案实现47%效率提升
  • caj2pdf终极指南:轻松实现CAJ转PDF的完整解决方案
  • 普通工程师的七年成长路:从零资源学习到项目驱动求职
  • U盘芯片揭秘:原片、白片、黑片如何影响数据安全与选购
  • KeyboardChatterBlocker:彻底终结键盘连击问题的终极免费解决方案
  • 10美元鼠标秒变苹果妙控板:Mac Mouse Fix如何彻底改变你的Mac鼠标体验
  • SD卡挂载成功却无法访问?从硬件到软件的完整排查与修复指南
  • Java会议议题智能排程练习项目(OptaPlanner实战)
  • MuleSoft实现企业级AI Orchestration的工程实践
  • 嵌入式开发:从芯片选型到需求驱动的设计思维转变
  • 终极指南:如何用AssetStudio轻松提取Unity游戏资源
  • CSDN AI套餐剩余权益顺延决策树(工程师私藏版):输入你的开通时间/到期日/使用状态,秒判可顺延性
  • C语言小工具:输入一个正整数,分行列出它的所有约数并报总数
  • FPGA实现增量式PID控制器:从算法原理到电机控制实践
  • 如何在Windows 11 LTSC系统上3分钟恢复微软商店:终极指南
  • EFT测试中LCD闪屏的系统性解决方案:从机理到工程实践
  • Prompt Engineering中的文本扩展:从模糊指令到结构化生成
  • 深入解析RMS有效值:从概念到电源噪声测量的工程实践