1.1 Set集合的特点
- Set:元素唯一,存储元素无序
- 一个不包含重复元素的 collection
- HashSet:
- 它不保证 set 的迭代顺序;
- 特别是它不保证该顺序恒久不变 。
1.1.1 案例代码
package com.itheima_01;
import java.util.HashSet;
import java.util.Set;
/*
* Set:
* 一个不包含重复元素的 collection
*
* HashSet:
* 它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变
*/
public class SetDemo {
public static void main(String[] args) {
//创建集合对象
Set<String> set = new HashSet<String>();
//添加元素
set.add("hello");
set.add("world");
set.add("java");
//唯一
set.add("world");
//遍历集合
for(String s : set) {
System.out.println(s);
}
}
}
1.2 HashSet集合类
- HashSet:
- 它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变
1.2.1 HashSet保证元素唯一性的原理
HashSet保证元素唯一性的原理?
通过查看add方法的源码,我们知道了添加功能的执行过程中,是进行了数据的判断的。
这个判断的流程是:
- 首先比较对象的哈希值是否相同,这个哈希值是根据对象的hashCode()计算出来的。
- 如果哈希值不同,就直接添加到集合中
- 如果哈希值相同,继续执行equals()进行比较,
- 返回的是true,说明元素重复,不添加。
- 返回的是false,说明元素不重复,就添加。
注意:
如果我们使用HashSet集合存储对象,你要想保证元素的唯一性,就必须重写hashCode()和equals()方法。
1.2.1.1 案例代码
package com.itheima_02;
import java.util.HashSet;
/*
* HashSet保证元素唯一性的原理?
*
* 通过查看add方法的源码,我们知道了添加功能的执行过程中,是进行了数据的判断的。
* 这个判断的流程是:
* 首先比较对象的哈希值是否相同,这个哈希值是根据对象的hashCode()计算出来的。
* 如果哈希值不同,就直接添加到集合中
* 如果哈希值相同,继续执行equals()进行比较,
* 返回的是true,说明元素重复,不添加。
* 返回的是false,说明元素不重复,就添加。
*
* 如果我们使用HashSet集合存储对象,你要想保证元素的唯一性,就必须重写hashCode()和equals()方法。
*/
public class HashSetDemo {
public static void main(String[] args) {
//创建集合对象
HashSet<String> hs = new HashSet<String>();
//添加元素
hs.add("hello");
hs.add("world");
hs.add("java");
hs.add("world");
//遍历集合
for(String s : hs) {
System.out.println(s);
}
}
}
1.2.2 HashSet集合的练习存储自定义对象并遍历
HashSet集合存储自定义对象并遍历
提示:
自定义一个学生类,给出成员变量name和age。遍历集合的时候,在控制台输出学生对象的成员变量值。
- 两种方式遍历
- 迭代器
- 增强for
1.2.2.1 案例代码
package com.itheima_03;
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
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;
}
}
package com.itheima_03;
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
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;
}
}
package com.itheima_03;
import java.util.HashSet;
import java.util.Iterator;
/*
* HashSet集合存储自定义对象并遍历
* 提示:自定义一个学生类,给出成员变量name和age。遍历集合的时候,在控制台输出学生对象的成员变量值。
* 两种方式遍历
* 迭代器
* 增强for
*/
public class HashSetTest {
public static void main(String[] args) {
//创建集合对象
HashSet<Student> hs = new HashSet<Student>();
//创建元素对象
Student s1 = new Student("林青霞",30);
Student s2 = new Student("张曼玉",35);
Student s3 = new Student("王祖贤",33);
//把元素添加到集合
hs.add(s1);
hs.add(s2);
hs.add(s3);
//遍历
//迭代器
Iterator<Student> it = hs.iterator();
while(it.hasNext()){
Student s = it.next();
System.out.println(s.getName()+"---"+s.getAge());
}
System.out.println("------------------");
//增强for
for(Student s : hs) {
System.out.println(s.getName()+"---"+s.getAge());
}
}
}
1.2.3 HashSet 集合的练习存储自定义对象保证元素唯一性
HashSet集合存储自定义对象并遍历
要求:如果对象的成员变量值相同,就认为是同一个元素。
提示:
自定义一个学生类,给出成员变量name和age。遍历集合的时候,在控制台输出学生对象的成员变量值。
- 两种方式遍历
- 迭代器
- 增强for
注意
因为我们存储的元素所属的类没有重写hashCode()和equals()方法,所以保证不了元素的唯一性。
而我想保证,怎么办呢?重写这两个方法就可以了。
如何重写呢?自动生成就可以了。
1.2.3.1 案例代码
package com.itheima_04;
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
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 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)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
package com.itheima_04;
import java.util.HashSet;
/*
* HashSet集合存储自定义对象并遍历
* 要求:如果对象的成员变量值相同,就认为是同一个元素。
* 提示:自定义一个学生类,给出成员变量name和age。遍历集合的时候,在控制台输出学生对象的成员变量值。
* 两种方式遍历
* 迭代器
* 增强for
*
* 因为我们存储的元素所属的类没有重写hashCode()和equals()方法,所以保证不了元素的唯一性。
* 而我想保证,怎么办呢?重写这两个方法就可以了。
* 如何重写呢?自动生成就可以了。
*/
public class HashSetTest {
public static void main(String[] args) {
//创建集合对象
HashSet<Student> hs = new HashSet<Student>();
//创建元素对象
Student s1 = new Student("林青霞",30);
Student s2 = new Student("张曼玉",35);
Student s3 = new Student("王祖贤",33);
Student s4 = new Student("林青霞",30);
Student s5 = new Student("张曼玉",35);
//把元素添加到集合
hs.add(s1);
hs.add(s2);
hs.add(s3);
hs.add(s4);
hs.add(s5);
//遍历集合
//增强for
for(Student s : hs) {
System.out.println(s.getName()+"---"+s.getAge());
}
}
}
网友评论