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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© cyh8807 中级黑马   /  2013-1-20 14:47  /  2186 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 赵彦辉 于 2013-1-20 15:36 编辑
  1. import java.util.*;
  2. public class ArraysTest
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 int[] nums = {1,2,3};
  7.                 List<int[]> list = Arrays.asList(nums);
  8.                 System.out.println(list);
  9.         }
  10. }
复制代码
如果数组中的元素都是对象,变成集合时,数组中的元素就直接转换成集合中的元素。
如果数组中的元素都是基本数据类型,变成集合时,会将该数组作为集合中的元素存在。

根据上面两句话,请大家给解答下,上述代码为什么输出的不是:1,2,3;而是int[]数组的hashcode值,有点小迷惑。

评分

参与人数 1技术分 +1 收起 理由
金鑫 + 1

查看全部评分

14 个回复

倒序浏览
本帖最后由 柴乔军 于 2013-1-20 15:20 编辑
  1. List<int[]> list = Arrays.asList(nums);//存入的是一个长度为3得到 int类型的数组,元素为1,2,3

  2. System.out.println(list);

  3. public class Student

  4. {

  5.         public static void main(String[] args)

  6.         {

  7.                 int[] nums = {1,2,3};

  8.                 List<int[]> list = Arrays.asList(nums);

  9.                 for(Iterator iter = list.iterator();iter.hasNext();) { //对list进行遍历操作,可以看出 list 里面只有一个元素,那就是一个名为nums的int[]对象

  10.                         System.out.println(iter.next());  //这里输出的结果是 nums的哈希值:[I@dc8569
  11.                 }

  12.         }

  13. }
复制代码

评分

参与人数 2技术分 +1 黑马币 +3 收起 理由
金鑫 + 1
cyh8807 + 3

查看全部评分

回复 使用道具 举报
"如果数组中的元素都是基本数据类型,变成集合时,会将该数组作为集合中的元素存在。",list里面只有一个元素,就是数组nums的变量名,list将它作为一个对象存入了内存。当你打印list时就相当于System.out.println(nums);

评分

参与人数 1黑马币 +3 收起 理由
cyh8807 + 3

查看全部评分

回复 使用道具 举报
黑马刘杰 发表于 2013-1-20 15:09
"如果数组中的元素都是基本数据类型,变成集合时,会将该数组作为集合中的元素存在。",list里面只有一个元 ...

System.out.println(nums);和System.out.println(list);
是有区别的,结果如下:
System.out.println(list);//    [[I@dc8569]
System.out.println(nums); //  [I@dc8569
回复 使用道具 举报
本帖最后由 黑马张英涛 于 2013-1-20 15:24 编辑

不知道楼主注意到没有,System.out.println(list)和System.out.println(nums)结果不完全一样,比较一下你就会发现不一样的地方:
System.out.println(list) -----> [[I@1b48197]
System.out.println(nums) -----> [I@1b48197
显然在第一条打印语句明显可以看出整个数组是作为集合的一个元素存放的。
要想输出结果为1,2,3,你需要将数组从集合中取出来然后再遍历一遍。

评分

参与人数 1黑马币 +3 收起 理由
cyh8807 + 3

查看全部评分

回复 使用道具 举报
柴乔军 发表于 2013-1-20 15:15
System.out.println(nums);和System.out.println(list);
是有区别的,结果如下:
System.out.println(lis ...

第一个打印的是list集合的hashcode值,
第二个打印的是原数组int[]的hashcode值,
但是请看下面这段代码
  1. for(Iterator<int[]> it = list.iterator();it.hasNext();)
  2.                 {
  3. //                        int[] arr = it.next();
  4. //                        System.out.println(arr);
  5.                         System.out.println(it.next());
  6. //                System.out.println(Arrays.toString(it.next()));
  7.                 }
复制代码
其中直接使用System.out.println(it.next())进行输出会抛出 NoSuchElementException异常,这是为什么?

回复 使用道具 举报
赵彦辉 发表于 2013-1-20 15:29
第一个打印的是list集合的hashcode值,
第二个打印的是原数组int[]的hashcode值,
但是请看下面这段代码 ...

很蛋疼,一会抛异常,一会不抛异常,这个问题到此结束,谢谢回答哦
回复 使用道具 举报
黑马张英涛 发表于 2013-1-20 15:20
不知道楼主注意到没有,System.out.println(list)和System.out.println(nums)结果不完全一样,比较一下你就 ...

嗯,通过你的回答,我已经明白了,谢谢你的解释哦
回复 使用道具 举报
txl 中级黑马 2013-1-20 15:55:08
9#
本帖最后由 黑马唐贤来 于 2013-1-20 15:56 编辑

嘿嘿,就是根据
"如果数组中的元素都是基本数据类型,变成集合时,会将该数组作为集合中的元素存在。"

nums数组就是基本数据类型,将它转换为集合就是直接将将nums数组做为集合中的元素存在
  1. import java.util.*;
  2. public class ArraysTest
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 int[] nums = {1,2,3};
  7.                 System.out.println(nums);//直接打印nums数组
  8.                
  9.                 System.out.println("nums的哈希值 = "+nums.hashCode());//输出nums的哈希值
  10.                
  11.                 List list = Arrays.asList(nums);
  12.                
  13.                 System.out.println("输出list集合 = "+list);//输出list集合,其中0角标就是nums数组
  14.                
  15.                 System.out.println("输出list哈希值 = "+list.hashCode());//输出list哈希值
  16.                
  17.                 /*
  18.                  * 运行结果如下:
  19.                                  *        直接打印nums数组 = [I@190d0630
  20.                                  *        nums的哈希值 = 638666281
  21.                                  *        输出list集合 = [[I@26114629]
  22.                                  *        输出list哈希值 = 638666312
  23.                                  *
  24.                                  *可见打印list并不是楼主所说的int[]数组的hashcode值,而是将集合中的元素按序打印,
  25.                                  *只不过第一个元素是一个数组,所以打印的是数组在内存中所对应的地址
  26.                  * */
  27.                
  28.         }
  29. }
复制代码

评分

参与人数 2技术分 +1 黑马币 +3 收起 理由
金鑫 + 1
cyh8807 + 3

查看全部评分

回复 使用道具 举报
本帖最后由 黑马张英涛 于 2013-1-20 16:20 编辑
赵彦辉 发表于 2013-1-20 15:29
第一个打印的是list集合的hashcode值,
第二个打印的是原数组int[]的hashcode值,
但是请看下面这段代码 ...

第一个打印的也不是集合的hashcode值,你可以自己打印一下结果比较一下,这是我的结果:
System.out.println(list);                              ----> [[I@1b48197]
System.out.println(nums);                          ---->  [I@1b48197
System.out.println(nums.hashCode());         ---->  28606871
System.out.println(list.hashCode());             ---->  28606902
至于后面使用System.out.println(it.next())进行输出会抛出 NoSuchElementException异常,是因为你多次调用了next()方法,这个集合中只有一个元素,你第一次调用后迭代器就移到末尾了,你再调用当然就没有元素了。
其实这些问题都不难,你就是有些急躁了,静下心来好好分析下就很容易找到错误原因了。

评分

参与人数 1技术分 +1 收起 理由
金鑫 + 1

查看全部评分

回复 使用道具 举报
黑马张英涛 发表于 2013-1-20 16:16
第一个打印的也不是集合的hashcode值,你可以自己打印一下结果比较一下,这是我的结果:
System.out.print ...

嗯,说的灰常正确啊,三克油
回复 使用道具 举报
黑马唐贤来 发表于 2013-1-20 15:55
嘿嘿,就是根据
"如果数组中的元素都是基本数据类型,变成集合时,会将该数组作为集合中的元素存在。"

谢谢你的测试,我刚刚就没有想到这样去测试一下
回复 使用道具 举报
你把数组当做元素存进List集合中了。我猜想你是想把int[]里面的元素存入List吧。你把List<int[]>,改成List<Integer>就行了
回复 使用道具 举报
黄锦成 发表于 2013-1-20 16:52
你把数组当做元素存进List集合中了。我猜想你是想把int[]里面的元素存入List吧。你把List,改成List就行了 ...

里面不能放Integer做泛型的
回复 使用道具 举报
赵彦辉 发表于 2013-1-20 17:22
里面不能放Integer做泛型的

我试了一下,是不行。如果是引用数据类型数据,就会把数组里的元素当做集合元素存进去,如果是基本数据类型,则把整个数组当做一个Object存进去。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马