HashSet——>底层是HashMap 数组+链表 即散列表 或 邻接链表
无序 无重复
无序:我们使用过集合存放元素的顺序 集合内取出来的顺序不一致
集合本身有自己的算法排布顺序 hash算法
1.java.util包
2.创建对象
无参数构造方法
带(Collection<? extends E> c)参数构造方法
3.常用方法
增删查改
boolean = add(value);·
addAll(Collection c); retainAll(); removeAll(); size();
boolean = remove(Object obj);
没有修改方法(因为不清楚位置)
可以使用增强for进行集合遍历轮询或者迭代器
iterator();
如
HashSet
set.add(“a”);
set.add(“A”);
set.add(“c”);
set.add(“C”);
set.add(“B”);
set.add(“b”);
//Iterator是一个接口 在java.util包下
//获取迭代器对象
//通过set集合获取 不能new出来 因为new出来的对象是空的 不知道要找谁
Iterator
while(it.hasNext()){//判断下一个位置是否有元素
//注意迭代器头的下一个位置 相当于集合的头
String value = it.next();//如果有元素就取出来
System.out.println(value);
}
//注意若用迭代器循环执行删除操作 可能会出现CurrentModifyException异常
//这个异常是因为删除不干净引起的 可以参考list集合的remove方法 i++ size—
4.无重复的原则
是由 equals方法 和 hashCode方法 来判断元素是否重复
如果想要让Person对象的name一致 认为是一个对象
则需要重写 equals方法
仅仅重写了equals方法 发现还没达到无重复的效果
证明可能需要满足的原则不止equals方法一个这么简单
由hashSet联想到 hashCode方法
hashCode方法 是将对象的地址进过计算得到一串hashCode码 如果hashCode码不一样 说明还不是一个人
要想达到无重复的效果 还需重写 hashCode方法
equals方法 和 hashCode方法是属于Object类下的方法 所以不重写也能存入 只是达不到无重复的要求
对象只有一个name属性时:
public class Person {private String name;private int num;//编号 记录是第几个进来的public Person(String name,int age,int num){this.name = name;this.num = num;}public int getNum(){return this.num;}public boolean equals(Object obj){if(this==obj){return true;//先对比对象的地址 如果地址一样说明肯定存的是同一个人}if(obj instanceof Person){//如果地址不一样 在看看obj是否属于Person类型Person anotherPerson = (Person) obj;//如果属于 造型return anotherPerson.name.equals(this.name);//对比两个人的名字是否一致//(注意这里面的equals方法是String类下的(name是String类型的) 而不是我们现在重写的equals方法}return false;//对象不一样 类型也不一样 那么一定不是同一个}//重写hashCode方法public int hashCode(){//如果person对象name属性一致 我们需要让hashCode返回值一致return this.name.hashCode();}//重写toString方法 让对象打印输出时输出的是对象的属性 而不是一串hashCode码public String toString(){StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("{");stringBuilder.append(this.name);stringBuilder.append(",");stringBuilder.append(this.num);stringBuilder.append("}");return new String(stringBuilder);//StringBuilder 变为 String的方法有两个//另一个是 stringBuilder.toString();}}
主方法:
public static void main(String[] args) {HashSet<String> stringSet = new HashSet<String>();stringSet.add("小明");stringSet.add("小明");stringSet.add("小明");stringSet.add("小明");stringSet.add("小明");System.out.println(stringSet.size());//长度为 1HashSet<Person> personSet = new HashSet<Person>();personSet.add(new Person("小明",5));personSet.add(new Person("小明",1));personSet.add(new Person("小明",2));personSet.add(new Person("小明",3));personSet.add(new Person("小明",4));System.out.println(personSet);//没重写时 长度为 5//重写了equals方法和hashCode方法后 此时的长度就是1//重写了toString方法后 可以直接输出对象的属性 而不是输出一串hashCode码//上述结果输出的是第一个进来的对象 [{小明,5}]}
对象有两个属性时:
public class Person {private String name;private int age;private int num;//编号 记录是第几个进来的public Person(String name,int age,int num){this.name = name;this.age = age;this.num = num;}public int getNum(){return this.num;}public boolean equals(Object obj){if(this==obj){return true;//先对比对象的地址 如果地址一样说明肯定存的是同一个人}if(obj instanceof Person){//如果地址不一样 在看看obj是否属于Person类型Person anotherPerson = (Person) obj;//如果属于 造型if(anotherPerson.name.equals(this.name)) {return anotherPerson.age == ((Person) obj).age;//如果名字一样 比较年龄}}return false;//对象不一样 类型也不一样 那么一定不是同一个}//重写hashCode方法public int hashCode(){//如果person对象name属性与age属性一致 我们需要让hashCode返回值也一致return this.name.hashCode()+this.age;}//重写toString方法 让对象打印输出时输出的是对象的属性 而不是一串hashCode码public String toString(){StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("{");stringBuilder.append(this.name);stringBuilder.append(",");stringBuilder.append(this.age);stringBuilder.append(",");stringBuilder.append(this.num);stringBuilder.append("}");return new String(stringBuilder);}}
主方法:
public static void main(String[] args) {HashSet<String> stringSet = new HashSet<String>();stringSet.add("小明");stringSet.add("小明");stringSet.add("小明");stringSet.add("小明");stringSet.add("小明");System.out.println(stringSet.size());//长度为 1HashSet<Person> personSet = new HashSet<Person>();personSet.add(new Person("小明",25,5));personSet.add(new Person("小明",16,1));personSet.add(new Person("小明",16,2));personSet.add(new Person("小明",20,3));personSet.add(new Person("小明",22,4));System.out.println(personSet);//上述结果输出 [{小明,25,5}, {小明,16,1}, {小明,20,3}, {小明,22,4}]}
