第7章 集合类 - 补充案例

博学谷——让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

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4