String str1="1234";
String str2=new String("1234");
有什么区别?
初次发贴请赐教

解决方案 »

  1.   

    <引用>
    关于String str = "abc"的内部工作。Java内部将此语句转化为以下几个步骤:
      (1)先定义一个名为str的对String类的对象引用变量:String str;
      (2)在栈中查找有没有存放值为"abc"的地址,如果没有,则开辟一个存放字面值为"abc"的地址,接着创建一个新的String类的对象o,并将o的字符串值指向这个地址,而且在栈中这个地址旁边记下这个引用的对象o。如果已经有了值为"abc"的地址,则查找对象o,并返回o的地址。
      (3)将str指向对象o的地址。  值得注意的是,一般String类中字符串值都是直接存值的。但像String str = "abc";这种场合下,其字符串值却是保存了一个指向存在栈中数据的引用!只要是用new()来新建对象的,都会在堆中创建,而且其字符串是单独存值的,即使与栈中的数据相同,也不会与栈中的数据共享。使用String str = "abc";的方式,可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String("abc");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。
      

  2.   

    String s1 = "abc";
    String s2 = "abc";
    String s3 = new String("abc");这三个字符串的内容是一致的(equals()==true),
    但引用的地址却不尽不同s1 == s2 -> true
    s1 == s3 -> false