String类-字符串对象

Java JDK中内置的一个类:java.lang.String

1、String字符串类型,属于引用数据类型。

2、在java中随便使用双引号括起来的都是String对象。例如:"abc","def","hello world!",这是3个String对象。

3、java中规定,双引号括起来的字符串,是不可变的,"abc"自出生到最终死亡,不可变。

4、在JDK当中双引号括起来的字符串,例如:"abc" "def"都是直接存储在“方法区”的“字符串常量池”当中的

5、为什么SUN公司把字符串存储在一个“字符串常量池”中。因为字符串在实际的开发中使用太频繁。为了执行效率, 所以把字符串放到了方法区的字符串常量池当中。

6、String s1 = "abcdef";  s1里面保存的不是字符串,是字符串的内存地址(对象的内存地址,一个字符串就是一个对象)

public class StringTest01 {
    public static void main(String[] args) {
        // 这两行代码表示底层创建了3个字符串对象,都在字符串常量池当中。
        String s1 = "abcdef";
        String s2 = "abcdef" + "xy";

        // 使用new的方式创建的字符串对象:"xy"
        // new对象在堆内存当中开辟空间。但在双引号括起来的字符串常量池中有一份。new出来之后的对象地址指向常量池中的xy
        String s3 = new String("xy");

        // i变量中保存的是100这个值。
        int i = 100;
        
        // s变量中保存的是字符串对象的内存地址。
        // s引用中保存的不是"abc",是0x1111
        // 而0x1111是"abc"字符串对象在“字符串常量池”当中的内存地址。
        String s = "abc";
    }
}

/*
分析以下程序,一共创建了几个对象
 */
public class StringTest02 {
    public static void main(String[] args) {
        /*
        一共3个对象:
            方法区字符串常量池中有1个:"hello"
            堆内存当中有两个String对象。
            一共3个。
         */
        String s1 = new String("hello");
        String s2 = new String("hello");
    }
}

 

 

 

public class StringTest02 {
    public static void main(String[] args) {
        String s1 = "hello";
        // "hello"是存储在方法区的字符串常量池当中;这个"hello"不会新建。(已经存在)
        String s2 = "hello";
         // 分析结果是true还是false?
        // == 双等号比较的是变量中保存的内存地址
        System.out.println(s1 == s2); // true

        String x = new String("xyz");
        String y = new String("xyz");
        // 分析结果是true还是false?
        // == 双等号比较的是变量中保存的内存地址
        System.out.println(x == y); //false
        System.out.println(x.equals(y)); // true
        // 通过案例:字符串对象之间的比较不能使用“==”不保险。应调用String类的equals方法。
        // String类已经重写了equals方法,以下的equals方法调用的是String重写之后的equals方法。
        

        String k = new String("testString");       
        System.out.println("testString".equals(k)); 
        // 建议使用这种方式,因为这个可以避免空指针异常。
        //String k = null;
        // "testString"这个字符串可以后面加"."呢?
        // 因为"testString"是一个String字符串对象。只要是对象都能调用方法。
        
        System.out.println(k.equals("testString")); 
        // 存在空指针异常的风险。不建议这样写。
    }
}

 

 

 

posted @ 2022-05-01 18:16  280887072  阅读(155)  评论(0编辑  收藏  举报