Set:
无序:添加元素的顺序与元素出来的顺序是不一致的。
public class Demo1 {
public static void main(String[] args){
Set set = new HashSet();
set.add("小五");
set.add("小四");
set.add("小三");
System.out.println("集合的元素:"+set);
System.out.println("添加成功吗?"+set.add("小四")); //返回Boolean类型的值,添加的是重复的,所以不成功
}
}
HashSet:
HashSet实现原理:往HashSet添加元素的时候,HashSet会先调用元素
的hashCode方法得到元素的哈希值,然后通过元素的哈希值经过移位等运算,就可以算出该元素在哈希表中的存储位置。
情况1:如果算出元素存储的位置目前没有任何元素存储,那么该元素可以直接存储到该位置上。
情况2:如果算出元素存储的位置目前已经存在其他元素了,那么会调用该元素的equals方法与该位置的元素再比较一次,如果equals返回的是true,那么该元素与这个位置上的元素就视为重复元素,不允许添加,如果equals方法返回的是false,那么该元素允许添加。
public class Demo1 {
public static void main(String[] args){
HashSet set = new HashSet();
set.add("小娃");
set.add("小胜");
set.add("小铁");
System.out.println("集合的元素:"+set);
System.out.println("添加成功吗?"+set.add("小娃"));
HashSet set1 = new HashSet();
set1.add(new Person(110, "小娃"));
set1.add(new Person(220, "小胜"));
set1.add(new Person(330, "小铁"));
//在现实生活中只要编号一致就为同一个人
System.out.println("添加成功吗?"+set1.add(new Person(110,"大富"))); //调用了equals方法
System.out.println("集合的元素:"+set1);
}
}
class Person{
public int id;
public String name;
public Person(int id, String name){
this.id = id;
this.name = name;
}
public String toString(){
return "{id:"+this.id+" name:"+this.name+"}";
}
public int hashCode(){
//看一下调用了几次hashCode方法,在每次添加元素的时候调用。而且再equals方法前。
System.out.println("=======hashcode========");
return this.id;
}
public boolean equals(Object obj){
//看一下调用了几次equals方法,当存储位置有元素的时候调用。
System.out.println("=======equals=========");
Person p = (Person)obj;
return p.id == this.id;
}
}
hashset比较字符串
package HashSet;
public class Demo2 {
public static void main(String[] args){
String str1 = "hello";
String str2 = new String("hello");
System.out.println("两个是同一个对象吗?"+(str1 == str2)); //==比较的是内存地址
System.out.println("str1的hashCode:"+str1.hashCode());
System.out.println("str2的hashCode:"+str2.hashCode());
//为什么str1和str2的hashCode一样?
//hashCode默认情况下比较的是内存地址,String类已经重写了Object的hashCode方法了。
//如果两个字符串的内容一致,那么返回的hashCode码肯定也是一致的。
}
}