黑马程序员---面向对象之String类创建对象的一点思考

长平狐 发布于 2013/07/01 15:31
阅读 122
收藏 1

-------------------------android培训java培训、期待与您交流! -------------------------

最近在上黑马论坛时经常有同学问到关于String类创建对象的问题,最多的就是诸如:String str = new String("java")一共创建了几个对象这类问题。要弄清楚java虚拟机的运行机制:

JVM是基于堆栈的虚拟机.JVM为每个新创建的线程都分配一个堆栈.也就是说,对于一个Java程序来说,它的运行就是通过对堆栈的操作来完成的。

栈 stack :用于保存线程执行的动作和数据引用。函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。 

堆 heap:用于用来存放由new创建的对象和数组 

常量池constant pool :在堆中分配出来的一块存储区域,其中保存着很多String对象,并且可以被共享使用,因此它提高了效率。由于String类是final的,它的值一经创建就不可改变,因此不用担心String对象共享而带来程序的混乱。

再来看看String str = "java";和String str = new String ("java");的区别。

在使用String str = "java";的格式定义对象时,总是想当然地认为,创建了String类的对象str。错!对象可能并没有被创建!唯一能确定的是,指向 String类的引用被创建了。至于这个引用到底是否指向了一个新的对象,必须根据上下文来考虑。因此,更为准确的说法是,只是创建了一个指向String类的对象的引用变量str,这个对象引用变量指向了某个值为"java"的String类。使用String str = "java";的方式,可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。
   如果使用String  str =  new String("java");那么,会有两个String被创建,一个是Class被CLassLoader加载时,"java"被作为常量读入,在constant pool里创建了一个共享的"java",。 然后,当调用到new String("java")的时候,会在heap里创建这个new String("java");  

  String   s1   =   new   String("java");     //创建二个对象  
  String   s2   =   new   String("java");     //创建一个对象,并且以后每执行一次创建一个对象  
  String   s1   =   "java";     //创建一个对象  
  String   s2   =   "java";     //不创建对象,只是创建一个新的引用 

 
  因为String是唯一可以用字面量形式表示的对象,所以String字面量是一种特殊的字面量,它本身是一个对象 


------------------------- android培训java培训、期待与您交流! -------------------------

原文链接:http://blog.csdn.net/voiceofnet/article/details/7269592
加载中
返回顶部
顶部