刷题upupup【Java中HashMap、HashSet用法总结】
HashMap:
常用操作
1. containsKey() 判断HashMap是否包含key
2. containsValue() 判断HashMap是否包含“值为value”的元素
3. get() 获取key对应的value
4. put() 让HashMap对象可以通过put()将“key-value”添加到HashMap中
5. remove() 删除“键为key”元素
遍历方式
1. 在for-each循环中使用entries来遍历
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
2. 在for-each循环中遍历keys或values
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
//遍历map中的键
for (Integer key : map.keySet()) {
System.out.println("Key = " + key);
}
//遍历map中的值
for (Integer value : map.values()) {
System.out.println("Value = " + value);
}
3. 使用Iterator遍历
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry<Integer, Integer> entry = entries.next();
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
HashSet
常用操作
add(Object o);往set添加元素
clear();移除所有元素
size();返回元素的个数
remove(Object o); 如果指定元素存在于此set中,移除
isEmpty(); 如果set不包含任何元素,返回true
contains(Object o) 如果此set包含指定元素,返回true
HashSet遍历
使用for循环遍历
Set<String> set = new HashSet<String>();
for (String str : set) {
System.out.println(str);
}
区别:
HashSet只存key
HashMap、HashTable存key - value
HashTable 多线程同时访问同一个HashTable更安全,因为有线程加锁
HashMap原理以及时间复杂度
首先根据hashCode()做hash,然后确定bucket的index;
如果bucket的节点的key不是我们需要的,则通过keys.equals()在链中找。
put()
对key的hashCode()做hash,然后再计算index;
如果没碰撞直接放到bucket里;
如果碰撞了,以链表的形式存在buckets后;
如果碰撞导致链表过长(大于等于TREEIFY_THRESHOLD),就把链表转换成红黑树;
如果节点已经存在就替换old value(保证key的唯一性)
如果bucket满了(超过load factor*current capacity),就要resize。
get()
bucket里的第一个节点,直接命中;
如果有冲突,则通过key.equals(k)去查找对应的entry.若为树,则在树中通过key.equals(k)查找,O(logn);若为链表,则在链表中通过key.equals(k)查找,O(n)。
HashMap的查找时间复杂度只有在最理想的情况下(链表长度为1)才会为O(1),O(size of key)
Avg O(1), worst O(n) time 和O(n) space.
每一次存或者取,通过计算一个hash function获得key的unique hash值, 这部分是O(1)的. 正常情况就只需要这么多,如果有collision的话,就是两个key 算出来的hash值是一样的,那就是linear 的complexity, 因为一个key里面有两个值, 所以worst的情况O(n), 然而这个几率非常小, 多次都collide的几率更小.
Space的话就是每多一个key-value pair,就要allocate一个space,所以是O(n).
在Java 8之前的实现中是用链表解决冲突的,在产生碰撞的情况下,进行get时,两步的时间复杂度是O(1)+O(n)
因此在Java 8中,利用红黑树替换链表,这样复杂度就变成了O(1)+O(logn)
刷题upupup【Java中HashMap、HashSet用法总结】的更多相关文章
- java中HashMap的用法
重点介绍HashMap.首先介绍一下什么是Map.在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.在下文中会 ...
- Leetcode刷题之矩阵中的指针用法
矩阵中的指针用法 1 快慢指针 Leetcode27移除元素 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度.不要使用额外的数组 ...
- 牛客网刷题(纯java题型 31~60题)
牛客网刷题(纯java题型 31~60题) 重写Override应该满足"三同一大一小"三同:方法名相同,参数列表相同,返回值相同或者子类的返回值是父类的子类(这一点是经过验证的) ...
- 牛客网刷题(纯java题型 1~30题)
牛客网刷题(纯java题型 1~30题) 应该是先extend,然后implement class test extends A implements B { public static void m ...
- 【转】 java中HashMap详解
原文网址:http://blog.csdn.net/caihaijiang/article/details/6280251 java中HashMap详解 HashMap 和 HashSet 是 Jav ...
- Java 集合 HashMap & HashSet 拾遗
Java 集合 HashMap & HashSet 拾遗 @author ixenos 摘要:HashMap内部结构分析 Java HashMap采用的是冲突链表方式 从上图容易看出,如果选择 ...
- java中HashMap详解(转)
java中HashMap详解 博客分类: JavaSE Java算法JDK编程生活 HashMap 和 HashSet 是 Java Collection Framework 的两个重要成 ...
- java集合(2)- java中HashMap详解
java中HashMap详解 基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了非同步和允许使用 null 之外,HashMap 类与 H ...
- Java中HashMap遍历的两种方式
Java中HashMap遍历的两种方式 转]Java中HashMap遍历的两种方式原文地址: http://www.javaweb.cc/language/java/032291.shtml 第一种: ...
- java中this的用法?
2008-07-28 08:10cztx5479 | 分类:JAVA相关 | 浏览4533次 java中this的用法? import java.awt.*; import java.awt.even ...
随机推荐
- SQL 连接(内连接,外连接)
内连接 现在有两张表,学生表student1,成绩表SC1,两张表的数据如下 现在要对两张表做连接查询,连接一般需要写条件,where 或者 on 后面 , select * from student ...
- ubuntu 17.10 安装mvn
首先,我用的系统是Ubuntu17.10,编辑器用的 vim ,Maven以 3.5.0为例 第一步,去官网下载maven. 官网下载页面.png 第二步,解压到/opt/maven目录(我安装在这个 ...
- oracle数据库创建用户
--4.1 创建表空间 CREATE TABLESPACE mdm_data DATAFILE 'D:\soft\Oracle\oracl\oradata\mdm_data01.dbf' SIZE 3 ...
- vue.js把mounted里面的变量传到data里面
data(){ return{ crux:[] //声明下变量 } }, mounted:function(){ var cruxs = localStorage.historyItems.split ...
- vue强制刷新组件
<component v-if="hackReset"></component>(组件名称) data:hackReset (事件执行) this.hack ...
- 快速安装 Laravel 5.7
$ git clone https://github.com/laravel/laravel.git $ cd laravel $ cp .env.example .env $ composer in ...
- 王之泰201771010131《面向对象程序设计(java)》第十五周学习总结
第一部分:理论知识学习部分 第13 章 部署应用程序 1.jar文件 a) java 程序的打包:编译完成后,员 将.class 文件压缩打包为 .jar 文件后, GUI 界面 程序就可以直接双击图 ...
- logstash 抓取IIS日志文件写入Elasticsearch
如果需要对IIS日志进行分析可以使用logstash从文件中抓取出来进行分析: 输入部分: input { file { type => "iis_log_monitor" ...
- zabbix触发器表达式
zabbix触发器表达式 触发器使用逻辑表达式来评估通过item获取的数据是处于哪种状态, 触发器中的表达式使用很灵活,我们可以创建一个复杂的逻辑测试监控,触发器表达式形式如下: {<serve ...
- Linux常用命令——关机重启命令
Linux常用命令--关机重启命令 Linux shutdown 语法:shutdown [选项] 时间 -c 取消前一个关机命令 -h 关机 -r 重启 示例:shutdown -r now 其它 ...