黑马程序员技术交流社区

标题: 还是集合元素的问题,求精确解答... [打印本页]

作者: 王宝康    时间: 2012-7-15 16:31
标题: 还是集合元素的问题,求精确解答...
本帖最后由 王宝康 于 2012-7-16 11:45 编辑
  1. package collection;

  2. import java.util.ArrayList;
  3. import java.util.Collection;

  4. public class DoubtAboutCollection {

  5. /**
  6. * @param args
  7. * 打印集合会得到一个数组,数组长度为collection.size()。里边的元素为对象的引用,即
  8. */
  9. private int doubtInt;
  10. private String doubtString;
  11. public DoubtAboutCollection(){}
  12. public DoubtAboutCollection(int doubtInt,String doubtString)
  13. {
  14. this.doubtInt = doubtInt;
  15. this.doubtString = doubtString;
  16. }
  17. public static void main(String[] args) {
  18. // TODO Auto-generated method stub
  19. DoubtAboutCollection dac1 = new DoubtAboutCollection();
  20. DoubtAboutCollection dac2 = new DoubtAboutCollection();
  21. DoubtAboutCollection dac3 = new DoubtAboutCollection();
  22. dac1.setDoubtInt(1);
  23. dac1.setDoubtString("abc1");
  24. dac2.setDoubtInt(2);
  25. dac2.setDoubtString("abc2");
  26. dac3.setDoubtInt(3);
  27. dac3.setDoubtString("abc3");
  28. Collection<DoubtAboutCollection> coll = new ArrayList<DoubtAboutCollection>();
  29. coll.add(dac1);
  30. coll.add(dac2);
  31. coll.add(dac3);
  32. sop(coll);
  33. }

  34. public static void sop(Object obj){
  35. System.out.println(obj);
  36. }
  37. public int getDoubtInt() {
  38. return doubtInt;
  39. }
  40. public void setDoubtInt(int doubtInt) {
  41. this.doubtInt = doubtInt;
  42. }
  43. public String getDoubtString() {
  44. return doubtString;
  45. }
  46. public void setDoubtString(String doubtString) {
  47. this.doubtString = doubtString;
  48. }

  49. }
复制代码
打印结果是[collection.DoubtAboutCollection@de6ced, collection.DoubtAboutCollection@c17164, collection.DoubtAboutCollection@1fb8ee3],这里边的内容是什么啊?我记得毕老师的讲的关于数组那一块的视频,打印数组也会出现类似的xxxxArray@xxx,说是什么哈希值,不知道这儿是不是和那儿一样,还有就是为啥打印成了数组了,各位谁对这个比较明了,求详细解答....

作者: 王宝康    时间: 2012-7-15 16:44
我好像有点儿明白了collection.DoubtAboutCollection为我那个对象所在的类的名字,然后后面的@xxxx是地址?是不是啊!?那为什么打印出数组的格式啊?
作者: 黑马刘涛    时间: 2012-7-15 16:58
本帖最后由 黑马刘涛 于 2012-7-15 17:00 编辑

[collection.DoubtAboutCollection@de6ced, collection.DoubtAboutCollection@c17164, collection.DoubtAboutCollection@1fb8ee3],打印成这个样子是因为继承了类 AbstractCollection<E>的toString()方法。collection.DoubtAboutCollection表示的是集合中的一个元素类型,就像数组[I@XXXX,I表示数组中元素类型为int.@后面的值表示由int hashCode()计算出来的hash值,当然hashCode方法继承自类 AbstractList<E>。
作者: 王宝康    时间: 2012-7-15 17:28
黑马刘涛 发表于 2012-7-15 16:58
[collection.DoubtAboutCollection@de6ced, collection.DoubtAboutCollection@c17164, collection.DoubtAbo ...

哦,刚才看了下API,
toString
public String toString()返回此 collection 的字符串表示形式。该字符串表示形式由 collection 元素的列表组成,这些元素按其迭代器返回的顺序排列,并用方括号 ("[]") 括起来。相邻元素由字符 ", "(逗号加空格)分隔。通过 String.valueOf(Object) 可以将元素转换成字符串。豁然开朗,原来不是数组,是以方括号 ("[]") 括起来的字符串,还有,这儿还涉及到
println
public void println(Object x)打印 Object,然后终止该行。此方法首先调用 String.valueOf(x) 获取打印对象的字符串值,然后的行为如同先调用 print(String) 再调用 println() 一样。这儿先把Collection对象转换成String,自然就会调用AbstractCollection<E>的toString()方法。

toString
public String toString()返回该对象的字符串表示。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。
Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:

getClass().getName() + '@' + Integer.toHexString(hashCode())

返回:
该对象的字符串表示形式。


哇...哥们儿,你太牛了,受益匪浅啊,哈哈...
作者: 陆强强    时间: 2012-7-15 17:29
  给楼主整理了一下代码:   
DoubtAboutCollection dac1 = new DoubtAboutCollection();
dac1.setDoubtInt(1);
dac1.setDoubtString("abc1");
就等同于 DoubtAboutCollection dac1 = new DoubtAboutCollection(1,"abc");

DoubtAboutCollection dac1 = new DoubtAboutCollection(1,"abc"); //楼主加入集合的都是new DoubtAboutCollection对象,所以打印的是对象的内存地址,DoubtAboutCollection@de6ced。DoubtAboutCollection指对象的名称,de6ced对此昂内存地址所演算出来的哈希值。内存地址本身是不能打印的       
DoubtAboutCollection dac2 = new DoubtAboutCollection(2,"abc2");

DoubtAboutCollection dac3 = new DoubtAboutCollection(3,"abc3");

       

        Collection<DoubtAboutCollection> coll = new ArrayList<DoubtAboutCollection>();

        coll.add(dac1);

        coll.add(dac2);

        coll.add(dac3);

        sop(coll);
作者: 王宝康    时间: 2012-7-15 17:42
陆强强 发表于 2012-7-15 17:29
给楼主整理了一下代码:   
DoubtAboutCollection dac1 = new DoubtAboutCollection();
dac1.setDoubtIn ...

DoubtAboutCollection@de6ced是Object类的toString方法的返回值,API中有很明白的讲解,不过我还是有点儿疑惑,那就是
Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:

getClass().getName() + '@' + Integer.toHexString(hashCode())

这儿的hashCode()这个方法是调用的当前对象的吗?好像是,是不?


作者: 苑占丽    时间: 2012-7-15 17:45
王宝康 发表于 2012-7-15 17:28
哦,刚才看了下API,
toString
public String toString()返回此 collection 的字符串表示形式。该字符串 ...

恩,非常好




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