美文网首页
字符串相关坑

字符串相关坑

作者: 郑捡书 | 来源:发表于2019-04-17 10:04 被阅读0次
    考查的其实是重写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
    

    相关文章

      网友评论

          本文标题:字符串相关坑

          本文链接:https://www.haomeiwen.com/subject/kddnvqtx.html