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());//长度为 1
HashSet<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());//长度为 1
HashSet<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}]
}