Java字符串不同创建方式的理解

创建字符串的方式

1.String a = "12";

2.String a1 = "12"
3.String b = = new String("123")

4.String b1 = new String("123")


"12"创建对象情况(string常量池中同一个字符串只会创建一次)
1.如果在String常量池中已经存在"12",则直接指向常量池中的对象"12",并且跟已经存在的指向对象"12"的变量的引用相同。例如上面的a跟a1引用相同。
2.如果"12"在string常量池中不存在,则直接在string常量池创建一个对象"12",然后指向"12"


new String("123")创建String Object分为两种情况:
1.如果String常量池中,已经创建"123",则不会继续创建,此时只在变量区创建了一个对象new String("123");
2.如果String常量池中,没有创建"123",则会创建两个对象,一个在常量池中创建对象"123",一个在变量区中创建对象new String("123")。
上面的第3个的b跟第四句的bi,指向不同,而且变量区会存在两个"123",也就是说new String("xxx")就算内容相同,也会在变量区创建不同的对象,一用到new String("xxx"),就会创建新的对象。


String c = "hello2"
String c1 = "hello"+2
c == c1是ture的,也就是说引用相同,都是指向String常量池中同一个对象"hello2"。
String e = "hello";
String c2 = e + 2;
c == c2是false的,也就是说引用不同,因为e是储存的是一个引用,因而e是不能直接加上2的因为受编译器优化的影响,所以String c2 = e +2中的e被转化成StringBuilder,然后+号被优化成append(),之后再调StringBuilder的toString().所以c2不会指向常量池中的"hello2",而是指向栈里面的内存。
final String f = "hello"
String c3 = f + 2;
c == c3是ture的,f变量被final修饰,成了一个字符串常量,在前端编译器标注检查这个步骤中,有一个常量折叠的动作,也就是说String c3 = f +2被优化成String c3 = "hello2"(使用到f的地方会直接将变量f替换为它的值,这样就相当于"hello"+2).这样c和c3就是引用String常量池中相同的字符串,所以a == d为true.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值