每日八股day1 ### 本系列帖子为鼠鼠复习八股巩固记忆和个人理解所写如有错误纯属本人实力不佳欢迎各位大佬阅读指正 ###1 String StringBuilder String Buffer 的区别String 核心特性不能更改当字符串对象创建后进行拼接.截取.替换等操作时会创建一个新的String对象原本的String对象不发生修改若有大批量字符串进行以上操作时会导致频繁创建对象使其影响性能再线程安全性上由于不对本身进行操作所以天然安全String Builder 核心特性可以更改但线程不安全由于方法没有添加synchronized(同步锁)导致在并发场景多线程同时操作会导致数据错乱但正因为没有锁的加入性能上更加优StringBuffer :核心特性可以更改线程安全绝大部分方法已经被同步锁修饰但因加入了锁会有响应的性能开销导致性能略差与StringBuilder追问String为什么不设计为可变的呢1.线程安全不可变对象线程并发访问无需同步所以不会出现类似线程安全问题2.哈希码可以缓存提高HashMap性能不可变是String适合做Map Key 的根本原因String内部会缓存hashCode只计算一次后续直接复用3.字符串常量池复用JVM中一块专门区域大幅节省内存因为不可变相同可直接共享同一个对象4安全性高文件路径网络URL也是String传递不可变可以防止被修改保证安全2.String s new String (abc) 创建了几个对象String sabc; 创建了几个对象String s new String (abc)在执行时只要有双引号就回去常量池寻找如果没有则在常量池创建一个同时new String 又创造一个String实例 所以如果常量池没有则创建两个如果有则创建一个。String sabc; 常量池无则创建一个有则不用创建。注这种abc 常量常量形式会先将拼接为abc若是变量变量/变量常量会创建一个Stringbuilder只做append最后toString生成一个String但在循环中不要使用进行拼接会导致反复创建StringBuilder导致性能问题可在循环外创建一个Stringbuilder循环内使用append即可3.如何比较两个字符串的内容是否相等为什么不能用 使用 equals () 方法,String类已经重写了Object的equals()方法不是比较地址而改为逐个比较字符内容比较的是变量保存的内存地址不是字符串内容对于基本类型 int char....比较的值对于引用类型对象 String...比较的是内存地址如果使用会出现即时两个字符串内容相同仍然出现false现象本质上是因为两个对象的地址不相同无法实现比较字符串内容故使用equals方法4.intern () 方法的作用它是String类中的一个本地方法核心作用把当前字符串对象加入到字符串常量池并返回常量池中的对应实例效果保证内容相同的字符串全局公用一个对象存在原因有些字符串运行时才知道内容无法直接写字面量同时new String不能自动进池所以使用intern使其进池复用。注只有 ... 双引号写死的字符串JVM 才会自动放进常量池。凡是 运行时算出来、拼出来、new 出来 的字符串都不会自动进池。