你提这个问题我都想了半天,包括看java源码,也没找到合理的解释...

解决方案 »

  1.   

    String在java中属于特殊类型,不像int,double这些基本类新,每个String字符串都是内存中的静态实例理解了这点上面的代码就好懂了
      

  2.   

    两条代码所创建的数组对象是一样的,只是创建的方式不一样而已,java数组的创建方式有多钟。
      

  3.   

    编译器遇到语句1,在内存中开辟了一块空间保存字符串数组 。
       第二条语句的new 又开辟了另一块空间       , 所以两条语句效果相同, 内容一样 ,但是放在同一个程序中就是两个不同的引用
      

  4.   

    完全没区别。。
    你用2钟不同方式编译成class文件。 你可以看到他们2个完全一样。
      

  5.   

    看了一下,楼上没有一个正解。String[] strArr1 = {"abc","def"};  和   String[] strArr2 = new String[]{"abc","def"}; 
    字符串数组内容是一模一样的,这也正是字符串的两种创建形式。但是有些面试官就爱问这样的问题,问二者有什么区别,一般的都没有人回答对。给你解释一下,点一下你就会明白的:
    二者在内存中是完全不一样的,前者是一个对象即strArr1;后者是两个对象,strArr2和 new String[]{"abc","def"}; ,然后new出来的对象等于了strArr2,就是间接性的赋值。
    希望对你有帮助,我也在学java,加油哦!
      

  6.   

    第一个是在字符串池中创建了字符串,当再次引用这些字符串时就不会再创建内存地址来保存这些字符串比如String[] strArr3 = {"abc","def"};
     strArr3==strArr1
    而String[] strArr2 = new String[]{"abc","def"}; 是新创建一个内存地址来保存这个数组
    两者区别是内存地址不同,内容相同
      

  7.   

    第一种方法中,字符串被存储在常量数据区中,比如"abc"放在里面,那么以后程序中再次用到"abc"时,就是直接去常量数据区中去取,之后的所有"abc"都是同一个。第二种方法中,是创建了两个String对象,这两个对象都有自己的内存区域(无论这两个String的内容是否一样),如果之后有程序要用到"abc",它不会去找第二种方法中存储的"abc"。简单的来说就是,第一种方法中把字符串当成字符串常量存储在常量数据区,第二种方法中是存储在堆内存里。我给你写个例子你就明白了:
    String str1 = "Hello World!";
    String str2 = "Hello World!";
    if(str1 == str2)
    System.out.println(true);//内存地址相同
    else
    System.out.println(false);//内存地址不同

    String str3 = new String("Hello World!");
    String str4 = new String("Hello World!");
    if(str3 == str4)
    System.out.println(true);//内存地址相同
    else
    System.out.println(false);//内存地址不同
    上面的代码,输出分别是true,false。希望能帮到你~
      

  8.   

    首先这是字符串数组不是字符串至于那些什么常量池之类的我觉得是瞎扯淡
                 String[] s1 = {"abc","def"};
         String[] s2 = new String[]{"abc","def"};
         String[] s3={"abc","def"};
         System.out.println(s1.equals(s2));
         System.out.println(s1.equals(s3));
         System.out.println(s1==s3);
    以上全输出是false。所以我觉得他们是扯淡。。
    其次要想弄清楚他们的区别要知道数组的初始化方式:.1、静态初始化.(给数组每个元素赋值).2、动态初始化.(不赋值但是规定了数组长度).3、不去初始化,而直接引用其他数组的数组对象.所以就我看来  String[] strArr1 = {"abc","def"};是方式1
            String[] strArr2 = new String[]{"abc","def"};方式3
      

  9.   

    蛋疼。。 你能不能更深入一点再来指摘楼上没有一个正解。。
     String[] strArr1 = {"abc","def"};只是   String[] strArr2 = new String[]{"abc","def"};的一个简写形式罢了。 用比较流行的话说,就是一个语法糖。。他们在编译后是完全一样的。
    strArr1是一个对象么。  如果他是成员变量,那么他就是一个引用。如果它是局部变量,他就是一个slot(甚至可能和别的局部变量公用)。 
    我估计你是背面试题背错了。。 你背的题目是说new String 和直接写的差别。。 这个是数组,和string本身没任何关系。
      

  10.   

    给大家一些参考:
                 String[] s1 = {"abc","def"};
         String[] s2 = new String[]{"abc","def"};
         String[] s3={"abc","def"};
         System.out.println(s1.equals(s2));
         System.out.println(s1.equals(s3));
         System.out.println(s1==s3);
         System.out.println(s1[0]==(s2[0]));
         System.out.println(s1[0]==s3[0]);
    运行结果是:
    false
    false
    false
    true
    true
    经推断,是生成了3个字符串数组引用,数组地址各不相同,而数组中的成员即每个相同字符串的地址却是相同的(这个涉及到string类型变量的生成)。楼主的两种生成字符串数组的方法无区别。