参考http://how2j.cn/k/collection/collection-hashset/364.html#nowhere

元素不能重复

Set中的元素,不能重复
重复判断标准是:
首先看hashcode是否相同
如果hashcode不同,则认为是不同数据
如果hashcode相同,再比较equals,如果equals相同,则是相同数据,否则是不同数据

package collection;

import java.util.HashSet;

public class TestCollection {
public static void main(String[] args) { HashSet<String> names = new HashSet<String>(); names.add("gareen"); System.out.println(names); //第二次插入同样的数据,是插不进去的,容器中只会保留一个
names.add("gareen");
System.out.println(names);
}
}

没有顺序

Set中的元素,没有顺序。
严格的说,是没有按照元素的插入顺序排列
HashSet的具体顺序,既不是按照插入顺序,也不是按照hashcode的顺序。

遍历

Set不提供get()来获取指定位置的元素
所以遍历需要用到迭代器,或者增强型for循环

package collection;

import java.util.HashSet;
import java.util.Iterator; public class TestCollection {
public static void main(String[] args) {
HashSet<Integer> numbers = new HashSet<Integer>(); for (int i = ; i < ; i++) {
numbers.add(i);
} //Set不提供get方法来获取指定位置的元素
//numbers.get(0) //遍历Set可以采用迭代器iterator
for (Iterator<Integer> iterator = numbers.iterator(); iterator.hasNext();) {
Integer i = (Integer) iterator.next();
System.out.println(i);
} //或者采用增强型for循环
for (Integer i : numbers) {
System.out.println(i);
} }
}

HashSet和HashMap的关系

通过观察HashSet的源代码
可以发现HashSet自身并没有独立的实现,而是在里面封装了一个Map.
HashSet是作为Map的key而存在的
而value是一个命名为PRESENT的static的Object对象,因为是一个类属性,所以只会有一个。

package collection;

import java.util.AbstractSet;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set; public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
{
//HashSet里封装了一个HashMap
private HashMap<E,Object> map; private static final Object PRESENT = new Object(); //HashSet的构造方法初始化这个HashMap
public HashSet() {
map = new HashMap<E,Object>();
} //向HashSet中增加元素,其实就是把该元素作为key,增加到Map中
//value是PRESENT,静态,final的对象,所有的HashSet都使用这么同一个对象
public boolean add(E e) {
return map.put(e, PRESENT)==null;
} //HashSet的size就是map的size
public int size() {
return map.size();
} //清空Set就是清空Map
public void clear() {
map.clear();
} //迭代Set,就是把Map的键拿出来迭代
public Iterator<E> iterator() {
return map.keySet().iterator();
} }

最新文章

  1. SQL语句到底是怎么执行的
  2. Caffe源码解析3:Layer
  3. HTTPS----安全超文本传输协议
  4. 【转】同一台Windows机器中启动多个Memcached服务
  5. mac os intellij如何快路查看一个java类的所有方法,结构
  6. php示例代码之使用mysqli对象
  7. Mysql学习笔记(八)由触发器回顾外键约束中的级联选项
  8. SQL匹配顺序
  9. CentOS 7 php留言本网站的搭建
  10. 从零开始学习Linux(ls命令)
  11. 让eclipse启动时拥有jre
  12. 【转】linux mknod命令解析
  13. HDU 5432 Rikka with Tree (BestCoder Round #53 (div.2))
  14. 关于cocoapods添加静态库的奇葩配置
  15. libc++abi.dylib: terminate_handler unexpectedly threw an exception错误小结
  16. Python3.4入门之ifelse错误解决方案
  17. UVALive 2147 Push!!(队列实现DP)
  18. WebService之CXF注解之二(Service接口)
  19. 深入理解 RPC
  20. 20172302《程序设计与数据结构》实验四Android程序设计实验报告

热门文章

  1. Linux面试必问-对照目录内容的命令“Diff”具体解释
  2. LINQ to SQL 语句(1)之 Where
  3. Android 调用QQ登录
  4. Android SDK 更新不下来解决方法
  5. iOS中从零開始使用protobuf
  6. EasyDarwin相关Android安卓客户端EasyPusher/EasyPlayer/EasyCamera/EasyClient在无开发环境进行log抓取
  7. lateral inhibition
  8. ElasticSearch(十五) _search api 分页搜索及deep paging性能问题
  9. mongodb学习之:mongo安装以及远程访问
  10. 设置VIM查找时不区分大小写