java产生并打印出不相同的随机数hashset_Java编程基础18——集合(Set集合)

1_HashSet存储字符串并遍历

A:Set集合概述及特点

通过API查看即可

B:案例演示

HashSet存储字符串并遍历

import java.util.HashSet;

public class Demo1_HashSet {

public static void main(String[] args) {

//Set集合,无索引,不可以重复,无序(存取不一致)

HashSet hs = new HashSet<>(); //创建HashSet对象

boolean b1 = hs.add("a");

boolean b2 = hs.add("a"); //当向Set集合中储存重复元素的时候返回为false

hs.add("b");

hs.add("c");

hs.add("d");

System.out.println(hs); //HashSet的继承体现中有重写toString方法

System.out.println(b1);

System.out.println(b2);

for (String string : hs) { //只要能用迭代器迭代的,就可以使用增强for循环遍历

System.out.println(string);

}

}

}

2_HashSet存储自定义对象保证元素唯一性

A:案例演示

存储自定义对象,并保证元素唯一性。

重写hashCode()和equals()方法

B:画图演示

画图说明比较过程

C:代码优化

为了减少比较,优化hashCode()代码写法。

最终版就是自动生成即可。

代码写的复杂,目的就是为了少调用equals方法,提高我们程序运行的效率

D:原理

1.HashSet原理

我们使用Set集合都是需要去掉重复元素的, 如果在存储的时候逐个equals()比较, 效率较低;哈希算法提高了去重复的效率, 降低了使用equals()方法的次数

当HashSet调用add()方法存储对象的时候, 先调用对象的hashCode()方法得到一个哈希值(如同上火车先有票), 然后在集合中查找是否有哈希值相同的对象

如果没有哈希值相同的对象就直接存入集合

如果有哈希值相同的对象, 就和哈希值相同的对象逐个进行equals()比较,比较结果为false就存入, true则不存

2.将自定义类的对象存入HashSet去重复

类中必须重写hashCode()和equals()方法

hashCode(): 属性相同的对象返回值必须相同, 属性不同的返回值尽量不同(提高效率)

equals(): 属性相同返回true, 属性不同返回false,返回false的时候存储

import java.util.HashSet;

import net.allidea.bean.Person;

public class Demo1_HashSet {

public static void main(String[] args) {

HashSet hs = new HashSet<>();

hs.add(new Person("张三",23));

hs.add(new Person("张三",23));

hs.add(new Person("李四",24));

hs.add(new Person("李四",24));

hs.add(new Person("李四",24));

// System.out.println(hs.size());

System.out.println(hs);

}

}

//Person文件

public class Person {

private String name;

private int age;

public Person() {

super();

}

public Person(String name, int age) {

super();

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

public String toString() {

return "Person [name=" + name + ", age=" + age + "]";

}

//为什么是31? 1.是质数。2.既不大也不小。3.是2的五次方-1,2向左移动五位

@Override

public int hashCode() {

final int prime = 31;

int result = 1;

result = prime * result + age;

result = prime * result + ((name == null) ? 0 : name.hashCode());

return result;

}

@Override

public boolean equals(Object obj) {

if (this == obj) //调用的对象和传入的对象是同一个对象

return true;

if (obj == null) //传入的对象为NULL

return false;

if (getClass() != obj.getClass()) //判断两个对象对应的字节码文件是否是同一个字节码

return false;

Person other = (Person) obj; //向下转型

if (age != other.age) //调用对象的年龄不等于传入对象的年龄

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值