美文网首页
String字符串的坑

String字符串的坑

作者: ae601c79c4fc | 来源:发表于2019-07-21 13:52 被阅读0次

    String的部分源码

    public final class String
        implements java.io.Serializable, Comparable<String>, CharSequence {
        /** The value is used for character storage. */
        private final char value[];
    }
    
    • 由源码可以看出String类被final修饰,所以String类不能被继承。
    • 由private final char value[];可以看出,String字符串的底层其实就是char类型的数组,因为被final修饰,所以char数组的地址不能更改。但是地址上的值通过反射是可以修改的,在下面会有例子。

    面试题1:

    以下代码的输出结果是多少?

    public class TestString { public static void main(String[] args){
    
        // 不可变字符串
    
        String s =" a b ";
    
        s.trim();
    
        System.out.println("!"+s+"!");
    
        }
    
    }
    

    答案:! a b !

    • 由String的源码可以看出,String底层的存储结构是被final修饰的char数组,所以是不可变的,也就是说String是不可变的字符序列(指的是地址不可变),所以使用trim()方法是不可以改变原来的String字符串的,得到的是一个新的字符串。
    • 如果将s.trim();换成s = s.trim();,那么最后的输出结果就是!a b!(去除的两端的空格)。
      扩展
    • String的trim() 方法只能去除英文状态下的空格(半角空格),不能去除中文下的空格(全角空格)。

    怎么改变String字符串的值?

    • String字符串的地址值(就是在内存中的位置)虽然不可以改变,但是地址上的值是可以通过反射机制来进行修改的。
    • 代码如下:
    public class TestFinal {
    
        public static void main(String[] args) throws Exception {
    
            // 不可变字符串
            String s = "a b"; //“a b”
    
            Class<String> stringClass = String.class;
    
            Field value = stringClass.getDeclaredField("value");
    
            value.setAccessible(true);
    
            char[] cs = (char[])value.get(s);
    
            cs[1] = 'd';
    
            System.out.println(s);
    
        }
    
    
    }
    

    输出结果:adb

    相关文章

      网友评论

          本文标题:String字符串的坑

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