java set diff_Java中Set接口及其实现

public HashSet() {

map = new HashMap();

}

public boolean add(E o) {

return map.put(o, PRESENT)==null;

}

public boolean remove(Object o) {

return map.remove(o)==PRESENT;

}

public boolean contains(Object o) {

return map.containsKey(o);

}

从代码可见,HashSet在底层借用HashMap,使用一个Object类型的哑元值作为HashSet中元素在底层HashMap存储中的映射值.它抓住了HashMap的键不允许重复的特性.对于add()中调用底层映射的put(),将欲添加的元素和一个PRESENT哑元值放入底层map.如果底层Map返回null,说明原来的集合中并不存在该键.对于Map接口的put()返回null时有两种解释,一是原来的Map中不包含该键;另一种可能是原来的Map中已经存储了该健,但该键映射到null.而在HashSet中的add()和remove()等中的返回null只有一种解释,即原来的集合不包含该元素.这是因为HashSet的底层的映射中存储的都是一个名为PRESENT的Object类型的对象,不可能是null.

2.2 TreeSet

Set接口有一个子接口:SortedSet,提供了集合元素的顺序存储,其中元素保持升序排列.为了在加入一个元素到SortedSet实现时能对这些元素排序,元素类型必须实现Comarable接口,或者建立SortedSet时使用Comparator.否则程序在运行时将抛出ClassCastException.

3.使用Set的注意事项  如果Set中存储了可变对象,当这些对象出现重复元素,从而从根本上违反了Set的约定,Set的行为也变得不确定.所以,在Set中存储可变对象时,一定要十分小心.同样,对于Map中的key也一样,因为Map中的key也是不允许重复的.

//DupEleSet.java

class DupEleSet{   public static void main(String [] args)

{

Calendar cld=new Calendar.getInstance();

cld.set(2003,0,1);

Date d1 = cld.getTime();

cld.set(2005,10,2);

Date d2 = cld.getTime();

Set s = new HashSet();

s.add(d1);

s.add(d2);

System.out.println("before modify:"+s);

d1.setTime(d2.getTime());

System.out.println("after modified:"+s);

}    }上面的程序输出:

before modify:[Wed Jan 01 21:54:19 cst 2003,Thu Nov 02 21:54:19 cst 2000]

after modifyied:[Wed Jan 01 21:54:19 cst 2000,Thu Nov 02 21:54:19 cst 2000]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值