0%

HashSet和Iterator的使用

HashSet是实现Set接口的Hash表,HashSet里面的元素是唯一的,不可重复,HashSet通过计算元素的hashCode来判断表内是否已经存在相同元素,如果已存在,则不再添加.如果存储的是自定义对象,必须重写该对象的equals和hashCode方法 .Iteartor中文名叫迭代器,可以访问实现collection接口的对象,只有三种方法:hasNext(),next(),remove(),分别判断后面是否还有元素,移动到下一元素,移除当前元素.范例:

package com.pocketdigi;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;

public class Main {
    static ArrayList list;

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        HashSet hs=new HashSet();
        hs.add(new People(1,"zhang"));
        hs.add(new People(2,"wang"));
        hs.add(new People(3,"li"));
        hs.add(new People(1,"zhang"));
        //HashSet不允许重复的元素,这里id 1 name zhang重复了
        //但是默认情况下HashSet是计算该元素内存的HashCode来确定是否同一元素的
        //所以默认情况下上面的代码添加了4个元素
        //必须重写People的类equals和hashCode方法来帮助HashSet判断是否属于同一元素,重写hs里只有3个元素
        Iterator it=hs.iterator();
        //HashSet没有取出元素的方法,只能用迭代器
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }
    
}
class People{
    int id;
    String name;
    People(int id,String name){
        this.id=id;
        this.name=name;
    }

    @Override
    public boolean equals(Object obj) {
        // TODO Auto-generated method stub
        People p=(People)obj;
        return id==p.id&&name.equals(p.name);
        //重写equals方法,对比id和name
    }

    @Override
    public int hashCode() {
        // TODO Auto-generated method stub
        return id;
        //直接返回id作hashCode,必须保证每个对象的id唯一
    }

    public String toString(){
        return "id:"+id+" name:"+name;
    }
}