String类的实例化

String的特性

String类:代表字符串。Java程序中所以字符串字面值(  如"abc")都作为此类的实例实现

1、String是一个final类,不可被继承。

2、String实现了Serializ

package com.gtguigu.java.String;

public class StringTest {
    public static void main(String[] args) {
        String s1 = "javaEE";
        String s2 = "Hadoop";

        String s3 = "javaEEHadoop";
        String s4 = "javaEE"+"Hadoop";
        String s5 = s1+"Hadoop";
        String s6 = "javaEE"+s2;
        String s7 = s1+s2;
        System.out.println(s3 == s4);//true
        System.out.println(s3 == s5);//false
        System.out.println(s3 == s6);//false
        System.out.println(s3 == s7);//false
        System.out.println(s5 == s6);//false
        System.out.println(s5 == s7);//false
        System.out.println(s6 == s6);//false
    }
}

 

 

able接口:表示字符串是支持序列化的

    实现了Comparable接口:表示String可以比较大小

3、String内部定义了final char[] value用于存储字符串数据

4、String:代表不可变的字符序列  

  简称:不可变性。

  体现:当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值

String对象的创建

通过字面量创建:

1、通过字面量的方式(区别于new)给一个字符串赋值,次数的字符串值声明在字符串常量池中。

2、字符串常量池中是不会存储相同内容的字符串的。 

对字符串进行任何增删改都是在字符串常量池新建一个值并指向该值(已有则不会新建)

public class StringTest {
    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = "abc";

        System.out.println(s1 == s2);//比较s1和s2的地址值
    }
}

 运行结果为:ture,因为二者指向字符串常量池里的同一个值。

通过new String()来创建

常用构造器:

1、String();

初始化一个新创建的 String 对象,使其表示一个空字符序列。
2、String(byte[] arr);

通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String

3、String(byte[] bytes,Charset charset)

通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String

3、String(byte[] bytes, int offset, int length)
通过使用平台的默认字符集解码指定的 byte 子数组,构造一个新的 String。5、String(char[] value)

分配一个新的 String,使其表示字符数组参数中当前包含的字符序列。

6、String(char[] value, int offset, int count)

分配一个新的 String,它包含取自字符数组参数一个子数组的字符。

创建内存图:

String不同拼接操作的对比

package com.gtguigu.java.String;

public class StringTest {
    public static void main(String[] args) {
        String s1 = "javaEE";
        String s2 = "Hadoop";

        String s3 = "javaEEHadoop";
        String s4 = "javaEE"+"Hadoop";
        String s5 = s1+"Hadoop";
        String s6 = "javaEE"+s2;
        String s7 = s1+s2;
        System.out.println(s3 == s4);//true
        System.out.println(s3 == s5);//false
        System.out.println(s3 == s6);//false
        System.out.println(s3 == s7);//false
        System.out.println(s5 == s6);//false
        System.out.println(s5 == s7);//false
        System.out.println(s6 == s6);//false

        String s8 = s5.intern();//返回值得到的s8使用常量值中已经存在的"javaEEHadoop"
        System.out.println(s3 == s8);//true
    }
}

 

1、字面量和字面量拼接的结果在常量池中。且常量池中不会存在相同内容的常量

2、只要其中有一个是变量,结果就在堆中

3、如果拼接的结果调用intern()方法,返回值就在常量池中

posted @ 2022-04-30 16:05  羽十六  阅读(181)  评论(0)    收藏  举报