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

来源:互联网 发布:seo sem是什么工作 编辑:程序博客网 时间:2024/06/13 09:51
  • 在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”。