【JavaSE】字符串相关知识

目录

字符串常量池

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没有采用同步处理,不属于线程安全操作。


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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值