【JavaSE】字符串相关知识

发布于:2023-01-04 ⋅ 阅读:(345) ⋅ 点赞:(0)

目录

字符串常量池

String对象创建

目录

字符串常量池

String对象创建

直接用字符串常量赋值

通过new创建String类对象

intern()——手动添加到字符串常量池

字符串的不可变性

StringBuffer与StingBuilder的区别


字符串常量池

池,是一种在编程中提升效率的方式。

String对象创建

直接用字符串常量赋值

public static void main(String[] args) {
        String str = "abcde";
        String str2 = "abcde";
        String str3 = "hello";
        System.out.println(str==str2);
    }

 具体创建过程:

进入String的源码

有这两个成员变量,一个是由数组,还有一个是哈希值(暂时不管)。

字符串常量赋值时,

step1:在字符串常量池中通过以上一系列操作找有没有该字符串

step2:若有,则指向原来旧的字符串即可

             若无,创建一个新的

这样大大提高了存储效率,节省了空间。

通过new创建String类对象

public static void main(String[] args) {
        String s1 = new String("abcde");
        String s2 = new String("abcde");
        System.out.println(s1 == s2);//比较的是地址
        System.out.println(s1.equals(s2));//比较的是内容
    }

 

二者虽然内容相同,但是存储的地址却不一样。

 通过new创建对象时:

step1:只要new一次,就创建出一个对象

step2:在字符串常量池中通过上面一些列操作找有没有相同的字符串

step3:若有,则指向相同的字符数组

            若无,则创建出新的字符数组

以上都是字符串的相关操作。若是想把一个字符数组放到字符串常量池中去,可以使用intern方法。


intern()——手动添加到字符串常量池

public static void main(String[] args) {
        char[] arr = {'a','b','c','d'};//字符数组,只是在堆区中
        String str = new String(arr);//此时还没有到字符串常量池中
        //只是把数组转成字符串了
        str.intern();//此时字符串存放到字符串常量池中了
        //intern()返回值为boolean类型
        System.out.println(str);
    }

字符串的不可变性

以下是String的源码的一部分

 上图表明

1.String类是不可被继承的

2.其中的数组名value是不可修改的。代表不能引用(指向)其他数组,但是其中的内容却是可以改变的。

3.String类的方法中,有关字符串操作的相关方法都是新创建了一个对象。所以原字符串没有被改变。

StringBuffer与StingBuilder的区别

相同点:

1.都是字符串类

2.所创建的对象可以进行修改,即在原对象上进行操作。

不同点:

StringBuffer同步处理,属于线程安全操作。可以理解为同一时刻只能它就只能处理一件事。

StringBuilder没有采用同步处理,不属于线程安全操作。


有什么错误请在评论区指出。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到