JAVA字符串池问题/String对象创建问题

  • 在Java语言中,所有的常量将在编译后的.class字节码文件中开有一个常量区,在运行时,将在内存中占用这么一个内存区。JAVA字符串池是常量区的部分;
  • 字符串池存放着程序中创建的所有字符串常量;任何时候创建字符串常量系统都会搜索字符串池,查看是否存在该字符串常量。
String对象的创建

1、创建一个String类的实例

String name = "myname";
String hisname = "yourname";

先在字符串池中查找“myname”和“yourname”两个字符串,这里存在“myname”,所以在字符串池中只新创建字符对象“yourname”;

这里写图片描述

2、new一个String对象

String name = new String("myname");
String hisname = new String("yourname");

先执行上面一步,新创建了“yourname”对象;new操作符时,将字符串池中的“myname”和“yourname”各传一个副本(即赋值一份)到 heap(堆栈)中,新建两个对象。一共新创建三个对象。

更符合法规


  • s =“apple”+“pen”;将产生几个对象?
    在java中,两个字符串常量将直接连接,不会产生多余常量对象,所以只新生成一个常量对象“applepen”。

  • s = “apple” + new String(“hahaha”) + “pen”将产生几个对象?
    这种情况下,只会产生最后的“applehahahapen”,不会生成中间的“applehahaha”;所以这里新生成两个对象“hahaha”和“applehahahapen”。

因为sun的javac把上面代码编译成了Java代码: 
new StringBuilder("a").append(new String("b")).append("c").toString()
真正遵循规范的“+”要这么写: 
"a".concat("b").concat("c") 这样才会产生"ab"这个字符串
所以实际应用中,完全不要担心"a" + "b" + "c"这样的写法
但要注意类似下面的东西: 
for (String x = ...)
s = s + x;
这个每次循环都会生成一个字符串,这时改成s.append(x)才好
  • s=“hello”;s = s+“hahaha”;将产生几个对象?
    参照第二个例子,这里生成三个对象:“hello”、“hahaha”、“hellohahaha”。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值