HashSet 详解
2015-09-11 20:49
381 查看
简介
HashSet使我们平时比较常用的一个集合类,实现的是Collection下面的Set接口,具有如下特点:1、线程不安全
2、无序(不会保证其中元素的顺序会与加入时一样)
3、存放元素不可重复(具体看本文最后一节)
4、HashSet是基于HashMap实现的
HashSet的实现
接下来我们来看一看HashSet的一些常用到的内容。1、全局变量
[code]private transient HashMap map; private static final Object PRESENT = new Object();
HashSet的内容就是存放于map中的
重点内容
[code]//无参构造方法,初始化map public HashSet(){ map = new HashMap(); }
[code]//带Collection参数的构造方法,初始化map,并指定长度,同时执行addall方法 public HashSet(Collection collection){ map = new HashMap(Math.max((int)((float)collection.size() / 0.75F) + 1, 16)); addAll(collection); }
[code]//就是获取map的size public int size(){ return map.size(); } //map是否为空 public boolean isEmpty(){ return map.isEmpty(); } //把元素当作key放入到map中 public boolean add(Object obj){ return map.put(obj, PRESENT) == null; } //map的key是否包含该元素 public boolean contains(Object obj){ return map.containsKey(obj); } public boolean remove(Object obj){ return map.remove(obj) == PRESENT; } public void clear(){ map.clear(); } //removeall的实现,调用的是父类AbstractSet的removeAll方法 public boolean removeAll(Collection collection){ boolean flag = false; if(size() > collection.size()){ for(Iterator iterator = collection.iterator(); iterator.hasNext();) flag |= remove(iterator.next()); } else{ Iterator iterator1 = iterator(); do{ if(!iterator1.hasNext()) break; if(collection.contains(iterator1.next())){ iterator1.remove(); flag = true; } } while(true); } return flag; }
由此我们可以看出,HashSet的内部原理就是把元素放入到里面的一个HashMap的key中,其它的基本就是调用的HashMap和父类的方法。
HashSet中是如何判断元素是否重复的
HashSet不能添加重复的元素,当调用add(Object)方法时候,首先会调用Object的hashCode方法判hashCode是否已经存在,如不存在则直接插入元素;
如果已存在则调用Object对象的equals方法判断是否返回true,如果为true则说明元素已经存在,如为false则插入元素。
关于java中hashcode和equal我们可以参照下面这篇博文 java hashcode和equal总结
Object类的HashCode方法其实返回的就是对象的地址
注意:为了保证HashSet中的对象不会出现重复值,在被存放元素的类中必须要重写hashCode()和equals()这两个方法。
相关文章推荐
- decision tree+percolation(笔记)+javaio
- UVa 225:Golygons(DFS)
- SDUT2937---人活着系列之寻找最完美的人生
- Linux中修改mysql的默认编码
- java.util.concurrent并发包诸类概览
- Testlink使用流程简述
- lufylegend学习笔记之一
- 【Win10】在应用中使用 SQLite 数据库
- π的计算
- python中单,双引号和三引号
- poj 动态规划
- STM32位带操作
- 过河问题
- COLOR
- iterator
- 第55讲:Scala中Infix Type实战详解
- 总览
- codeforce--Vasya and Petya's Game
- Android开发——构建自定义组件
- golang 反射结构字段类型