java的String理解

理解"abc"与new String("abc")的区别,所涉及的知识点如下:

1.引用变量与对象的区别
String s = new String("abc");此语句中的s仅仅只是一个引用变量,它不是对象。

2.java中所有的字符串都是一个String的对象,即"abc"就是一个String对象。

3.字符串对象是怎么创建的?
由于String对象使用的比较频繁,java为了节省内存空间跟运行效率,在编译区间对字符串常量进行了优化,就是把所有的字符串常量放到了常量池,常量池的好处是该池中的所有相同的字符串常量被合并,并只占一个空间。我知道,对两个引用变量使用==可以判断它们的值(引用)是否相等,即可以判断它们是否指向同一对象:
public class String1 {

public static void main(String[] args) {
String s1 = "abc";
String s2 = "abc";
if(s1 == s2)
System.out.println("1");
else
System.out.println("2");

}

}
输出的结果:1 表明两个字符串常量实际上保存为一个对象,即上面的代码实际上只创建了一个String对象

现在看String s = new String("abc");语句,这里"abc"就是constant pool中的一个对象,而在运行的时候执行new,将constant中的对象copy一份到heap(堆)中,并把heap中的这个对象的引用赋给s,所以这条语句就创建了2个String对象

现在看下面程序:
public class String2 {

public static void main(String[] args) {
String s1 = new String("abc");
String s2 = new String("abc");
if(s1 == s2)
System.out.println("1");
else
System.out.println("2");

}

}
输出的结果:2
那么现在上面的代码创建了几个String 对象呢? (三个,constant pool 一个,heap中两个)


再来看看字符串+和字符串转换的问题,涉及的知识点:
1.字符串运算符(+,+=,java中唯一重载的两个运算符,java不支持运算符重载):如果一个操作数/表达式是String类型,则另一个操作数在运行时要先转换成String对象,并两者串接。看一程序段:
String s = new String("abc");
s = 1+2+s+3+4;
请问一共创建了多少String对象?

如果涉及基本数据类型,则会先转换成包装器类,然后调用toString()方法,我们知道几个包装器类都改写了从Object祖宗类继承的toString()方法(如果是null,则转换为"null"),关于+是串接还是加法,由操作数决定,所以很显然最后结果s="3abc34"。

那按照我上面的说话,语句似乎就应该生成5个String对象,即:
1+2=3,then 3->Integer(3)->"3"in constant
"3"+s(in heap)="3abc"(in heap)
"3abc"+3,first 3->Integer(3)->"3"in constant then "3abc3"
同样"3abc3"+4 then "3abc34"
但这个结果我不知道是不是正确,希望哪位高人指点下!


根据上面所述,应该是7个
String s="abc"; //1个,在constant pool中
String s1=new String("abc"); 两个,一个在heap,一个在constant pool
String s2=new String("a"+"b"); 四个,三个在constant pool,一个在heap
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值