set接口(存放无序,不重复的元素)
(1)HashSet集合:采用哈希表结构存储数据,保证元素唯一性的方式依赖于:hashCode()与equals()方法
在给哈希表中存放对象时,会调用对象的hashCode方法,算出对象在表中的存放位置,这里需要注意,
如果两个对象hashCode方法算出结果一样,这样现象称为哈希冲突,这时会调用对象的equals方法,
比较这两个对象是不是同一个对象,如果equals方法返回的是true,那么就不会把第二个对象存放在哈希表中,
如果返回的是false,就会把这个值存放在哈希表中;
(2)HashSet集合存储API类时:已经重写了hashCode方法和equals方法,如String类、Integer类等;
HashSet集合存储自定义类时:需要重写hashCode方法和equals方法,来确保HashSet集合中的对象唯一;
public static void main(String[] args) { HashSet<String> set = new HashSet<String>(); Object obj = new Object(); System.out.println(obj.hashCode()); set.add("111"); set.add("222"); set.add("333"); set.add("333"); for (String s : set) { System.out.println(s);//哈希值 System.out.println(s.hashCode());//是String重写后的值 } }
自定义类元素
package day09;
public class Person {
private String name;
private Integer age;
// 构造方法
public Person(String name,Integer age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
public int hashCode() {
return name.hashCode()+age;
}//重写 hashCode方法
public boolean equals(Object obj) {
if(obj ==null) {
return false;
}
if(obj ==this) {
return true;
}
if(obj instanceof Person) {
Person p =(Person)obj;
return p.name.equals(this.name)&&p.age.equals(this.age);
}
return false;
}
}
重写前重写后
LinkedHashSet:
LinkedHashSet集合保证元素的存入和取出的顺序;
public static void main(String[] args) { // 不能存重复元素,但可以有序遍历 LinkedHashSet<String>set = new LinkedHashSet<String>(); set.add("c"); set.add("b"); set.add("z"); set.add("z"); for(String s:set) { System.out.println(s); } }
LinkedHashSet是HashSet的子类