集合---set接口

2017-02-12  本文已影响9人  李霖神谷

set集合是collection下的接口,无序不重复。set中的方法与collection中的方法相同。
它的下面也有一些实现类
hashset类:它的底层是一个哈希表,当一个对象要在hashset中存放的时候,会拿这个对象根据算法算出它在数组中的位置。这个算法就是Object中的hashcode方法。
它的底层容量是16,当内存不够是,以0.75倍增长。
给hashset存放对象时应该注意什么问题:
一定要根据对象的特有数据计算哈希值,并且通过equals方法进行比较。所以自定义对象所属的类一定要对hashcode equals toString进行复写。
hashset如何保证自定义对象的唯一:
自定义对象根据对象的特有数据计算哈希值,如果相同再在equals方法中比较如果返回true则两对象有相同地址两对象是同一个,不保存,如果哈希值相同equals返回fals依然保存。

import java.util.HashSet;
import java.util.Iterator;
class People {
    private String name;
    private int age;
    
    public People(String string, int i) {
        // TODO Auto-generated constructor stub
        this.name=string;
        this.age=i;
    }
    
    @Override
    public int hashCode() {
        // TODO Auto-generated method stub
        return age*2;
    }
    
    @Override
    public boolean equals(Object obj) {
        // TODO Auto-generated method stub
        return true;
    }

    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public int getAge() {
        return age;
    }
    
    public void setAge(int age) {
        this.age = age;
    }
    
    @Override
    public String toString() {
        return "People [name=" + name + ", age=" + age + "]";
    }
    
}

public class HashsetDemo {
    public static void main(String[] args) {
        
        HashSet h=new HashSet();
        h.add(new People("lishuai",22));
        h.add(new People("lishuai",22));
        h.add(new People("wangwu",20));
        h.add(new People("zhangxi",29));
        h.add(new People("lishuai",22));
        for(Iterator i=h.iterator();i.hasNext();){
            System.out.println(i.next());
        }
    }
    
    @Override
    public String toString() {
        return "JiHeDemo [getClass()=" + getClass() + ", hashCode()=" + hashCode() + ", toString()=" + super.toString()
        + "]";
    }
}

不同的人的年龄不一样,我们通过hashcode复写计算不同的哈希值,不同的哈希值代表不同的对象,如果相同就不保存,这时再通过equals判断它们的地址。
LinkeHashset:它没有自己的方法,都是继承hashset的方法。保证了存储有序,并且对象唯一。

上一篇 下一篇

猜你喜欢

热点阅读