问一个java数组的问题

xingzaicpp 2014-09-05 05:44:09
请问如下代码有什么区别

String[] strArr1 = {"abc","def"};
String[] strArr2 = new String[]{"abc","def"};
...全文
295 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
caodashen 2014-09-09
  • 打赏
  • 举报
回复
引用 13 楼 xi629 的回复:
首先这是字符串数组不是字符串至于那些什么常量池之类的我觉得是瞎扯淡。。。 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
有道理!
dujia1919 2014-09-09
  • 打赏
  • 举报
回复
给大家一些参考: 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类型变量的生成)。楼主的两种生成字符串数组的方法无区别。
JavaPrimary 2014-09-09
  • 打赏
  • 举报
回复
单从创建对象上看,我个人认为第一个只创建了一个对象,第二个创建了两个对象,具体这样分开写,有什么作用,我不清楚。不过实现的效果是一样的。
lingfeng892 2014-09-09
  • 打赏
  • 举报
回复
好像是内存地址不一样,牵扯到字符串池
a12939026 2014-09-08
  • 打赏
  • 举报
回复
引用 10 楼 Kern_ 的回复:
看了一下,楼上没有一个正解。String[] strArr1 = {"abc","def"}; 和 String[] strArr2 = new String[]{"abc","def"}; 字符串数组内容是一模一样的,这也正是字符串的两种创建形式。但是有些面试官就爱问这样的问题,问二者有什么区别,一般的都没有人回答对。给你解释一下,点一下你就会明白的: 二者在内存中是完全不一样的,前者是一个对象即strArr1;后者是两个对象,strArr2和 new String[]{"abc","def"}; ,然后new出来的对象等于了strArr2,就是间接性的赋值。 希望对你有帮助,我也在学java,加油哦!
蛋疼。。 你能不能更深入一点再来指摘楼上没有一个正解。。 String[] strArr1 = {"abc","def"};只是 String[] strArr2 = new String[]{"abc","def"};的一个简写形式罢了。 用比较流行的话说,就是一个语法糖。。他们在编译后是完全一样的。 strArr1是一个对象么。 如果他是成员变量,那么他就是一个引用。如果它是局部变量,他就是一个slot(甚至可能和别的局部变量公用)。 我估计你是背面试题背错了。。 你背的题目是说new String 和直接写的差别。。 这个是数组,和string本身没任何关系。
??435 2014-09-07
  • 打赏
  • 举报
回复
第一个是在字符串池中创建了字符串,当再次引用这些字符串时就不会再创建内存地址来保存这些字符串比如String[] strArr3 = {"abc","def"}; strArr3==strArr1 而String[] strArr2 = new String[]{"abc","def"}; 是新创建一个内存地址来保存这个数组 两者区别是内存地址不同,内容相同
xi629 2014-09-07
  • 打赏
  • 举报
回复
首先这是字符串数组不是字符串至于那些什么常量池之类的我觉得是瞎扯淡。。。 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
Kenney_Qin 2014-09-07
  • 打赏
  • 举报
回复
第一种方法中,字符串被存储在常量数据区中,比如"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。希望能帮到你~
a12939026 2014-09-06
  • 打赏
  • 举报
回复
完全没区别。。 你用2钟不同方式编译成class文件。 你可以看到他们2个完全一样。
计算机苏洵 2014-09-06
  • 打赏
  • 举报
回复
编译器遇到语句1,在内存中开辟了一块空间保存字符串数组 。 第二条语句的new 又开辟了另一块空间 , 所以两条语句效果相同, 内容一样 ,但是放在同一个程序中就是两个不同的引用
中简_2014 2014-09-06
  • 打赏
  • 举报
回复
没有什么区别吧,只是创建的方式不一样而已。
梦想家丶Kern 2014-09-06
  • 打赏
  • 举报
回复
看了一下,楼上没有一个正解。String[] strArr1 = {"abc","def"}; 和 String[] strArr2 = new String[]{"abc","def"}; 字符串数组内容是一模一样的,这也正是字符串的两种创建形式。但是有些面试官就爱问这样的问题,问二者有什么区别,一般的都没有人回答对。给你解释一下,点一下你就会明白的: 二者在内存中是完全不一样的,前者是一个对象即strArr1;后者是两个对象,strArr2和 new String[]{"abc","def"}; ,然后new出来的对象等于了strArr2,就是间接性的赋值。 希望对你有帮助,我也在学java,加油哦!
KJZL 2014-09-05
  • 打赏
  • 举报
回复
两条代码所创建的数组对象是一样的,只是创建的方式不一样而已,java数组的创建方式有多钟。
qingyuan18 2014-09-05
  • 打赏
  • 举报
回复
String在java中属于特殊类型,不像int,double这些基本类新,每个String字符串都是内存中的静态实例 理解了这点上面的代码就好懂了
  • 打赏
  • 举报
回复
你提这个问题我都想了半天,包括看java源码,也没找到合理的解释...
  • 打赏
  • 举报
回复
引用 1 楼 sabcdefg 的回复:
我怎么感觉两个是一模一样的?
确实是一样的,真要说两者有什么硬性区别也不好说。 知道用就行了...
xingzaicpp 2014-09-05
  • 打赏
  • 举报
回复
我怎么感觉两个是一模一样的?

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧