黑马程序员技术交流社区

标题: 集合变数组打印出来的是哈希值 [打印本页]

作者: 复仇的撒旦    时间: 2015-3-31 18:50
标题: 集合变数组打印出来的是哈希值
本帖最后由 复仇的撒旦 于 2015-3-31 18:52 编辑
  1. import java.util.*;
  2. class  Test6
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 Integer[] ig = {1,1,2,2,3,3,4,5,6,7};
  7.                 putRester put = new putRester(ig);
  8.                 put.pr();
  9.         }
  10. }

  11. class putRester  //定义一个取出重复元素的类
  12. {
  13.         private Integer[] ig;
  14.         putRester(Integer[] ig)
  15.         {
  16.                 this.ig = ig;
  17.         }
  18.         public void pr()
  19.         {        
  20.                 List<Integer> al = Arrays.asList(ig);  //将数组变成List集合
  21.                 System.out.println(al);
  22.                 ArrayList<Integer> al1 = new ArrayList<Integer>(); //定义一个新的ArrayList集合用于存入取出的元素
  23.                 Iterator<Integer> it = al.iterator();  //用迭代器将集合中的元素取出
  24.                 while(it.hasNext())
  25.                 {        Integer ige = it.next();
  26.                         if(!al1.contains(ige))     //判断一下,新集合里面有没有这个元素。没有才存进去。
  27.                         {
  28.                                 al1.add(it.next());    //将元素存入新集合中
  29.                         }
  30.                 }
  31.                 Integer[]  ige = al1.toArray(new Integer[10]);  //就是这句,为什么打印出来的是ige的哈希值
  32.                 System.out.println(ige);

  33.         }
复制代码


QQ截图20150331184751.png (1.13 KB, 下载次数: 42)

QQ截图20150331184751.png

作者: 林吉前    时间: 2015-3-31 19:07
{:3_47:}因为你在打印Integer[]对象 你换成ige.toString
作者: 复仇的撒旦    时间: 2015-3-31 20:09
林吉前 发表于 2015-3-31 19:07
因为你在打印Integer[]对象 你换成ige.toString

不行啊,用toString()返回的不还是一个String对象么?
作者: liyanghml    时间: 2015-3-31 21:00
本帖最后由 liyanghml 于 2015-3-31 21:01 编辑

上楼 说的 对啊  ,你想想看,有直接一句System打印数组这一说吗,不都是   便利循环  才能打出数组啊。

ige.toString()就是让你以字符串的形式输出
要么 你就按照  以下格式输出
for(int x =0;x<ige.length;x++)
{
     System.out.println(ige[x]);
}

作者: Fruious    时间: 2015-3-31 21:01
暂时还看不懂
作者: 小小的黑马    时间: 2015-3-31 21:17
虽然看不懂 但还是赞一个!!!!!!!
作者: 林吉前    时间: 2015-3-31 21:31
复仇的撒旦 发表于 2015-3-31 20:09
不行啊,用toString()返回的不还是一个String对象么?

{:3_47:}那就是Integer没有重写toString或者toString就是跟Object一样的
作者: 林吉前    时间: 2015-3-31 21:33
林吉前 发表于 2015-3-31 21:31
那就是Integer没有重写toString或者toString就是跟Object一样的

{:3_47:}你那不是Integer 是Integer[]数组 是数组
作者: hhh233    时间: 2015-3-31 21:46
liyanghml 发表于 2015-3-31 21:00
上楼 说的 对啊  ,你想想看,有直接一句System打印数组这一说吗,不都是   便利循环  才能打出数组啊。

i ...

对,直接打出数组名 只是打印出了地址而已
作者: hhh233    时间: 2015-3-31 21:56
toArray(new Integer[10]) 里边在new个数组干嘛呢?
作者: Grady    时间: 2015-3-31 22:13
复仇的撒旦 发表于 2015-3-31 20:09
不行啊,用toString()返回的不还是一个String对象么?

重写toString方法试试
作者: xiaogougou    时间: 2015-3-31 22:21
是的需要重写toString,哥们可以试一试。
作者: luoyu1530    时间: 2015-3-31 22:30
toString方法你没重写,所以调用的是Object类的,打出来的自然是哈希值了(我记得不是地址值么)
作者: wkz_crystal    时间: 2015-3-31 22:43
你的程序有错误哦,打印是地址值, 不再多说了,想必你已经明白了……因为他是一个对象数组,怎么能直接打印了,但是最简单的查看方式是这样的……可以直接打印al1即可,这样也能显示新集合中的方法:
  1. import java.util.*;
  2. class  Test61
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 Integer[] ig = {1,1,2,2,3,3,4,5,6,7};
  7.                 putRester put = new putRester(ig);
  8.                                 put.pr();
  9.         }
  10. }

  11. class putRester  //定义一个取出重复元素的类
  12. {
  13.         private Integer[] ig;
  14.         putRester(Integer[] ig)
  15.         {
  16.                 this.ig = ig;
  17.         }
  18.         public void pr()
  19.         {        
  20.                         List<Integer> al = Arrays.asList(ig);  //将数组变成List集合
  21.                         System.out.println(al);
  22.                         ArrayList<Integer> al1 = new ArrayList<Integer>(); //定义一个新的ArrayList集合用于存入取出的元素
  23.                         Iterator<Integer> it = al.iterator();  //用迭代器将集合中的元素取出
  24.                         while(it.hasNext())
  25.                         {       Integer ige = it.next();
  26.                                         if(!(al1.contains(ige)))     //判断一下,新集合里面有没有这个元素。没有才存进去。
  27.                                         {
  28.                                                 al1.add(ige);    //【这里是应该把不包含的元素添加到新集合中吧!】
  29.                                                 //不应该是al1.add(it.next());将元素存入新集合中
  30.                                         }
  31.                         }
  32.                         System.out.println(al1); //显示新集合就完了嘛!【只是查看的话】
  33.                         //Integer[]  ige = al1.toArray(new Integer[10]);  //就是这句,为什么打印出来的是ige的哈希值
  34.                         //System.out.println(ige);
  35.         }
  36. }
复制代码



作者: 花独恋水    时间: 2015-3-31 22:51
基本数据类型应该打不出来,要打印的话就会像打印int数组一样打印出地址值
作者: lwj123    时间: 2015-3-31 22:53
Integer ige = it.next();//你在这里next()一次
if(!al1.contains(ige))     //判断一下,新集合里面有没有这个元素。没有才存进去。
{
        al1.add(it.next());    //你在这里next()又一次
}

存放的值不一样的哦。
这是我的个人光观点啊。:#

打印对象值,调用toString()方法,默认调用的是Object中的Sting方法,打印的类名@Integer.toHexString(xx.hashCode())
打印的值是Integer数组的话,打印的结果也是调用toString方法
Integer[] i = { 1, 2, 3 };
System.out.println(i);//[Ljava.lang.Integer;@5c1d29c1


作者: 466273082    时间: 2015-3-31 23:00
将这些值试着遍历下看是否OK呢
作者: 李明全    时间: 2015-4-1 00:17
就是Integer没有重写toString或者toString就是跟Object一样的
作者: 复仇的撒旦    时间: 2015-4-1 07:56
wkz_crystal 发表于 2015-3-31 22:43
你的程序有错误哦,打印是地址值, 不再多说了,想必你已经明白了……因为他是一个对象数组,怎么能直接打 ...

额  我开始也是这样的,的确可以,但是违背我的原意了,我就是想变成数组了在打印的
作者: 复仇的撒旦    时间: 2015-4-1 07:58
lwj123 发表于 2015-3-31 22:53
Integer ige = it.next();//你在这里next()一次
if(!al1.contains(ige))     //判断一下,新集合里面有没有 ...

恩恩,那个地方是写错了,结果我验证了下是一样的!这么说只有重写toSrting方法?
作者: 复仇的撒旦    时间: 2015-4-1 08:01
hhh233 发表于 2015-3-31 21:56
toArray(new Integer[10]) 里边在new个数组干嘛呢?

因为我知道取出的元素是什么类型啊,就可以指定一个长度合适的类型也合适的数组来存放这些元素。不这样也可以,就直接定义Object[]
作者: 李能甫    时间: 2015-4-1 08:11
要用ToString转换呀!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2