String字符串的创建,拼接及底层实现

String

由于其底层数组是private final的,不可改变,且没有提供任何操作其私有数组的方法,所以String字符串是不可改变的。
在这里插入图片描述

常量池(与字符串息息相关)

任何好的编程语言的关键目标之一是高效的使用内存,随着应用程序的增长,String字面值占用大量的内存非常常见。对程序而言,全部String字面值中往往有大量的冗余,为了使java更高效地使用内存,JVM留出一块特殊的内存区域,称为“String常量池”。当编译器遇到String字面值时,它检查该池内是否已经存在相同的String字面值。如果找到,则将新的字面值的引用指向现有的String,而不创建任何新的String字面值对象。

字符串创建方式(两种)

字面量赋值的方式

在这里插入图片描述

通过new + 构造器的方式

String s = new String(“abc”);
方式创建对象,在内存中创建了几个对象?
两个:一个是堆空间中new结构,另一个是char[]对应的常量池中的数据:“abc”
在这里插入图片描述

String字符串的拼接方式(三种)

说明
1.常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。
2.只要其中一个是变量,结果就在堆中。

第一种 字面值常量拼接

在常量池中进行,在字符串常量池中查找需要的字符串,如果找到,则指向给String引用,找不到则新建所需字符串,将地址指向给String引用。因为字符串常量池中不能存在相同字符串,每次拼接都要新建字符串,不能在原有字符串上进行修改。
在这里插入图片描述
在这里插入图片描述

第二种 变量和常量拼接

在这里插入图片描述

第三种 变量和变量拼接

在这里插入图片描述
字符串使用+拼接时,一旦有变量参与,在堆中,底层会转成StringBuilder 并使用append完成拼接。运算完成后,在转换成String返回。
而且,这个转换后的String存在堆区

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值