String类的进一步学习一

String str=new String("abc");这个到底创建了几个对象,记得刚学Java的时候困扰了自己很长时间,现在把这方面的只是系统的学一下。

1.String str是在栈中声明了一个String类型变量,并没有创建任何对象。

2."="是将某个对象的引用赋给某个变量,也没有创建对象。

3."abc"是在字符串池中创建一个对象,当然如果字符串池中已经有了,就不需要创建。

4.new String()很明显是创建了一个String对象。

所已说创建了一个或者两个对象,如果之前字符串池中已经有了"abc",那么创建的就是一个对象,如果之前字符串池中没有"abc",那么在字符串池中创建"abc"对象,然后再new String()创建一个对象,一个创建了两个对象。

 

下面深入的研究一下:

1.String str="abcd";创建了一个对象。

2.String a="abc";

   String b="abc";

   创建了一个对象。

3.String a="ab"+"cd";

   创建了一个对象。

通过前面的解释,1、2创建了一个对象,这个应该很明白,但是对于3创建了1个对象,这是什么原因?

这是由于常量的值在编译的时候就确定了,而"ab"和"cd"的是常量,在编译时就确定了,所以创建了一个对象"abcd",保存到字符串池中。

 

 

运行结果:

 

"ab"+"cd"创建的对象加入到字符串池中

"a"+"cd"创建的对象没有加入到字符串池中

a+b创建的对象没有加入到字符串池中

上面的运行结果显示只有一引号""包含文本的方式创建的String对象自己使用"+"连接产生的新对象才会被加入到字符串池中,对于所有new 方式创建的对象(包括null)的"+"连接表达式产生的新对象都不会加入字符串池中。

 

 

但有一种情况特殊:

 

运行结果:g==h,是同一个对象

这是因为A和B都是常量,他们的值是固定的都是在编译时确定的,所有g的值也是确定的,也是编译时确定的。

而对于下面的情况要多加注意:

运行结果:i!=j,不是同一个对象

这是因为A和B虽然被定义为常量,但是没有马上赋值,在运算出i之前,他们何时赋值,以及被赋予什么样的值,都是不确定的。因此A和B被赋值之前,性质类似于一个变量,那么i就不能在编译期被确定,只能在运行时被创建。

 

 

我们查看String类的源码就会发现,它有一个value属性,保存着String对象的值,类型是char[],这也正说明了字符串就是字符的序列。

 

当执行String a="abc";时,JAVA虚拟机会在栈中创建三个char型的值'a'、'b'和'c',然后在堆中创建一个String对象,它的值(value)是刚才在栈中创建的三个char型值组成的数组{'a','b','c'},最后这个新创建的String对象会被添加到字符串池中。如果我们接着执行 String b=new String("abc");代码,由于"abc"已经被创建并保存于字符串池中,因此JAVA虚拟机只会在堆中新创建一个String对象,但是它的值(value)是共享前一行代码执行时在栈中创建的三个char型值值'a'、'b'和'c'。

 

 

 

 

 

"ab"+"cd"创建的对象加入到字符串池中

"a"+"cd"创建的对象没有加入到字符串池中

a+b创建的对象没有加入到字符串池中

g==h,是同一个对象

i!=j,不是同一个对象

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值