站长工具端口,自媒体服务平台,手机app开发软件教程,表白网站制作器一#xff1a; 核心方法 1. 基础判断 / 比较 2. 字符串操作 3. 类型转换 二#xff1a; 注意事项 面试常问考点 1. 不可变性的优点 2. 不可变性的缺点 3. 字符串拼接的性能对比#xff08;面试高频#xff09; 4. equals VS #xff08;面试必考#xff0…一 核心方法1. 基础判断 / 比较2. 字符串操作3. 类型转换二 注意事项 面试常问考点1. 不可变性的优点2. 不可变性的缺点3. 字符串拼接的性能对比面试高频4. equals VS 面试必考5. 常量池相关面试题6. 其他易错点7. 简单总结一 核心方法1. 基础判断 / 比较方法用途示例equals(Object obj)比较字符串内容面试必考abc.equals(abc) → trueequalsIgnoreCase()忽略大小写比较内容Abc.equalsIgnoreCase(abc) → true比较对象地址易错点见上文常量池示例isEmpty()判断是否为空字符串长度为 0.isEmpty() → truecontains(CharSequence s)判断是否包含子串abcd.contains(bc) → truestartsWith(String prefix)判断是否以指定前缀开头abcd.startsWith(ab) → trueendsWith(String suffix)判断是否以指定后缀结尾abcd.endsWith(cd) → true2. 字符串操作方法用途示例length()获取字符串长度abc.length() → 3charAt(int index)获取指定索引的字符索引从 0 开始abc.charAt(1) → bsubstring(int beginIndex)截取子串从 beginIndex 到末尾abcd.substring(1) → bcdsubstring(int begin, int end)截取子串左闭右开abcd.substring(1,3) → bcreplace(CharSequence old, CharSequence new)替换子串abac.replace(a, x) → xbxcreplaceAll(String regex, String replacement)正则替换a1b2.replaceAll(\\d, ) → absplit(String regex)按正则分割成字符串数组a,b,c.split(,) → [a,b,c]trim()去除首尾空白字符JDK 11 用strip() abc .trim() → abctoUpperCase()/toLowerCase()转大写 / 小写Abc.toUpperCase() → ABCconcat(String str)拼接字符串等价于但效率低ab.concat(cd) → abcd3. 类型转换方法用途示例valueOf(Object obj)将任意类型转为字符串静态方法String.valueOf(123) → 123toCharArray()转为字符数组abc.toCharArray() → [a,b,c]getBytes()转为字节数组默认编码abc.getBytes() → [97,98,99]parseXxx(String s)字符串转基本类型如Integer.parseInt()Integer.parseInt(123) → 123二 注意事项 面试常问考点1. 不可变性的优点线程安全不可变对象天生线程安全无需同步可哈希哈希值缓存hashCode()计算一次后缓存适合作为 HashMap 的键常量池复用节省内存。2. 不可变性的缺点频繁修改字符串如拼接会创建大量临时对象导致性能下降、GC 压力大。✅ 解决方案使用StringBuilder非线程安全或StringBuffer线程安全效率低。3. 字符串拼接的性能对比面试高频结论少量拼接用 即可 代码简洁循环 / 大量拼接必须使用StringBuilder// 方式1 拼接编译后自动优化为 StringBuilder但循环中仍低效 String s ; for (int i 0; i 1000; i) { s i; // 每次循环创建新 StringBuilder 和 String 对象 } // 方式2手动使用 StringBuilder推荐 StringBuilder sb new StringBuilder(); for (int i 0; i 1000; i) { sb.append(i); // 仅操作一个对象无临时垃圾 } String result sb.toString();4. equals VS 面试必考equals:String 重写了Object的equals方法比较字符串内容是否相等空指针规避推荐用常量字符串调用equals如(abc).equals(s)避免s为null时抛异常。:比较对象的内存地址引用是否指向同一对象对于基本类型比较值对于引用类型比较地址。5. 常量池相关面试题问题1:String s new String(abc)创建了几个对象✅答案1 个或 2 个若常量池已存在 abc → 仅在堆创建 1 个对象若常量池无 abc → 先在常量池创建 1 个再在堆创建 1 个共 2 个。问题2:String s1 a b c;和String s2 abc;是否相等✅答案相等s1 s2 → true原因编译期优化abc直接拼接为 abc存入常量池s1 和 s2 指向同一对象。问题3:String s1 new String(a) new String(b);s1.intern();String s2 ab;s1 s2✅JDK 1.7 答案trueintern () 不再复制对象而是将堆对象的引用存入常量池✅JDK 1.6 答案falseintern () 复制常量到永久代s2 指向永久代对象s1 指向堆对象问题4为什么 StringBuilder 比 StringBuffer 快StringBuffer 的所有核心方法如append、insert都被synchronized修饰保证多线程安全但加锁 / 解锁会带来性能开销StringBuilder 去掉了同步锁单线程下效率更高是日常开发的首选问题5什么时候用StringBuffer?仅当多线程环境下需要修改字符串时使用如多线程日志拼接、多线程生成动态字符串单线程场景下用 StringBuilder 即可没必要为线程安全付出性能代价。问题6String 、 StringBuilder、StringBuffer 选型原则面试必答✅答案字符串操作场景下是否需要频繁修改否仅赋值 / 比较用String是拼接 / 修改思考是否是多线程是用StringBuffer否用StringBuilder问题7以下代码在循环中拼接字符串哪种效率最高为什么// 方式1 String s ; for (int i 0; i 10000; i) { s i; } // 方式2 StringBuffer sb new StringBuffer(); for (int i 0; i 10000; i) { sb.append(i); } // 方式3 StringBuilder sb new StringBuilder(10000); for (int i 0; i 10000; i) { sb.append(i); }✅答案方式3效率最高方式 1s i编译后会自动创建 StringBuilder但每次循环都新建一个产生大量临时对象GC 压力大方式 2StringBuffer 是线程安全的但加锁导致效率低于方式 3方式 3手动创建 StringBuilder 且指定初始容量无锁、无扩容开销效率最高。6. 其他易错点String是引用类型不是基本类型面试常考区分nullvs 空字符串null表示对象不存在表示对象存在但内容为空调用null的equals/length()会抛NullPointerExceptionsplit方法的正则陷阱如分割.需要转义split(\\.)分割|需要split(\\|)JDK 9 优化String 底层从char[]改为byte[] 编码标识LATIN-1 占 1 字节UTF-16 占 2 字节节省内存。7. 简单总结核心特性String 是不可变的字符序列底层依赖字符 / 字节数组通过常量池实现内存复用核心用法重点掌握equals、substring、replace、split等方法区分和equals的使用场景面试重点不可变性原理、常量池机制、字符串拼接性能vsStringBuilder、intern()方法的作用核心区别String不可变StringBuilder 非线程安全高效StringBuffer 线程安全低效选型原则单线程大量修改StringBuilder多线程用StringBuffer少量操作 / 常量用String性能优化创建StringBuilder / StringBuffer 时指定初始容量避免频繁扩容