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