A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王峰峰 中级黑马   /  2014-5-3 19:04  /  956 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

关于数组的初始化,我们一般有两种方式:
        一、String str = new String[]{"abc","123","wff"} ;
        二、String str = {"abc","123","wff"} ;
请问下,这两种初始化有什么区别???

点评

自己去论坛里搜搜看吧,有人提过这个问题  发表于 2014-5-3 19:52

4 个回复

倒序浏览
String不属于java中8大基本类型,但创建一个字符串对象时有一些值得注意的问题。
常量池的概念:
常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。例如:
String str1 = "abc";
String str2 = "abc";
String str2 = "ab" + "c";
则:
System.out.println( str1==str2 );
System.out.println( str1==str3 );
输出的都是true,
以这种方式创建的字符串由于利用了常量池确保只有一个拷贝。
String str1 = new String("abc");
回到楼主的问题:
{"abc","cde"};
String str2 = new String("abc");
System.out.println( s0==s1 );输出为false!!
以这种方式创建的字符串不放入常量池,它们有自己的空间。
回到问题:
   一、String str1 = new String[]{"abc","123","wff"} ;
   二、String str2 = {"abc","123","wff"} ;
第二种创建的字符冲数组是放在常量池空间中的!!第一种有自己的存放空间。
我们发现System.out.println( str1[0]==str2[0] );输出为false.
假如是这样:
一、String[] str1 = {"abc","123","wff"} ;
二、String []str2 = {"abc","123","wff"} ;
System.out.println( str1[0]==str2[0] );输出为false!!!
回复 使用道具 举报
打错字了!!最后应该是:   输出为true!!!
回复 使用道具 举报
问题写错了吧,应该是这样的:一、String str = new String[]{"abc","123","wff"} ;
                                          二、String str[] = {"abc","123","wff"} ;
第一种是一般形式的赋值,但是千万要注意String[] str = new String[]{};这种类型的赋值是要避免的,如此定义就相当于创建了一个长度为0的字符串数组,在后面的赋值中会引起异常。
第二种是数组初始化式,只能用在数组声明的同时进行赋值的情况下。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马