考查的其实是重写equals()
String s1 = "abc";
StringBuffer s2 = new StringBuffer(s1);
// false,String的equals()会进行类型判断,非String类型直接返回false
System.out.println("丢1" + s1.equals(s2));
// false,StringBuffer没有重写Object的equals()方法,比较的是内存地址,一定不相等
System.out.println("丢2" +s2.equals(s1));
// true,StringBuffer的toString()会new出一个String,而String的equals是比较内容
System.out.println("丢3" +s2.toString().equals(s1));
// false,StringBuffer的toString()会new出一个String,new出来的内存地址一定不相等
System.out.println("丢4" + (s2.toString() == s1));
String、StringBuffer、StringBuilder 的区别是什么?
String 是字符串常量
,StringBuffer 和 StringBuilder 都是字符串变量
,后两者的字符内容可变,而前者创建后内容不可变;StringBuffer 是线程安全的,而 StringBuilder 是非线程安全
,线程安全会带来额外的系统开销,所以 StringBuilder 的效率比 StringBuffer 高
;String 的每次修改操作都是在内存中重新 new 一个对象出来,而 StringBuffer、StringBuilder 则不用,且提供了一定的缓存功能
,默认 16 个字节数组的大小,超过默认的数组长度时扩容为原来字节数组的长度 * 2 + 2,所以使用 StringBuffer 和 StringBuilder 时可以适当考虑下初始化大小,以便通过减少扩容次数来提高代码的高效性。
String str1 ="123";
// 看源码,0直接返回本身
System.out.println("123" == str1.substring(0)); //3,true
// 其余会返回一个新new出来的对象
System.out.println("23" == str1.substring(1)); //4,false
网友评论