一天一个类,一点也不累之HashSet
最近忙着一个小项目结题,故没能按时完成【一天一个类,一点也不累】,还好项目优秀,算是对自己一点点的安慰和鼓励。~~~
今天要说的是HashSet

既然是继承自Set,那么就必须有Set的一些属性,比如不能容许有相同(equals)元素的存在.阿门~~ 他也容许有null元素的存在。at most one null element。
【需要注意】 Note that this implementation is not synchronized. 这个也不是线程安全的。
同样感谢,官方给我们提供了线程安全的实现方法。
Set s = Collections.synchronizedSet(new HashSet(...));
【查看源码才知道--》】原来HashSet内部的实现是使用HashMap。 HashMap还没讲到,敬请期待。。。。
还是看看他的一些方法:
1、构造方法
HashSet()
public HashSet() {
map = new HashMap<>();
}
HashSet(int initialCapacity) //提供指定初始大小的Set集合
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + , ));
addAll(c);
}
发现如果使用其他容器来实现HashSet,实现之后的大小是原来的3/4+1 ,16二者的最大值
HashSet(Collection<? extends E> c)
HashSet(int initialCapacity, float loadFactor)//指定初始大小,和负载因子(大于0)
2、迭代器
因为HashSet使用HashMap来实现的,在返回迭代器的时候,是返回keySet.iterator().
既然这样,问题来了,HashSet只是使用了HashMap中的Key,那他的Value呢???
请看下面的add方法
3、add
public boolean add(E e) {
2 return map.put(e, PRESENT)==null;
3 }
添加一个元素,只是在将该元素放入Map的key,value部分使用了一个叫做PRESENT的礼物,who is PRESENT??
private static final Object PRESENT = new Object(); 定义了一个简单的Object.
4、remove如何实现??
既然在add中的value== PRESENT
那就好办了!~~~~
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
so smart~~~
【注】
在java语言中,通过负载因子(load factor)来决定何时对散列表进行再
散列.例如:如果负载因子是0.75,当散列表中已经有75%的位置已经放满,
那么将进行散列.
负载因子越高(越接近1.0),内存的使用率越高,元素的寻找时间越长.
负载因子越低(越接近0.0),元素的寻找时间越短,内存浪费越多.
一天一个类,一点也不累之HashSet的更多相关文章
- 一天一个类,一点也不累 之 Set接口
我们的口号是:一天一个类,一点也不累-- 再次回忆一下集合相关的类图. 官方API上这样介绍这个接口: A collection that contains no duplicate elements ...
- 一天一个类,一点也不累 之 LinkedList
我们的口号是,一天一个类,一点也不累 .. 今天要讲的是---LinkedList 首先,还是看看他的组织结构 Class LinkedList<E> java.lang.Object j ...
- 一天一个类,一点也不累 之 Vector
一天一个类,一点也不累. 今天要说的是ArrayList的亲兄弟--Vector 亲兄弟?看看“族谱” Class Vector<E> java.lang.Object java.util ...
- 一天一个类,一点也不累之TreeSet
一天一个类,一点也不累. 现在要说的是---TreeSet public class TreeSet<E> extends AbstractSet<E> implements ...
- java进阶之反射:反射基础之如何获取一个类以及如何获取这个类的所有属性和方法(2)
当我们知道一个类的对象,或者知道一个类的路径,或者指导这个类的名称的时候我们可以获取到这个类的类对象 当我们仅仅知道一个类的类对象的时候我们依然无法操作这个类,因为我们不知道这个类的属性,类的方法.那 ...
- java在类定义时对hashset的便捷初始化方法
有时候我们在类成员定义时,当这个类成员类型为 HashSet时,我们可以不方便调用 add函数进行初始化,所以可以采用下面的便捷方式来进行初始化 public class MyTest{ final ...
- Java中是否可以调用一个类中的main方法?
前几天面试的时候,被问到在Java中是否可以调用一个类中的main方法?回来测试了下,答案是可以!代码如下: main1中调用main2的主方法 package org.fiu.test; impor ...
- [转]自己写PHP扩展之创建一个类
原文:http://www.imsiren.com/archives/572 比如我们要创建一个类..PHP代码如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
- 重写toString()方法来描述一个类
package com.zch.test; /* toString方法以及重写toString方法 toString方法是一个自我描述方法 方法本身返回的是该对象的实现类的 类名 + @ + hash ...
随机推荐
- MD5算法【计算文件和字符串的MD5值】
1. MD5算法是一种散列(hash)算法(摘要算法,指纹算法),不是一种加密算法(易错).任何长度的任意内容都可以用MD5计算出散列值.MD5的前身:MD2.MD3.MD4.介绍工具:CalcMD5 ...
- URAL 1009 K-based Numbers
题目:Click here #include <bits/stdc++.h> using namespace std; typedef long long ll; const int IN ...
- JDBC_获取数据库连接
<span style="font-size:24px;">package src.com.jdbc.java; import java.io.IOException; ...
- WPF DataGrid模拟click实现效果
WPF的DataGrid原生是不支持Click事件的,然而在开发过程中,经常遇到需要实现类似效果的. 举个栗子:表格第一列是一个CheckBox,需要实现功能点击行选中,再点击取消选中. 第一想法是R ...
- python多线程实现售票
转载或借鉴请注明转自http://www.cnblogs.com/FG123/p/5068386.html 谢谢! 我们使用mutex(Python中的Lock类对象)来实现线程的同步: lock. ...
- selenium 怎么处理display:none
页面HTML是这样的: .... <div class="cf w index-middle"> <div id="li" class=&q ...
- (IOS)数据持久化
1.属性列表序列化 2.模型对象归档 3.嵌入式SQLite3 4.Core Data 5.应用程序设置 6.UIDocument管理文档存储 7.iCloud Demo界面: 1.属性列表序列化 即 ...
- 解决ASP.NET回传后div滚动条位置复位的问题
中心思想:用一个隐藏控件保存当前scorll值.回传回来后根据scrollTop的值,然后在Page_Load中重新设置scrollTop. 首先是为DIV添加一个 onscroll="ja ...
- 利用Mono.Cecil动态修改程序集来破解商业组件(仅用于研究学习)
原文 利用Mono.Cecil动态修改程序集来破解商业组件(仅用于研究学习) Mono.Cecil是一个强大的MSIL的注入工具,利用它可以实现动态创建程序集,也可以实现拦截器横向切入动态方法,甚至还 ...
- Yii Framework2.0开发教程(2)使用表单Form
第一步.接着教程(1).我们在controllers/ZhyoulunController.php中加入两处, 1) use app\models\EntryForm; 和 2) public fun ...