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用法总结】的更多相关文章

  1. java中HashMap的用法

    重点介绍HashMap.首先介绍一下什么是Map.在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.在下文中会 ...

  2. Leetcode刷题之矩阵中的指针用法

    矩阵中的指针用法 1 快慢指针 ​ Leetcode27移除元素 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度.不要使用额外的数组 ...

  3. 牛客网刷题(纯java题型 31~60题)

    牛客网刷题(纯java题型 31~60题) 重写Override应该满足"三同一大一小"三同:方法名相同,参数列表相同,返回值相同或者子类的返回值是父类的子类(这一点是经过验证的) ...

  4. 牛客网刷题(纯java题型 1~30题)

    牛客网刷题(纯java题型 1~30题) 应该是先extend,然后implement class test extends A implements B { public static void m ...

  5. 【转】 java中HashMap详解

    原文网址:http://blog.csdn.net/caihaijiang/article/details/6280251 java中HashMap详解 HashMap 和 HashSet 是 Jav ...

  6. Java 集合 HashMap & HashSet 拾遗

    Java 集合 HashMap & HashSet 拾遗 @author ixenos 摘要:HashMap内部结构分析 Java HashMap采用的是冲突链表方式 从上图容易看出,如果选择 ...

  7. java中HashMap详解(转)

    java中HashMap详解 博客分类: JavaSE Java算法JDK编程生活       HashMap 和 HashSet 是 Java Collection Framework 的两个重要成 ...

  8. java集合(2)- java中HashMap详解

    java中HashMap详解 基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了非同步和允许使用 null 之外,HashMap 类与 H ...

  9. Java中HashMap遍历的两种方式

    Java中HashMap遍历的两种方式 转]Java中HashMap遍历的两种方式原文地址: http://www.javaweb.cc/language/java/032291.shtml 第一种: ...

  10. java中this的用法?

    2008-07-28 08:10cztx5479 | 分类:JAVA相关 | 浏览4533次 java中this的用法? import java.awt.*; import java.awt.even ...

随机推荐

  1. Linux SPI初始化及接口函数代码细究

    2012-01-08 22:11:38 目的:我需要掌握spi驱动相关数据结构关系,及在哪部分函数中把这些数值进行底层寄存器赋值的.结合应用层函数完成spi驱动的代码测试.已达到灵活修改的目的. 按顺 ...

  2. ES6 Promise用法讲解

    所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果. ES6 规定,Promise对象是一个构造函数,用来生成Promise实例. 下面代码创造了一个 ...

  3. uploadify上传图片的使用

    一:引用jquery.uploadify.js 二:代码 <body> <table> <tr> <td style="width: 15%; te ...

  4. post请求中body数据类型

    1.application/json:json格式,如下: {"input1":"xxx","input2":"ooo" ...

  5. 2个监听器+ dialog + replysubject + extends

    import 'package:flutter/material.dart'; import 'package:rxdart/rxdart.dart'; import 'package:flutter ...

  6. 富文本编辑器Quill(一)简单介绍

    Quill是一个很流行的富文本编辑器,github上star大约21k: github:https://github.com/quilljs/quill/ 官网: https://quilljs.co ...

  7. centos设置网卡开机自启动

    1.进入目录/etc/sysconfig/network-scripts/2.修改ifcfg-enxxxxxxxx 文件   (即你的网卡标识命名的配置文件)3. 将ONBOOT=no改成yes4. ...

  8. The application to execute does not exist: 'C:\Users\Administrator\.dotnet\tools\.store\dotnet-aspnet-codegenerator\2.2.0-rtm-35687\dotnet-aspnet-codegenerator\2.2.0-rtm-35687\tools\netcoreapp2.1\any\

    vs code mvc搭建基架执行命令操作出现的问题解决方式重新复制拷贝一份2.2.0命名为2.2.0-rtm-35687, 修改

  9. Request method 'PUT'/ 'POST' not supported

    起因 在项目中遇到需要进行crud操作的功能,用的是Springboot+MybatisPlus+MySQL+AVue,在通过postman测试接口正确性时遇到此错误. 排查过程 因为项目运行是没问题 ...

  10. Lintcode174-Remove Nth Node From End of List-Easy

    174. Remove Nth Node From End of List Given a linked list, remove the nth node from the end of list ...