一天一个类,一点也不累之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 ...
随机推荐
- STL之string
string构造函数,很多重载函数: #include <iostream> #include <string> using namespace std; int main() ...
- 使用LINQ的几个小技巧
这里总结了这些技巧.介绍如何使用LINQ来: 初始化数组 在一个循环中遍历多个数组 生成随机序列 生成字符串 转换序列或集合 把值转换为长度为1的序列 遍历序列的所有子集 如果你在LINQ方面有心得也 ...
- Extjs 3.0 htmleditor实现插入图片功能
首先感谢前辈们的无私奉献.贴出参考地址 http://zhidao.baidu.com/link?url=Q0ZM405OFNy_xAHSut9TepRJxgXCxFayQttrQz1N82dlA1_ ...
- jQuery + svg/vml
流程设计器jQuery + svg/vml(Demo7 - 设计器与引擎及表单一起应用例子) 去年就完成了流程设计器及流程引擎的开发,本想着把流程设计器好好整理一下,形成一个一步一步的开发案例,结 ...
- QMessageBox 用法
案例一:QMessageBox msgBox;msgBox.setText("The document has been modified.");msgBox.setInforma ...
- An update on OS X Code Signing(OS X代码签名)
There has recently been updates to the OS X code signing process. These updates also affect Qt appli ...
- Maven 版 JPA 最佳实践
项目结构图 数据库环境 数据库:MySQL 版本:5.x 数据库名:jpa-demo 用户名密码:root/1234 代码清单 1:数据库脚本: /* Navicat MySQL Data Trans ...
- JavaEE Tutorials (6) - 使用嵌入式企业bean容器
6.1嵌入式企业bean容器概述826.2开发嵌入式企业bean应用82 6.2.1运行嵌入式应用83 6.2.2创建企业bean容器83 6.2.3查找会话bean引用84 6.2.4关闭企业bea ...
- Js中的多条件排序,多列排序
參见github: https://github.com/Teun/thenBy.js
- 最小值滤波 (C 语言实现)
最小值滤波 (C 语言实现) 遇到最小值滤波的问题,小白不知道.一个程序写了三天,最终今天傍晚出来了. .. 非常easy的for循环.可是没有理解最小值滤波.怎么写都是错啊~ 这是我见过做好的描写叙 ...