Java Object类与String相关高频面试题

张开发
2026/4/7 1:00:29 15 分钟阅读

分享文章

Java Object类与String相关高频面试题
Java Object类与String相关高频面试题一、Object类有哪些方法核心回答11个核心方法按功能分类java.lang.Object是Java所有类的顶级父类所有类默认继承Object核心方法如下方法作用核心考点equals(Object obj)判断两个对象是否相等重写规则、与的区别hashCode()返回对象的哈希码值与equals的契约、哈希表底层toString()返回对象的字符串表示默认格式类名哈希码十六进制建议重写getClass()返回对象的运行时Class对象反射核心final不可重写clone()创建并返回对象的副本浅克隆/深克隆、需实现Cloneable接口finalize()对象被GC回收前调用Java9已废弃不推荐使用wait()/wait(long timeout)/wait(long timeout, int nanos)让当前线程等待释放对象锁线程通信、必须在synchronized中调用notify()唤醒一个等待该对象锁的线程线程通信、随机唤醒notifyAll()唤醒所有等待该对象锁的线程线程通信、全部唤醒补充考点getClass()、notify()、notifyAll()、wait()被final修饰不能被重写equals()、hashCode()、toString()、clone()是可重写的也是面试高频考点finalize()仅执行一次且不保证立即执行Java 9 标记为废弃Java 18 完全移除二、与equals有什么区别核心回答分基本类型/引用类型1.的作用基本数据类型比较的是数值是否相等inta10;intb10;System.out.println(ab);// true数值相等引用数据类型比较的是对象的内存地址是否相等是否是同一个对象Strings1newString(abc);Strings2newString(abc);System.out.println(s1s2);// false两个不同对象地址不同2.equals()的作用equals()是Object类的方法默认实现和完全一致比较对象地址但很多类如String、Integer重写了equals()改为比较对象的内容/值是否相等。System.out.println(s1.equals(s2));// trueString重写了equals比较内容核心区别总结对比维度equals()基本类型比较数值不能用于基本类型只能用于对象引用类型比较内存地址默认比较地址可重写为比较内容可重写性运算符不可重写方法可重写空值处理null null为truenull.equals(obj)抛空指针异常避坑示例String常量池Strings1abc;// 常量池对象Strings2abc;// 复用常量池对象System.out.println(s1s2);// true地址相同System.out.println(s1.equals(s2));// true内容相同三、hashCode()和equals()方法有什么关系核心回答哈希契约面试必背hashCode()和equals()是Object类的两个核心方法必须遵守以下契约否则会导致哈希表如HashMap、HashSet工作异常如果两个对象equals()相等那么它们的hashCode()必须相等如果两个对象hashCode()相等equals()不一定相等哈希碰撞重写equals()时必须重写hashCode()否则违反契约原理说明hashCode()用于哈希表快速定位对象存储位置equals()用于最终确认对象是否相等哈希表的查找流程先通过hashCode()定位桶位置再用equals()在桶内遍历匹配若只重写equals()不重写hashCode()两个内容相等的对象会有不同哈希码导致HashSet认为是两个不同对象存入重复数据代码示例正确重写publicclassUser{privateStringname;privateintage;// 重写equals比较内容Overridepublicbooleanequals(Objecto){if(thiso)returntrue;if(onull||getClass()!o.getClass())returnfalse;Useruser(User)o;returnageuser.ageObjects.equals(name,user.name);}// 必须同时重写hashCodeOverridepublicinthashCode(){returnObjects.hash(name,age);}}四、Java里String的常用方法有哪些核心回答按功能分类高频常用1. 长度/判空length()返回字符串长度isEmpty()判断字符串是否为空长度为0isBlank()Java 11判断字符串是否为空或仅含空白字符2. 查找/获取charAt(int index)获取指定索引的字符indexOf(String str)返回子字符串第一次出现的索引未找到返回-1lastIndexOf(String str)返回子字符串最后一次出现的索引substring(int beginIndex)/substring(int beginIndex, int endIndex)截取子字符串左闭右开3. 转换/格式化toLowerCase()/toUpperCase()转小写/大写trim()去除字符串首尾空白字符Java 11推荐strip()支持Unicode空白split(String regex)按正则表达式分割字符串replace(char oldChar, char newChar)/replaceAll(String regex, String replacement)替换字符/字符串valueOf(xxx)将其他类型转换为字符串静态方法4. 比较/判断equals(Object obj)比较字符串内容区分大小写equalsIgnoreCase(String anotherString)比较内容不区分大小写contains(CharSequence s)判断是否包含指定子字符串startsWith(String prefix)/endsWith(String suffix)判断是否以指定前缀/后缀开头/结尾5. 拼接concat(String str)拼接字符串比效率高底层直接数组复制join(CharSequence delimiter, CharSequence... elements)Java 8用分隔符拼接多个字符串静态方法五、String、StringBuffer、StringBuilder的区别和联系核心回答表格对比原理1. 核心区别对比维度StringStringBufferStringBuilder可变性不可变final修饰的char数组Java9为byte数组可变可变数组无final可变可变数组无final线程安全安全不可变无并发修改安全方法加synchronized修饰不安全无锁性能最低每次修改都创建新对象中等有锁开销最高无锁直接修改数组适用场景少量字符串操作、常量多线程环境下大量字符串操作单线程环境下大量字符串操作继承结构实现Serializable、Comparable、CharSequence继承AbstractStringBuilder实现CharSequence继承AbstractStringBuilder实现CharSequence2. 核心原理String不可变的原因底层存储用private final byte[] valueJava 9final保证数组引用不可变且无对外修改数组的方法因此每次修改如concat、substring都会创建新的String对象避免并发修改问题。StringBuffer/StringBuilder可变的原因继承AbstractStringBuilder底层用byte[] value无final可直接修改数组内容无需创建新对象性能更高。线程安全的区别StringBuffer的所有公共方法都加了synchronized保证多线程安全但带来锁开销StringBuilder无锁单线程下性能是StringBuffer的1.5~2倍。3. 联系三者都实现了CharSequence接口都表示字符序列都可以通过toString()转换为String对象核心操作如append、insert、delete逻辑一致仅线程安全和性能不同代码示例性能对比// 单线程大量拼接StringBuilder最快longstartSystem.currentTimeMillis();StringBuildersbnewStringBuilder();for(inti0;i100000;i){sb.append(a);}longendSystem.currentTimeMillis();System.out.println(StringBuilder耗时(end-start)ms);// 约1ms// StringBuffer次之startSystem.currentTimeMillis();StringBuffersbfnewStringBuffer();for(inti0;i100000;i){sbf.append(a);}endSystem.currentTimeMillis();System.out.println(StringBuffer耗时(end-start)ms);// 约2ms// String最慢startSystem.currentTimeMillis();Stringstr;for(inti0;i100000;i){stra;// 每次创建新对象触发GC}endSystem.currentTimeMillis();System.out.println(String耗时(end-start)ms);// 约1000ms补充考点String的常量池直接赋值的字符串会存入字符串常量池复用对象new String()会在堆中创建新对象同时在常量池生成副本Java 7常量池移到堆中StringBuilder的初始容量默认初始容量16当数组长度不足时会按新容量 旧容量*2 2扩容可通过new StringBuilder(1000)指定初始容量避免频繁扩容Java 9的优化String、StringBuffer、StringBuilder底层从char[]改为byte[] 编码标记节省50%内存Latin1字符仅占1字节六、面试答题技巧Object类方法先分类讲11个方法重点讲equals、hashCode、wait/notify体现对线程和哈希表的理解与equals分基本类型和引用类型结合String常量池示例讲清地址和内容的区别hashCode与equals契约强调“重写equals必须重写hashCode”结合HashMap的底层原理String常用方法按功能分类避免零散罗列重点讲高频方法的使用场景String三兄弟区别用表格对比讲清可变性、线程安全、性能的核心差异结合代码示例

更多文章