黑马程序员技术交流社区

标题: 急,请问这是怎么回事? [打印本页]

作者: 曾经的迷失    时间: 2014-5-28 15:43
标题: 急,请问这是怎么回事?
  1. <font size="2">import java.util.*;

  2. class Person
  3. {
  4.         private String name;
  5.         private int age;
  6.        
  7.         Person()
  8.         {}
  9.        
  10.         Person(String name, int age)
  11.         {
  12.                 this.setName(name);
  13.                 this.setAge(age);
  14.         }
  15.        
  16.         public void setName(String name)
  17.         {
  18.                 this.name = name;
  19.         }
  20.        
  21.         public void setAge(int age)
  22.         {
  23.                 this.age = age;
  24.         }
  25.        
  26.         public String getName()
  27.         {
  28.                 return name;
  29.         }
  30.        
  31.         public int getAge()
  32.         {
  33.                 return age;
  34.         }
  35.        
  36.         @Override
  37.         public boolean equals(Object obj)
  38.         {
  39.                 if(obj.getClass()!=Person.class)
  40.                 {
  41.                         return false;
  42.                 }
  43.                 if(!(obj instanceof Person))
  44.                 {
  45.                         return false;
  46.                 }
  47.                
  48.                 Person p = (Person)obj;
  49.                
  50.                 return this.name.equals(p.name) && this.age==p.age;       
  51.         }

  52.         @Override
  53.         public int hashCode()
  54.         {
  55.                 final int num = 8;
  56.                
  57.                 return name.hashCode()+age*8;
  58.         }

  59.         @Override
  60.         public String toString()
  61.         {
  62.                 return "姓名:"+name+",年龄:"+age;
  63.         }
  64. }

  65. class ArrayListTest2
  66. {
  67.         public static void main(String[] args)
  68.         {
  69.                 //创建一个集合。
  70.                 List<Person> list = new ArrayList<Person>();
  71.                
  72.                 //添加元素
  73.                 list.add(new Person("老阳",26));
  74.                 list.add(new Person("老洲", 25));
  75.                 list.add(new Person("小黄",24));
  76.                 list.add(new Person("小白",24));
  77.                 list.add(new Person("老洲",25));
  78.                
  79.                 //创建一个迭代器
  80.                 Iterator<Person> it = list.iterator();
  81.                
  82.                 System.out.println("为去除相同元素之前:");
  83.                
  84.                 //对元素进行迭代
  85.                 while(it.hasNext())
  86.                 {
  87.                         System.out.println(it.next());
  88.                 }
  89.                
  90.                 //返回一个没有重复元素的集合
  91.                 List<Person> newlist = removeElement(list);
  92.                
  93.                 Iterator<Person> its = newlist.iterator();
  94.                
  95.                 System.out.println("为去除相同元素之后:");
  96.                 while(its.hasNext())
  97.                 {
  98.                         System.out.println(its.next());
  99.                 }
  100.                
  101.         }
  102.        
  103.         //去除相同的元素
  104.         public static List<Person> removeElement(List<Person> list)
  105.         {
  106.                 List<Person> newlist = new ArrayList<Person>();
  107.                 Iterator<Person> it = list.iterator();
  108.                 while(it.hasNext())
  109.                 {
  110.                         Person p  = it.next();
  111.                         //新的集合没有包含有这个元素才往新集合中添加元素
  112.                         if(!newlist.contains(p))
  113.                         {
  114.                                 newlist.add(p);
  115.                         }
  116.                         /*
  117.                         为什么这样写就不行呢?
  118.                         if(!newlist.contains(it.next()))
  119.                         {
  120.                                 newlist.add(it.next());
  121.                         }
  122.                         */
  123.                 }
  124.                
  125.                 return newlist;
  126.         }</font>
  127. }
复制代码
问题在代码注释中。。求大神解答!!

作者: tacyjay在路上    时间: 2014-5-28 18:25
本帖最后由 tacyjay在路上 于 2014-5-28 18:27 编辑

这个毕老师应该讲过,原理类似。
因为你在 if(!newlist.contains(it.next()))这一句判断时,it.next()已经指向了一个对象了,
当在下面 newlist.add(it.next());中添加时,it.next()这时会指向另一个对象,前后这两个对象不是同一个对象

所以来说,不要连续使用.next()这个方法!




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