读书人

Java String对象的经典有关问题(new S

发布时间: 2012-08-25 10:06:20 作者: rapoo

Java String对象的经典问题(new String())

?先来看一个例子,代码如下:?

"bc";??
  • ????????String?combo?=?str1?+?str2;??
  • ????????System.out.println(str?==?combo);??
  • ????????System.out.println(str?==?combo.intern());??
  • ????}??
  • }??


    ??? 这个例子用来说明用+连接字符串时,实际上是在堆内容创建对象,那么combo指向的是堆内存存储”abc”字符串的空间首地址,显然str==combo是错误的,而str==combo.intern()是正确的,在String池中也存在”abc”,那就直接返回了,而str也是指向String池中的”abc”对象的。此例说明任何重新修改String都是重新分配内存空间,这就使得String对象之间互不干扰。也就是String中的内容一旦生成不可改变,直至生成新的对象。?
    ??? 同时问题也来了,使用+连接字符串每次都生成新的对象,而且是在堆内存上进行,而堆内存速度比较慢(相对而言),那么再大量连接字符串时直接+是不可取的,当然需要一种效率高的方法。Java提供的StringBuffer和StringBuilder就是解决这个问题的。区别是前者是线程安全的而后者是非线程安全的,StringBuilder在JDK1.5之后才有。不保证安全的StringBuilder有比StringBuffer更高的效率。?
    ??? 自JDK1.5之后,Java虚拟机执行字符串的+操作时,内部实现也是StringBuilder,之前采用StringBuffer实现。?


  • 读书人网 >编程

    热点推荐