集合(5)

容器选择

取的元素很多,频繁的增删元素:linkedlist

涉及到增删,不频繁:linkedlist,arraylist

涉及到了增删,同时涉及到了查询:建议使用arraylist【一般情况增删不多,查询多】

Set:没有顺序,元素不可以重复

Set集合的功能和collection的功能是一致的。

Set两大子类

Hashset:底层数据结构是哈西表【hashset 中的顺序是按照哈希值的顺序存放的,与存的顺序无关】

Treeset

哈希值在比较的时候;如果哈希值相同会再判断元素对象是否相同(equals)。

一般自定义的类通常要复写hashcode(),equals()【尤其是要加入到hashset里面的】

HashSet删除和判断的依据:

对于判断元素是否存在以及删除等操作,依赖的方法是元素的hashCode() 的equals();

Arraylist判断元素是否存在以及删除,只依赖equals()【取决于数据结构】

Hashset练习:姓名年龄相同为同一人

class Person{
    String name;
    int age;
    Person(String name,int age)
    {
        this.name=name;
        this.age=age;
    }
    public int hashCode()
    {
        return name.hashCode()+age;
    }
    public boolean equals(Object obj)
    {
        Person p=(Person)obj;
        if(p.name==this.name&& p.age==this.age)
        {
            return true;
        }
        else{
            return false;
        }
        
    }
}
public class test{
    public static void main(String[] args)
    {
        HashSet hs = new HashSet();
        Person s1= new Person("zhangsan",12);
        Person s2= new Person("lisi",13);
        Person s3= new Person("zhangsan",12);
        hs.add(s1);
        hs.add(s2);
        Iterator it = hs.iterator();
        while(it.hasNext())
        {
            Person p=(Person) it.next();
            System.out.println(p.name+"***"+p.age);
            
        }
                
        }
        
    }

原理:hashTable在比较时先比较哈希码,如果哈希码相同就在调用equals方法,如果不相同就不会调用equals方法

hashCode()中返回的hash值:

name.hashCode()+age

易出现两值不相同,但和相同的情况

为了避免这种情况,通常age*39【乘的数任意】来保证哈希值的唯一性;

原文地址:https://www.cnblogs.com/excellencesy/p/8511154.html