String str = "abc";和String str = new String("abc");和
char[] c = {'a','b','c'};String str=new String(c);
一样吗?如果不同,为什么?
最好能深入一点的说,呵呵!!!!!

解决方案 »

  1.   

    String str = "abc";是直接把一个String常量赋给str;String str = new String("abc");是开辟了一个str的String空间,并把"abc"赋给它;char[] c = {'a','b','c'};String str=new String(c);通过char数组实现。
      

  2.   

    第一个是直接对str赋值;
    第二个是先为String类型的变量开辟空间,然后再将赋值;第二个其实是两句话:
    String str;
    str=new String("abc");
    第三个是先定义了一个数组,然后再将数组作为str的值赋给str;
    三句表达效果是一样的,但第一第二个开辟的是堆,第三个用到了栈(数组).
      

  3.   

    一样,String 对象保存在堆中 引用在栈中
      

  4.   

    1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。
    2. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享,详见第3点。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
    3. Java中的数据类型有两种。基本类型(primitive types), 共有8种,即int, short, long, byte, float, double, boolean, char。存在于栈中。另一种是包装类数据,如Integer, String, Double等将相应的基本数据类型包装起来的类。这些类数据全部存在于堆中.String str = "abc";和String str = new String("abc");和char[] c = {'a','b','c'};String str=new String(c);都采用堆存储String str = "abc";在栈中如果没有存放值为"abc"的地址,等同于:
    String temp=new String("abc");
    String str=temp;关于String str = "abc"的内部工作。Java内部将此语句转化为以下几个步骤:
    (1)先定义一个名为str的对String类的对象引用变量:String str;
    (2)在栈中查找有没有存放值为"abc"的地址,如果没有,则开辟一个存放字面值为"abc"的地址,接着创建一个新的String类的对象o,并将o的字符串值指向这个地址,而且在栈中这个地址旁边记下这个引用的对象o。如果已经有了值为"abc"的地址,则查找对象o,并返回o的地址。
    (3)将str指向对象o的地址。使用String str = "abc";的方式,可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String("abc");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。char[] c = {'a','b','c'};String str=new String(c);等同于:
    String str = new String('a'+'b'+'c');
      

  5.   

    楼上牛人!
    佩服。学习学习。
    以前只知道
    String str=new String(c);
    String str = new String("abc");
    是包装类的生成字符串。
    今天受教了。
      

  6.   

    我想知道 liaoxiaoqi(天崖) 从那得知这方面知识的,也算是共享一下学习途径。我在书上没看到过。感谢!
      

  7.   

    liaoxiaoqi(天崖)  希望透露一点学习方法
    嘿嘿。高人
    偶对底层十分不了解~想学习
      

  8.   

    SUN的官方教材上有介绍,比如你去读正规的SCJP
    但是楼中达人能用自己语言来把问题完整的描述清楚可见理解功力,在下佩服!
      

  9.   

    高人啊.,...不知在那看到JVM的知识的.
      

  10.   

    liaoxiaoqi(天崖)谢谢你了,我也学到知识了。
      

  11.   

    学习!liaoxiaoqi(天崖)谢谢你了
    liaoxiaoqi(天崖)谢谢你了
    liaoxiaoqi(天崖)谢谢你了
    liaoxiaoqi(天崖)谢谢你了
      

  12.   

    char[] c = {'a','b','c'};String str=new String(c);等同于:
    String str = new String('a'+'b'+'c');
    还是不清楚.
      

  13.   

    liaoxiaoqi谢谢,说的明白而且深刻
      

  14.   

    呵呵 这是个好问题 能让我们了解JVM的工作状况
      

  15.   

    回复人:liaoxiaoqi(天崖) ( 二级(初级)) 信誉:100绝对对JVM虚拟机的工作机制有研究。赞一个!!
      

  16.   

    liaoxiaoqi(天崖) ( ) 信誉:100 
    说的很好了,
    我就不说了,String很特殊!!
      

  17.   

    String str = "abc";和String str = new String("abc");
    好像没有什么区别吧、
      

  18.   

    String str1 = "abc";和String str2 = new String("abc");的区别大了“abc”会在Java程序编译的时候保存在静态存储区中,而new String( "abc" )则是在堆区中开辟空间,存储字符串"abc"如下测试可以证明:System.out.println( str1 == str2 );           //false
    System.out.println( str1.equals( str2 ) );    //true
      

  19.   

    public class Test{
    public static void main(String args[]){
    String str1 = "abc";
    String str2 = new String("abc");
    System.out.println(str1==str2);         //false
    System.out.println(str1.equals(str2));    //true
    }
    }