16、String字符串的存储原理

1、String表示字符串类型,属于引用数据类型,不属于基本数据类型。
2、在Java中随便使用双括号括起来的都是String对象,例如:“abc”、“def”。
3、Java中规定,双引号括起来的字符串,是不可变的,也就是“abc”自出生到最终死亡,不可变。
4、在JDK当中双括号括起来的字符串,例如:“abc”、“def”都是直接存储在方法区的字符串常量池当中的。

为什么把字符串存储在一个“字符串常量池”当中的,因为字符串在开发中使用太频繁。为了执行效率,所以把字符串存储在字符串常量池中。

public class StringTest {
    
    
    public static void main(String[] args) {
    
    
        //这两行代码表示底层创建了3个字符串对象,都在方法区的字符串常量中
        String s1 = "abcdef";
        String s2 = "abcdef" + "xy";
        
        //分析:这是使用new方法创建的字符串对象,这个代码的“xy”是从哪里来的?
        //凡是双引号括起来的都在字符串常量池中有一份。
        //new对象的时候一定在堆内存中开辟了空间。
        String s3 = new String("XY");
        
    }
}

public class StringTest {
    
    
    public static void main(String[] args) {
    
    
        String s1 = "hello";
        //“hello”是存储在方法区的字符串常量池当中的。
        //所以这个"hello"不会创建(因为这个对象已经存在了)
        String s2 = "hello";
        System.out.println(s1 == s2);
        //分析结果是true还是false
        //== 的结果是 true


        String x = new String("xyz");
        String y = new String("xyz");
        //分析结果是true还是false
        System.out.println(x == y);//false

        //通过这个案例,我们知道了,字符串对象之间不能使用“==”
        //“==”不保险,应该使用String类中equals方法。
        //String类已经重写了equals方法,以下的equals方法调用的是Stirng重写的equals方法。
        System.out.println(x.equals(y));


        String k = new String("testString");
        //"String"这个字符串之后能够加.吗?
        //因为"testString"是一个String字符串对象,只要对象都能调用方法。
        System.out.println("testString".equals(k));//建议使用这个方法,因为这个可以避免空指针异常。
        System.out.println(k.equals("testString"));


    }
}

面试题

public class StringTest02 {
    
    
    public static void main(String[] args) {
    
    
     /*
     一共创建了几个对象?
     3个
     方法区字符串中的字符串常量中的hello
     堆内存当中的两个String对象
      */
     
        String s1 = new String("hewllo");
        String s2 = new String("hello");
    }

猜你喜欢

转载自blog.csdn.net/Alopecian/article/details/115255243