【java学习—十】HashSet集合(4)
文章目录
- 1. Java集合概述
- 2. HashSet
- 3. 泛型
1. Java集合概述
Java 集合类存放于 java.util 包中,是一个用来存放对象的容器。
① 集合只能存放对象。比如你存一个 int 型数据 1 放入集合中,其实它是自动转换成 Integer类后存入的, Java 中每一种基本类型都有对应的引用类型。
② 集合存放的是多个对象的引用,对象本身还是放在堆内存中。
③ 集合可以存放不同类型,不限数量的数据类型。Java 集合可分为 Set 、 List 和 Map 三种大体系
- Set :无序、不可重复的集合
- List :有序,可重复的集合
- Map :具有映射关系的集合
在 JDK5 之后,增加了泛型, Java 集合可以记住容器中对象的数据类型
2. HashSet
HashSet 是 Set 接口的典型实现,大多数时候使用 Set 集合时都使用这个实现类。我们大多数时候说的 set 集合指的都是HashSet
HashSet 按 Hash 算法来存储集合中的元素,因此具有很好的存取和查找性能。
HashSet 具有以下特点:
(1)不能保证元素的排列顺序
(2)不可重复(指的是hashcode值不相同)
(3)HashSet 不是线程安全的
(4)集合元素可以使 null
当向 HashSet 集合中存入一个元素时, HashSet 会调用该对象的 hashCode() 方法来得到该对象的 hashCode 值,然后根据 hashCode 值决定该对象在HashSet 中的存储位置。
如果两个元素的 equals() 方法返回 true ,但它们的 hashCode() 返回值不相等, hashSet 将会把它们存储在不同的位置,但依然可以添加成功。
举例1:
package day10;
import java.util.HashSet;
import java.util.Set;
public class Test3 {
public static void main(String[] args) {
Set set = new HashSet();
set.add(1);//添加元素
set.add("a");
System.out.println(set);
set.remove(1);//移除元素
System.out.println(set);
System.out.println(set.contains("a"));//判断是否包含元素"a"
System.out.println(set.contains(1));//判断是否包含元素 1
set.clear();//清空集合
System.out.println(set);
}
}
运行结果:
举例2:
使用 Iterator 接口遍历集合元素
Iterator 接口主要用于遍历 Collection 集合中的元素, Iterator 对象也被称为迭代器
Iterator 接口隐藏了各种 Collection 实现类的底层细节,向应用程序提供了遍历 Collection 集合元素的统一编程接口
Iterator 仅用于遍历集合, Iterator 本身并不提供承装对象的能力。如果需要创建 Iterator 对象,则必须有一个被迭代的集合。使用 foreach 循环遍历集合元素
Java 5 提供了 foreach 循环迭代访问 Collection,如:
for(Person person: persons){
System.out.println(person.getName ());
}
package day10;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Test3 {
public static void main(String[] args) {
Set set = new HashSet();
set.add("a");
set.add("b");
set.add("c");
set.add("d");
System.out.println(set);
//使用迭代器遍历集合
Iterator it = set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
//for each迭代集合
for(Object obj : set) {//把set的每一个值取出来,赋值给obj,直到循环set的所有值
System.out.println(obj);
}
System.out.println(set.size());//获取集合元素的个数
}
}
运行结果:
证明:
(1)不能保证元素的排列顺序
(2)不可重复
(4)集合元素可以使 null
package day10;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Test3 {
public static void main(String[] args) {
Set set = new HashSet();
set.add("a");
set.add("b");
set.add("c");
set.add("d");
set.add("d");//再添加一个d//集合存的值是不重复的
set.add(null);//集合元素可以存null
System.out.println(set);
//使用迭代器遍历集合
Iterator it = set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
//for each迭代集合
for(Object obj : set) {//把set的每一个值取出来,赋值给obj,直到循环set的所有值
System.out.println(obj);
}
System.out.println(set.size());//获取集合元素的个数
}
}
运行结果:
从运行结果看,最后添加的null反而排在了第一个位置,说明(1)不能保证元素的排列顺序(根据hashcode值排序)
HashSet 集合判断两个元素相等的标准:两个对象通过 equals() 方法比较相等,并且两个对象的 hashCode() 方法返回值也相等。
如果两个对象通过 equals() 方法返回 true ,这两个对象的hashCode 值也应该相同。
3. 泛型
package day10;
import java.util.HashSet;
import java.util.Set;
public class Test3 {
public static void main(String[] args) {
//Set set = new HashSet();
Set<Object> set = new HashSet<Object>();//与上面的等价
set.add("a");
set.add(1);
//泛型
Set<String> set1 = new HashSet<String>();//指定String为集合的泛型,那么这个集合不能存String类型之外的
set1.add("abc");
// set1.add(1);//不可以添加String之外的类型
}
}