java set原理_java hashSet原理与应用

set:

如果是实现了Set接口的集合类,具备的特点: 无序,不可重复

public class Demo1 {

public static void main(String[] args) {

Set set = new HashSet();

set.add("王五");

set.add("张三");

set.add("李四");

System.out.println("添加成功吗?"+set.add("李四"));

System.out.println(set);

}

}

hashSet的实现原理:

往Haset添加元素的时候,HashSet会先调用元素的hashCode方法得到元素的哈希值 ,

然后通过元素 的哈希值经过移位等运算,就可以算出该元素在哈希表中 的存储位置。

情况1: 如果算出元素存储的位置目前没有任何元素存储,那么该元素可以直接存储到该位置上。

情况2: 如果算出该元素的存储位置目前已经存在有其他的元素了,那么会调用该元素的equals方法与该位置的元素再比较一次

,如果equals返回的是true,那么该元素与这个位置上的元素就视为重复元素,不允许添加,如果equals方法返回的是false,那么该元素运行 添加。

class Person{

int id;

String name;

public Person(int id, String name) {

super();

this.id = id;

this.name = name;

}

@Override

public String toString() {

return "{ 编号:"+ this.id+" 姓名:"+ this.name+"}";

}

@Override

public int hashCode() {

System.out.println("=======hashCode=====");

return this.id;

}

@Override

public boolean equals(Object obj) {

System.out.println("======equals======");

Person p = (Person)obj;

return this.id==p.id;

}

}

public class Demo2 {

public static void main(String[] args) {

/*

HashSet set = new HashSet();

set.add("狗娃");

set.add("狗剩");

set.add("铁蛋");

System.out.println("集合的元素:"+ set);

*/

HashSet set = new HashSet();

set.add(new Person(110,"狗娃"));

set.add(new Person(220,"狗剩"));

set.add(new Person(330,"铁蛋"));

//在现实生活中只要编号一致就为同一个人.

System.out.println("添加成功吗?"+set.add(new Person(110,"狗娃")));

System.out.println("集合的元素:"+set);

}

}

3594270a8bc6

HashSet的存储原理.png

应用:

使用HashSet添加用户,如果用户名就认为是重复元素

import java.util.*;

class Account{

String name;

String passwd;

Account(String name,String passwd){

this.name = name;

this.passwd = passwd;

}

@Override

public int hashCode() {

// TODO Auto-generated method stub

return this.name.hashCode();

}

@Override

public boolean equals(Object arg0) {

Account act = (Account)arg0;

if (this.name.equals(act.name))

return true;

return false;

}

}

public class Test02 {

public static void main(String[] args) {

HashSet set = new HashSet();

while(true){

System.out.println("请输入用户名和密码:");

String name = new Scanner(System.in).nextLine();

String passwd = new Scanner(System.in).nextLine();

boolean result = set.add(new Account(name,passwd));

if (result){

System.out.println("注册成功");

}else{

System.out.println("该用户已存在");

}

}

}

}

这里补充一个问题

"aa".hashCode();

new String("aa").hashCode();

两者之间的hashCode是一样的,为什么呢?

因为String类重写了hashCode方法,用每个字符去计算最后得出来的haskCode值;所以只要是字符串内容一样,那么调用haskCode方法得到的hask值肯定是一样的

public int hashCode() {

int h = hash;

if (h == 0 && value.length > 0) {

char val[] = value;

for (int i = 0; i < value.length; i++) {

h = 31 * h + val[i];

}

hash = h;

}

return h;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值