java集合框架之HashSet
2024-08-29 16:44:18
参考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();
} }
最新文章
- SQL语句到底是怎么执行的
- Caffe源码解析3:Layer
- HTTPS----安全超文本传输协议
- 【转】同一台Windows机器中启动多个Memcached服务
- mac os intellij如何快路查看一个java类的所有方法,结构
- php示例代码之使用mysqli对象
- Mysql学习笔记(八)由触发器回顾外键约束中的级联选项
- SQL匹配顺序
- CentOS 7 php留言本网站的搭建
- 从零开始学习Linux(ls命令)
- 让eclipse启动时拥有jre
- 【转】linux mknod命令解析
- HDU 5432 Rikka with Tree (BestCoder Round #53 (div.2))
- 关于cocoapods添加静态库的奇葩配置
- libc++abi.dylib: terminate_handler unexpectedly threw an exception错误小结
- Python3.4入门之ifelse错误解决方案
- UVALive 2147	Push!!(队列实现DP)
- WebService之CXF注解之二(Service接口)
- 深入理解 RPC
- 20172302《程序设计与数据结构》实验四Android程序设计实验报告
热门文章
- Linux面试必问-对照目录内容的命令“Diff”具体解释
- LINQ to SQL 语句(1)之 Where
- Android 调用QQ登录
- Android SDK 更新不下来解决方法
- iOS中从零開始使用protobuf
- EasyDarwin相关Android安卓客户端EasyPusher/EasyPlayer/EasyCamera/EasyClient在无开发环境进行log抓取
- lateral inhibition
- ElasticSearch(十五) _search api 分页搜索及deep paging性能问题
- mongodb学习之:mongo安装以及远程访问
- 设置VIM查找时不区分大小写