博学谷——让IT教学更简单,让IT学习更有效
图7-10 运行结果
三、案例总结
1、JDK中提供了一个Vevtor集合,该集合是List接口的一个实现类,用法与ArrayList完全相同,区别在于Vector集合是线程安全的,而ArrayList集合是线程不安全的。在Vector类中提供了一个elements()方法用于返回Enumeration对象,通过Enumeration对象就可以遍历该集合中的元素。
2、在本案例中,使用Enumeration迭代器时,使用一个while循环对集合中的元素进行迭代,其过程与Iterator迭代的过程类似,通过hasMoreElements()方法循环判断是否存在下一个元素,如果存在,则通过nextElement()方法逐一取出每个元素。
案例7-9 HashSet集合的存储
一、案例描述
1、 考核知识点
编号:00107010 名称:HashSet集合
2、 练习目标
? 了解HashSet集合的存储特点 ? 掌握HashSet集合的用法
3、 需求分析
HashSet是Set接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的。为了让初学者熟悉HashSet集合的用法,本案例将针对HashSet集合中元素不可重复的特点,对HashSet集合的存储和遍历过程进行演示。
4、 设计思路(实现原理)
1) 编写一个类Example09,在该类中定义一个HashSet集合hs 2) 向集合hs中添加6个元素,其中有一些重复的元素 3) 用size()方法获取添加完元素后集合中元素的个数 4) 用Iterator迭代器遍历集合的每一个元素 5) 观察在输出结果中,是否存在重复的元素
二、案例实现
import java.util.*; public class Example09 {
public static void main(String[] args) {
13
博学谷——让IT教学更简单,让IT学习更有效
}
}
// 创建HashSet集合
HashSet hs = new HashSet();
//向HashSet集合中添加元素,其中包括重复元素 hs.add(\ hs.add(\hs.add(\hs.add(\hs.add(\hs.add(\// 输出集合中元素的个数
System.out.println(\添加后集合中元素个数:\// 输出集合中每一个元素
Iterator it = hs.iterator();
System.out.println(\添加后集合中包含以下元素:\while (it.hasNext()) { }
System.out.println(it.next());
运行结果如图7-11所示。
图7-11 运行结果
三、案例总结
1、HashSet是Set接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的。当向
HashSet集合中添加一个对象时,首先会调用该对象的hashCode()方法来确定元素的存储位置,然后再调用对象的equals()方法来确保该位置没有重复元素。
2、在本案例中,首先通过add()方法向HashSet集合依次添加了六个字符串,然后通过Iterator迭代器遍历所有的元素并输出打印。从打印结果可以看出取出元素的顺序与添加元素的顺序并不一致,并且重复存入的字符串对象\和\被去除了,只添加了一次。
案例7-10 将Object类存入HashSet
一、案例描述
1、 考核知识点
14
博学谷——让IT教学更简单,让IT学习更有效
编号:00107010 名称:HashSet集合
2、 练习目标
? 掌握如何将对象存入HashSet集合并且去除重复对象
3、 需求分析
HashSet集合之所以能确保不出现重复的元素,是因为它在添加对象时,会先调用该对象的hashCode()方法来确定元素的存储位置,再调用对象的equals()方法来确保该位置没有重复元素。为了将Object类存入HashSet集合,本案例将针对如何重写Object类中的hashCode()和equals()方法去除重复的Object对象进行演示。
4、 设计思路(实现原理)
1) 设计一个Person类,在该类中定义两个变量name和age 2) 在Person类中重写hashCode()和equals()方法
3) 编写类Example10,在该类中定义一个HashSet集合
4) 将Person对象存入HashSet集合中,其中含有重复的Person对象 5) 遍历HashSet集合中的元素,观察结果是否含有重复的对象
二、案例实现
设计Person类,其代码如下:
class Person {
private String name; private int age;
public Person(String name, int age) { }
// 重写hashCode方法,返回name属性的哈希值 public int hashCode() { }
// 重写equals方法
public boolean equals(Object obj) { }
// 重写toString()方法 public String toString() { }
15
return \if (this == obj) }
return false;
return true;
Person p = (Person) obj;
return this.name.equals(p.name) && this.age == p.age; if (obj instanceof Person) { return name.hashCode() + age * 2; this.name = name; this.age = age;
博学谷——让IT教学更简单,让IT学习更有效
}
编写类Example10,其代码如下:
import java.util.*; public class Example10 {
public static void main(String[] args) { } }
// 创建HashSet对象
HashSet hs = new HashSet(); // 将Person对象存入集合
hs.add(new Person(\hs.add(new Person(\hs.add(new Person(\hs.add(new Person(\hs.add(new Person(\hs.add(new Person(\// 遍历集合中的元素
Iterator it = hs.iterator(); while (it.hasNext()) { }
Person p = (Person) it.next(); System.out.println(p);
运行结果如图7-12所示。
图7-12 运行结果
三、案例总结
在本案例中,当HashSet集合的存入元素时,首先调用当前存入对象的hashCode()方法获得name属性的哈希值,然后根据对象的哈希值计算出一个存储位置。如果该位置上没有元素,则直接将元素存入,如果该位置上有元素存在,则会调用equals()方法让当前存入的元素依次和该位置上的元素进行比较,如果返回的结果为false就将该元素存入集合,返回的结果为true则说明有重复元素,就将该元素舍弃。整个存储的流程如图7-13所示。
16