import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
class Book
{
private String name;
public Book(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Book [name=" + name + "]";
}
}
public class Test3 {
public static void main(String[] args) {
Collection books = new HashSet();
books.add(new Book("sssss"));
books.add(new Book("qqqqq"));
books.add(new Book("rrr"));
books.add(new Book("ttt"));
Iterator iter = books.iterator();
while(iter.hasNext())
{
Book temp = (Book) iter.next();
System.out.println(temp);
//temp.setName("shizhan");
temp = new Book("shizhan");
}
System.out.println(books);
}
}
上面的代码输出了
Book [name=qqqqq]
Book [name=sssss]Book [name=rrr]
Book [name=ttt]
虽然我们让迭代器的变量指向了新的Book对象,但是集合中元素对象本身并没有改变,相当于迭代器的变量开始指向了集合元素对象的地址,后来指向了Book("shizhan")的地址,但是集合元素对象本身并没有改变,即我们没有修改集合。
但是如果使用temp.setName(“shizhan”),这时候情况就不一样了,相当于迭代器的变量开始指向了集合元素对象的地址,并根据这个地址,进入集合对象家里对其家里的东西进行了修改,所以将看到下面结果:
[Book [name=shizhan], Book [name=shizhan], Book [name=shizhan], Book [name=shizhan]]
以上这两种方式的不同,需要好好理解,不要一会认为通过迭代器变量无法修改集合元素对象本身,一会又认为可以通过迭代器变量修改集合元素对象本身,谨记以上知识点。