hashmap

HashMap和HashSet的区别

跟風遠走 提交于 2020-01-21 18:58:54
HashMap和HashSet的区别是Java面试中最常被问到的问题。如果没有涉及到Collection框架以及多线程的面试,可以说是不完整。而Collection框架的问题不涉及到HashSet和HashMap,也可以说是不完整。HashMap和HashSet都是collection框架的一部分,它们让我们能够使用对象的集合。collection框架有自己的接口和实现,主要分为Set接口,List接口和Queue接口。它们有各自的特点,Set的集合里不允许对象有重复的值,List允许有重复,它对集合中的对象进行索引,Queue的工作原理是FCFS算法(First Come, First Serve)。 首先让我们来看看什么是HashMap和HashSet,然后再来比较它们之间的分别。 什么是HashSet HashSet实现了Set接口,它不允许集合中有重复的值,当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否相等,以确保set中没有储存相等的对象。如果我们没有重写这两个方法,将会使用这个方法的默认实现。 public boolean add(Object o)方法用来在Set中添加元素,当元素值重复时则会立即返回false,如果成功添加的话会返回true。

Java基础方面

这一生的挚爱 提交于 2020-01-21 17:42:58
Java基础方面: 1 、作用域 public,private,protected, 以及不写时的区别 答: 区别如下: 作用域 当前类 同一package 子孙类 其他package public √ √ √ √ protected √ √ √ × friendly √ √ × × private √ × × × 不写时默认为friendly 2 、 Anonymous Inner Class ( 匿名内部类 ) 是否可以 extends( 继承 ) 其它类,是否可以 implements( 实现 )interface( 接口 ) 答: 匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以作为一个接口,由另一个内部类实现 3 、 Static Nested Class 和 Inner Class 的不同 答: Nested Class (一般是C++的说法),Inner Class (一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。注: 静态内部类(Inner Class)意味着1创建一个static内部类的对象,不需要一个外部类对象,2不能从一个static内部类的一个对象访问一个外部类对象 4 、 & 和 && 的区别 答: &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and) 5 、

【Java】HashMap 常用方法总结

谁说我不能喝 提交于 2020-01-21 16:27:31
HashMap 简单知识点 Map 集合即 Key-Value 的集合,前面加个 Hash,即散列,无序的。所以 HashMap 是一个用于存储Key-Value键值对的无序集合,每一个键值对也叫做Entry。 在 JDK1.8 之前,HashMap 采用数组+链表实现,即使用链表处理冲突,同一 hash 值的节点都存储在一个链表里。但是当位于一个桶中的元素较多,即 hash 值相等的元素较多时,通过 key 值查找要遍历链表,时间复杂度为 O(N),效率较低。 因此 JDK1.8 中,HashMap 采用数组+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,时间复杂度为 O(logN),这样大大减少了查找时间。 用一段代码来介绍常用方法: package a ; import java . util . HashMap ; import java . util . Map . Entry ; public class Main { public static void main ( String [ ] args ) { HashMap < String , Integer > mp = new HashMap < String , Integer > ( ) ; mp . put ( "one" , 1 ) ; //存放键值对 System . out .

ZXing生成二维码

送分小仙女□ 提交于 2020-01-21 12:38:51
1.什么是二维码? ​ (百度百科):二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。 2.利用ZXING生成二维码 ​ ·对应POM <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.2.1</version> </dependency> ​ ·Java代码(生成二维码) // 二维码的宽度 static final int WIDTH = 300; // 二维码的高度 static final int HEIGHT = 300; // 二维码的格式 static final String FORMAT = "png"; // 二维码的内容 static final String TEXT = "Hello!二维码!!!"; /** * 生成二维码 */

How can I store multiple elements in a Rust HashMap for the same key?

淺唱寂寞╮ 提交于 2020-01-21 12:23:26
问题 I have a HashMap<u32, Sender> . Sender is a open connection object and the key is a user id. Each user can connect from multiple devices. I need to store all possible open connections for the same user id. After this I can iterate and send messages to all open connections for same user. The above HashMap only stores each user id and connection once. I need to get one key with multiple values. How can I make the value into a list or an array, so I can see which connections exist and send to

Java 容器 - 一文详解HashMap

扶醉桌前 提交于 2020-01-21 02:36:04
Map 类集合 Java Map类集合,与Collections类集合存在很大不同。它是与Collection 类平级的一个接口。 在集合框架中,通过部分视图方法这一根 微弱的线联系起来。 (在之后的分享中,我们会讨论到Collections 框架的内容) Map类集合中的存储单位是K-V键值对,就是 使用一定的哈希算法形成一组比较均匀的哈希值作为Key,Value值挂在Key上。 Map类 的特点: 没有重复的Key,可以具有多个重复的Value Value可以是List/Map/Set对象 KV是否允许为null,以实现类的约束为准 Map集合类 Key Value Super JDK 说明 Hashtable 不允许为 null 不允许为 null Dictionary 1.0 (过时)线程安全类 ConcurrentHashMap 不允许为 null 不允许为 null AbstractMap 1.5 锁分段技术或CAS(JDK8 及以上) TreeMap 不允许为 null 允许为 null AbstractMap 1.2 线程不安全(有序) HashMap 允许为 null 允许为 null AbstractMap 1.2 线程不安全(resize 死链问题) 从jdk1.0-1.5,这几个重点KV集合类,见证了Java语言成为工业级语言的成长历程。 知识点: Map

HashMap源码分析(一)

社会主义新天地 提交于 2020-01-20 23:26:03
基于JDK1.7 HashMap源码分析 概述 HashMap是存放键值对的集合,数据结构如下: table被称为桶,大小(capacity)始终为2的幂,当发生扩容时,map容量扩大为两倍 HashMap采用拉链法解决Hash冲突,发生冲突时,新元素采用头插法插入到对应桶的链表中 HashMap有几个重要字段: size:HashMap键值对的数量 capacity:桶数量,即table.length,默认16 loadFactor:负载因子,度量负载程度,基于时间和空间的权衡,默认0.75 threshold:阈值,当 size>=threshold 将发生扩容, threshold=capacity * loadFactor 。 JDK1.7 源码分析 属性 /** * 默认初始容量 (必须是2的幂) */ static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 /** * 最大容量 */ static final int MAXIMUM_CAPACITY = 1 << 30; /** * 默认负载因子 */ static final float DEFAULT_LOAD_FACTOR = 0.75f; /** * 空表 */ static final Entry<?,?>[] EMPTY_TABLE = {

HashMap排序题

橙三吉。 提交于 2020-01-20 16:42:51
已知一个 HashMap<Integer,User>集合,User 有 name(String)和 age(int)属性。请写一个方法实现对HashMap 的排序功能,该方法接收 HashMap<Integer,User>为形参,返回类型为 HashMap<Integer,User>,要求对 HashMap 中的 User 的 age 倒序进行排序。排序时 key=value 键值对不得拆散。 public class User { private String name ; private Integer age ; public User ( ) { } public User ( String name , Integer age ) { this . name = name ; this . age = age ; } public String getName ( ) { return name ; } public void setName ( String name ) { this . name = name ; } public Integer getAge ( ) { return age ; } public void setAge ( Integer age ) { this . age = age ; } @Override public String

Java面试题1-Java基础

别等时光非礼了梦想. 提交于 2020-01-20 10:47:39
实例方法和静态方法有什么不一样 1.在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。 而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。 2.静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许 访问实例成员变量和实例方法,如果需要调用,则需要先实例化;实例方法则无此限制 3.静态方法是在类中使用staitc修饰的方法,在类定义的时候已经被装载和分配。而非静态方法是 不加static关键字的方法,在类定义时没有占用内存,非静态方法只有在类被实例化成对象时,对象 调用该方法才被分配内存 Java中的异常有哪几类?分别怎么使用 Throwable是所有异常的根,java.lang.Throwable Error:错误,Java.lang.Error Exception:异常,java.lang.Exception Exception分为CheckedException和RuntimeException,所有RuntimeException类及其子类的实例 被称为Runtime异常,不属于该范畴的异常则被称为CheckedException checkedException: 只有Java语言提供了Checked异常,Java认为checked异常都是可以被处理的异常,

HashMap、lru、散列表

馋奶兔 提交于 2020-01-20 04:43:39
HashMap HashMap的数据结构:HashMap实际上是一个数组和链表(“链表散列”)的数据结构。底层就是一个数组结构,数组中的每一项又是一个链表。 hashCode是一个对象的标识,Java中对象的hashCode是一个int类型值。通过hashCode来算出指定数组的索引可以快速定位到要找的对象在数组中的位置,之后再遍历链表找到对应值,理想情况下时间复杂度为O(1),并且不同对象可以拥有相同的hashCode(hash碰撞)。发生碰撞后会把相同hashcode的对象放到同一个链表里,但是在数组大小不变的情况下,存放键值对越多,查找的时间效率也会降低 扩容可以解决该问题,而负载因子决定了什么时候扩容,负载因子是已存键值对的数量和总的数组长度的比值。默认情况下负载因子为0.75,我们可在初始化HashMap的时候自己修改。阀值 = 当前数组长度✖负载因子 hashmap中默认负载因子为0.75,长度默认是16,默认情况下第一次扩容判断阀值是16 ✖ 0.75 = 12;所以第一次存键值对的时候,在存到第13个键值对时就需要扩容了,变成16X2=32。 put流程 对key hash,二次hash,hash扰乱函数,减少hash碰撞 int hash(Object key) { int h = key.hashCode(); return (h ^ (h >>> 16)) &