Java集合类笔记3:Set接口

1.HashSet是Set接口的典型实现,大多数使用Set集合就是使用这个实现类。[size=medium][b][color=red]HashSet按Hash算法来存储集合中的元素,因此具有很好的存取和查找性能。[/color][/b][/size]
2.HashSet的特点:
1)不能保证元素的排列顺序
2)HashSet不是同步的,如果多个线程同时访问一个Set集合,如果多个线程同时访问一个HashSet,如果有2条或两条以上线程同时修改了HashSet集合时,必须通过代码来保证其同步。
3)集合元素可以为null。
3.[color=green][b]当向HashSet集合存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据该Hashcode值来决定该对象在HashSet中存储位置。如果两个元素通过equals方法比较返回true,但它们的hashCode()方法返回值不相同,HashSet将会把它们存储在不同位置,也就可以添加成功。[/b][/color]
4.TestHashset.java
import java.util.*;
//类A重写了其equals方法,但没有重写其hashCode方法
class A
{
public boolean equals(Object obj) {
return true;
}
}
//类BhashCode的返回值都为1,但没有重写其equals方法
class B
{
public int hashCode() {
return 1;
}
}
//类ChashCode的返回值都为2,同时equals返回值都为true。
class C
{
public int hashCode() {
return 2;
}
public boolean equals(Object obj) {
return true;
}
}


public class TestHashset
{
public static void main(String[] args) {
HashSet books = new HashSet();
books.add(new A());
books.add(new A());
System.out.println(books);
System.out.println("----华丽的分割线----");
books.clear();
books.add(new B());
books.add(new B());
System.out.println(books);
System.out.println("----华丽的分割线----");
books.clear();
books.add(new C());
books.add(new C());
System.out.println(books);
System.out.println("----华丽的分割线----");
}
}

[color=red][b]注意:注意:如果需要某个类的对象保存到HashSet集合中,重写这个类的equals方法和hashCode方法时,应该尽量保证两个对象通过equals比较返回true时,它们的hashCode方法返回值也相等。[/b][/color]

5.HashSet还有一个子类LinkedHashSet,LinkedHashSet它也是根据元素hashCode值来决定元素的存储位置,但它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的,也就是说,当遍历LinkedHashSet集合元素时,HashSet将会按元素的添加顺序来访问集合里的元素。[color=red][b]LinkedHashSet需要维护元素的插入顺序,所以性能略低与HashSet,但在迭代访问Set里的全部元素时将有很好的性能,因为它以链表来维护内部顺序[/b][/color]

6.TreeSet是SortedSet接口的唯一实现,正如SortedSet名字所暗示的,TreeSet可以确保元素处于排序状态。TreeSet并不是根据元素的插入顺序进行排序,二十根据元素的实际值进行排序的。
TestTreeSet.java
import java.util.*;

public class TestTreeSet
{
public static void main(String[] args) {
TreeSet nums = new TreeSet();
nums.add(5);
nums.add(-1);
nums.add(23);
nums.add(231);
nums.add(-24);
System.out.println(nums);
System.out.println(nums.first());
System.out.println(nums.last());
System.out.println(nums.headSet(8));
System.out.println(nums.tailSet(20));
System.out.println(nums.subSet(-2,8));
}
}

与HashSet集合采用hash算法来决定元素的存储位置不同,TreeSet采用红黑树的数据结构对元素进行排序。TreeSet支持两种排序:自然排序和定制排序。


7.EnumSet是一个专为枚举类设计的集合类,EnumSet中所有值都必须是指定枚举类型的枚举值,该枚举类型在创建EnumSet时显式或隐式地指定。EnumSet的集合元素也是有序的,EnumSet以枚举值在Enum类内定义顺序来决定集合元素的顺序
[color=red][b] EnumSet在内部以位向量的形式存储,这种存储形式非常紧凑、高效,因此EnumSet对象占用内存很小,而且运行效率很好,尤其进行批量操作(如调用containsAll和retainAll方法时)
EnumSet不允许加入null元素[/b][/color]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值