String的使用

String

1、String对象用于保存字符串,本质就是一组字符序列

2、字符串常量对象是用双引号括起的字符序列,例如:“你好”、 “12.97”等

3、字符串的字符使用Unicode字符编码,一个字符(不区分字母还是汉字)占两个字节

4、String类常用的构造方法有:

String的使用_第1张图片

  • Serializable接口:表示可以串行化,数据可以进行网络传输,文件内容读写等

  • Comparable接口:String对象间可以进行相互比较大小。

5、String是final类,不能被其他类继承

6、String中有个属性 private final char value[]; 用于存放字符串内容,所以本质上说,字符串是char拼接而成。

7、String的value为final,value赋值后地址不可修改。但对应的String值可以修改,相当于嵌套,指向的还是那个地址,但地址中的数据可变。

final约束变量对应的空间地址

String的使用_第2张图片

创建方式

方式一(推荐)

直接赋值: String s = “zhang”;

方式二

构造器:String s = new String(“zhang”);

方式间区别

1、先从常量池中查看是否有“zhang”数据空间,如果有,则直接指向。如果没有则创建,然后指向该地址,s 变量最终指向的是常量池中的空间地址。

2、先在堆中创建空间,即对象的地址,然后在对象创建value属性,value属性指向常量池中的“zhang”空间,如果常量池中没有“zhang”,则创建,再指向。常量池中如果有,则直接指向,方式二中的s指向的是堆中的空间地址

String中有个属性 private final char value[];

String的使用_第3张图片

练习题

测试题01:

String a = "hsp";
String b = "zhang";
String c = "zhang";
String d = new String("zhang");

System.out.println(a == b);  // F
System.out.println(b == c);  // T
System.out.println(b == d);  // F
System.out.println(b.equals(d)); // T

String的使用_第4张图片
测试题02:

Person person01 = new Person();
person01.setName("zhang");

Person person02 = new Person();
person02.setName("zhang");

System.out.println(person01.name == person02.name); // T
System.out.println(person01.name == "zhang"); // T
System.out.println(person01.name.equals(person02.name)); // T

String s1 = new String("zhang");
String s2 = new String("zhang");
System.out.println(s1 == s2);   // 比较的是地址,s1和s2对象的地址不一致,返回f

测试题03

对String中的value使用final修饰的理解:

首先,不可变序列,确实是对象的内容不可变。这就是final的作用

不可变序列指的是这个类创建的对象不可变,在修改对象时会创建一个新的对象

对String中的value进行修改时,value堆中的地址没变,但value地址指向的对象发生了改变。

比如:String name = “zhang”, 此时value指向的为常量池中zhang的地址。

当name = "cheng"进行修改时,value指向的地址为cheng在常量池中的地址,value在堆中的地址不变。

String的使用_第5张图片
String的使用_第6张图片
测试题4

引用的思考,想想自己写程序的话,如果单独创建hello和abc的话,那他们就没有了引用指向。所以编译器做了优化。

String的使用_第7张图片
如果是两个常量相加,最后看的是池中的内容。
如果是两个变量相加,最后看的是堆中的内容。
String的使用_第8张图片

public class String01 {
    static String name = new String("zhang");
    static final char[] chars = {'j', 'a', 'v', 'a'};

    public static void changeString(String name, char[] chars){
        name = "cheng";
        chars[0] = 'h';

    }
    public static void main(String[] args) {
        changeString(name, chars);
        System.out.println(name);  // zhang
        System.out.println(chars); // hava
    }
}

测试题5

String的使用_第9张图片

public class String02 {
    String str = "zhang";
    char[] chars = {'j', 'a', 'v', 'a'};

    public void changeStr(String str, char[] chars){
        System.out.println("changeStr" + str);
        str = "java";
        chars[0] = 'h';
    }

    public static void main(String[] args) {
        String02 ex = new String02();
        ex.changeStr(ex.str, ex.chars);

        System.out.println(ex.str);
        System.out.println(ex.chars);
    }
}

0470_韩顺平Java_String对象特性2_哔哩哔哩_bilibili

如果上面的运行结果看不明白,那就去B站看原视频吧。

你可能感兴趣的:(java)