容器选择
取的元素很多,频繁的增删元素: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【乘的数任意】来保证哈希值的唯一性;