完全是简单起见,
String str="abcd";
String str=new String(new char[]{'a','b','c','d'});
两个语句对于编译器来说应该是一样的。

解决方案 »

  1.   

    这两种写法都可以创建一个String对象。在用赋值运算符进行字符串初始化时,JVM自动为每个字符串生成一个String类的实例。
    The String class represents character strings. All string literals in Java programs, such as "abc", are implemented as instances of this class.
      

  2.   

    我来解释一下,String作为一个类来说,当然可以用new来构造,String有3个构造函数:String();
    String("xxx");
    String(new StringBuffer());
    这两条语句的效果是一样的String password="ok";
    String password=new String("ok");不同的是,第一条现在内存中创建了"ok"这个String,然后将reference赋给password,如果这个时候还有一条语句String pwd = "ok";那么JVM将不再创建"ok",而是直接将第一个"ok"的reference赋给pwd,也就是说,password和pwd是使用同一块内存,而如果加上String pwd = new String("ok");那JVM将在内存中再创建一块区域放上“ok”这个字符串。
      

  3.   

    这就是java里的特殊之处之一了, String password="ok";
    String password=new String("ok");  是等价的
      

  4.   

    "ok"本身就是一个String类的对象String password="ok";用一个String对象,初始化另一个String 对象password你觉的有什么不妥吗??
      

  5.   

    String password=new String("ok");
    这样也没有错。
    但是String password="ok";利用到了字符串缓冲池,也就是说如果缓冲池中已经存在了相同的字符串,就不会产生新的对象,而直接返回缓冲池中的字符串对象的引用。
    如:
    String a = "ok";
    String b = "ok";
    String c = new String("ok");
    String d = new String("ok");System.out.println(a==b);//将输出"true";因为两个变量指向同一个对象。
    System.out.println(c==d);//将输出"flase";因为两个变量不指向同一个对象。虽然值相同,只有用c.equals(d)才能返回true.
    所以实际中,建议用第一种,可以减少系统资源消耗。
      

  6.   

    呵呵,刚开始进来时还没有人留贴,等自己的留上后才发现,短短几分钟就多了这么多了。所以和BrainA(小包)的基本重复了,:)不过String对象的构造函数可不止3中,如果包括jdk1.4中已弃用的,总共有11种……
      

  7.   

    完全可以,怎么会不行,jdk4中确实有11中,String型属于复合类型,都有构造器的,就是character等基本类型,也可以用Character char=new Character('a')来初始化。
      

  8.   

    xiao_yuer(小鱼儿) ,顺便问一下,在Java中,==和equals到底有什么区别?
    =============
    原来一切就是这么简单
      

  9.   

    又是在研究内存,那会不会这条问题:http://www.csdn.net/expert/topic/1021/1021209.xml?temp=.7566187
      

  10.   

    DreamHead(大头):
    java里面每个类都继承至java.lang.Object而Object中就有一个public 的方法叫equals(),如果你没有重载这个方法,equals就是判断两个对象是否同一个,是同一个才返回true,这是和==一样的.但绝大多数的类都重载了方法,例如String,它们重载这个方法的目的就是用来判断两个对象的值是否相同,而不再是判断对象本身是否为同一个。至于值相同怎么判断,每个类就都有每个类不同的算法了。
    ==永远都是判断是否为同一个对象。基本类型除外,因为他们根本不算是对象。
    讲的不是很清楚,还有疑问再讨论。
      

  11.   

    好象因为String是JAVA的内置对象,比较特别,所以它的变量可以像JAVA的基本类型一样直接赋值。
      

  12.   

    如果用String a ="xx";
    那么好象不能用String类的方法,除非是static
    如果用String a = new String("xx");
    那么a就可以用String类的方法,如a.method(object o);
      

  13.   

    To gentoo(贱兔) :你的想法错了,在你这个例子中,a就是一个String类的一个instance,都可以调用String的方法。不信的话你可以试一下下面这个例子。public class Manipulate
    {

    public static void main(String[] args)
    {
    String s = "A man of many talents";
    String s1 = s.toUpperCase();
    int start = s1.indexOf("AL");
    int end = s1.lastIndexOf("AL");
    String s2 = s1.substring(0, start);
    String s3 = s1.substring(end + 2);
    String s4 = s2 + s3;
    System.out.println(s);
    System.out.println(s4);
    }
    }
      

  14.   

    谢谢各位,我记住了:String s="dfas";声明的是会被其他相同值的变量代替的,在缓冲里的对象。String s=new String("fafa");声明的是在内存里完全独立占用一块内存的,不会被其他相同值代替的对象。
      

  15.   

    谢谢各位的支持。我现在把各位的认识统一一下,String 类有其特殊性,因此在声明对象的时候,可以不用new()(当然,其他声明对象可不能省得)。然而,虽然说是可以省略,但有和没有new在内存中的的分配是不一样的。String a="ok"和String b=“ok" ,其中a和b是分配了同一块内存,也就是说a和b是相互引用了,a==b 的返回值是true。String a=new String("ok")和String b=new String("ok"),在内存中分别拥有自己的空间,a==b的返回值是false。
       这样总结,各位没有什么异议吧。如果大家还有什么高见,请与我分享一下。拜谢!
      

  16.   

    xiao_yuer(小鱼儿):
    多谢你的回答,看看我的理解对不对,==相当于在C里面判断指针是否相同,equals相当于内容上是否相同。是不是因为在Java里没有办法像C里面那样直接比较指针,所以把==默认为比较指针(相当于C的指针)。
    另外,我不大同意lanyunfeng(蓝色咖啡) 的观点,String就是Java里的一个类,跟内置类型还是有区别的。
    至于colin1022(暗夜要爪哇)说,
    String s="dfas";声明的是会被其他相同值的变量代替的,在缓冲里的对象。
    我也有一些问题,在《Java核心技术》中所,String的值是不可以改变的,我理解就是如果你给它重新赋值,不是改变它原先指向的那块内存的内容,而是重新拿来一块内存(或像这种直接赋值的,直接找到"dfas"的内存),用它的reference指向这块内存。