HashSet 详解
来源:互联网 发布:三煞五黄推算法 编辑:程序博客网 时间:2024/06/08 18:49
简介
HashSet使我们平时比较常用的一个集合类,实现的是Collection下面的Set接口,具有如下特点:
1、线程不安全
2、无序(不会保证其中元素的顺序会与加入时一样)
3、存放元素不可重复(具体看本文最后一节)
4、HashSet是基于HashMap实现的
HashSet的实现
接下来我们来看一看HashSet的一些常用到的内容。
1、全局变量
private transient HashMap map;private static final Object PRESENT = new Object();
HashSet的内容就是存放于map中的
重点内容
//无参构造方法,初始化mappublic HashSet(){ map = new HashMap();}
//带Collection参数的构造方法,初始化map,并指定长度,同时执行addall方法public HashSet(Collection collection){ map = new HashMap(Math.max((int)((float)collection.size() / 0.75F) + 1, 16)); addAll(collection);}
//就是获取map的sizepublic 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()这两个方法。
0 0
- HashSet详解
- HashSet 详解
- hashSet详解
- HashSet 详解
- HashSet 详解
- HashSet 详解
- hashSet详解
- HashSet 详解
- java中HashSet详解
- java中HashSet详解
- java中HashSet详解
- Java中hashSet详解
- java中HashSet详解
- HashMap和HashSet详解
- Java中HashSet详解
- java中HashSet详解
- Java中HashSet详解
- java基础--HashSet详解
- Testlink使用流程简述
- lufylegend学习笔记之一
- unity调用android原生接口
- linux中压缩与解压缩大全 - linux中各种文件格式的解压缩
- C/C++
- HashSet 详解
- decision tree+percolation(笔记)+javaio
- linux 查找出包含某个字符串的所有文件的方法详解
- UVa 225:Golygons(DFS)
- POJ 1157 LITTLE SHOP OF FLOWERS (数塔_dp)
- proc-pid-mem
- configure.in, congigure, Makefile 之间的关系
- 在 Linux 中使用日志来排错
- IIS 运行PHP 正常使用MYSQL 解决报错0x000000ff