23-String类

发布时间 2023-12-26 13:06:56作者: 马铃薯1

String 类的特点

1. Java程序中,所有双引号字符串,都是String这个类的对象

2. 字符串一旦被创建,就不可更改(如果想更改,只能使用新的对象做替换)

3. 字符串常量池,让我们使用双引号创建字符串对象时,会先去常量池中查找有没有相同内容的字符串对象,如果有,则直接使用该对象,如果没有,则在常量池中创建一个字符串对象,然后再使用该对象

public class StringDemo1 {
    public static void main(String[] args){
        // 1.Java程序中,所有双引号字符串,都是String这个类的对象
        String s = "abc";
        System.out.println(s); // abc

        // 字符串一旦被创建,就不可更改(如果想更改,只能使用新的对象做替换)
        s = "def";
        System.out.println(s); // def,字符串一旦被创建,就应该不可更改,这里为什么改变了,这是因为s指向了新的字符串对象"def"

        // 等价于上面的,s指向了新的字符串对象"def"
        Student stu = new Student("张三", 20);
        stu = new Student("李四", 21);
        System.out.println(stu.getName() + "\t" + stu.getAge()); // 李四    21

        // 2.字符串常量池,让我们使用双引号创建字符串对象时,会先去常量池中查找有没有相同内容的字符串对象,如果有,则直接使用该对象,如果没有,则在常量池中创建一个字符串对象,然后再使用该对象
        String s1 = "abc";
        String s2 = "abc";

        // == 比较的是两个对象的地址值是否相同
        System.out.println(s1 == s2); // true,因为s1和s2都指向了常量池中的同一个字符串对象"abc"
        // equals 比较的是两个对象的内容是否相同
        System.out.println(s1.equals(s2)); // true,因为s1和s2指向的字符串对象内容相同

    }
}

这里注意:不同的JDK版本,字符串常量池的位置是不一样的

JDK7版本之前,StringTable是在方法区中

JDK7版本开始之后,StringTable被挪到了堆内存中

 

String类常见的构造方法

1. public String(): 创建一个空白字符串,里面不包含任何内容

2. public String(char[] chs): 根据传入的字符串数组,创建字符串对象

3. public String(String original): 根据传入的字符串,来创建字符串对象

public class StringDemo2 {
    public static void main(String[] args){
        // public String():创建一个空白字符串对象,不含有任何内容
        String s1 = new String();
        System.out.println("s1:" + s1);

        // public String(char[] chs):根据传入的字符数组,来创建字符串对象
        char[] chs = {'a', 'b', 'c'};
        String s2 = new String(chs);
        System.out.println("s2:" + s2);

        // public String(String original):根据传入的字符串,来创建字符串对象
        String s3 = new String("abc");
        System.out.println("s3:" + s3);
    }
}

 

字符串对象,两种创建方式的区别

String s1 = "abc";

String s2 = new String("abc");

 

String类的常见面试题

 上面是字符串变量进行拼接,其结果是false,那要是字符串常量进行拼接呢,如下所示:

相当于从字符串池进行对比,其结果应该是true