hashmap

HashMap源码解析(jdk1.8)

纵然是瞬间 提交于 2020-01-23 08:19:01
HashMap在开发中经常用,而且面试的时候肯定也会被问到,所以了解源码是很有必要的,能够让我们更好的使用HashMap,今天总结一下,在最后面会有相关面试题。本文不会对红黑树代码由太多深入研究,特别是删除方面太复杂,我们知道红黑树的特点和基本实现原理差不多就可以了,这里推荐先学习2-3树,然后学习红黑树就会水到渠成,然后能够手写实现红黑树就挺好的。 这里HashMap源码基于jdk1.8,我们都知道1.8版本的HashMap有很大改变,而且现在开发一般也都是使用jdk1.8+版本,HashMap底层通过数组+链表+红黑树实现,对红黑树和链表不了解可以参考: Java数据结构和算法(四)–链表 Java数据结构和算法(八)–红黑树与2-3树 HashMap数据结构: 基本结构: public class HashMap < K , V > extends AbstractMap < K , V > implements Map < K , V > , Cloneable , Serializable { private static final long serialVersionUID = 362498820763181265 L ; } 继承了AbstractMap,又实现了Map,这里算是jdk集合开发者的一个失误吧,后来证明这样写应该是没什么用的,只是一直保留下来了

C dictionary/map

蹲街弑〆低调 提交于 2020-01-23 03:57:12
问题 I want to map struct members so I can eliminate if branches in a loop. What is the best way or convention to implement this in C? I suppose it could be a 2 dimensional array instead...then I could map integers to the char keys? char chunk[32]; int n; int i; char *ptr = config; while (*ptr != '\0') { int items_read = sscanf(ptr, "%31[^;]%n", chunk, &n); if(chunk[0] == 'S' && chunk[1] == 'P') { for(i=0;i<GLOBAL_MEAS_CUTOFF; i++) { theMeas[i].signal_path = atoi(&chunk[2]); } } if(chunk[0] == 'T'

Java从0开始(12)(集合)

心不动则不痛 提交于 2020-01-22 22:55:19
集合 Java 集合就像一种容器,可以动态地把多个对象的引用放入容器中。 Java 集合可分为 Collection 和 Map 两种体系 Collection接口 Collection 接口是 List、 Set 和 Queue 接口的父接口,该接口里定义的方法既可用于操作 Set 集合,也可用于操作 List 和 Queue 集合。 Collection接口: 单列数据, 定义了存取一组对象的方法的集合 List: 元素有序、可重复的集合 Set: 元素无序、不可重复的集合 Collection 接口方法 添加 add(Object obj) addAll(Collection coll) 获取有效元素的个数 int size() 清空集合 void clear() 是否是空集合 boolean isEmpty() 是否包含某个元素 boolean contains(Object obj): 是通过元素的equals方法来判断是否是同一个对象 boolean containsAll(Collection c): 也是调用元素的equals方法来比较的。 拿两个集合的元素挨个比较。 删除 boolean remove(Object obj) : 通过元素的equals方法判断是否是要删除的那个元素。 只会删除找到的第一个元素 boolean removeAll

java基础 equals和hashCode、HashMap

六眼飞鱼酱① 提交于 2020-01-22 20:05:06
我们知道equals和hashCode都是Object的方法,equals是比较对象是否相同的,默认的是比较地址值,hashCode是获取哈希码的,获取哈希码是有一套哈希算法的,具体没研究,每个版本的java都有些不一样。 equals和hashCode的关系更多的是一种约定,equals相同时,hashCode一定是相同的,equals不同时,hashCode也可能是相同的。所以才会有,重写equals方法一定要重写hashCode方法 hashCode是在HashMap中使用的,在hashMap是采用数组加链表的方式实现的,hashCode通过再hash然后能快速定位到数组的位置,然后再通过equals在链表中查找。说白了hashCode的存在就是为了提高查找效率。 Java中HashMap的实现原理 Java基础面试题 Object类中Hashcode 和 equals区别与联系是什么? HashMap的源码需要好好研究一下,它用到了红黑树 Java源码解析——集合框架(五)——HashMap源码分析 来源: CSDN 作者: Zhongyi_Li 链接: https://blog.csdn.net/lizhongyisailang/article/details/104069076

HashMap doesn't write in the database

柔情痞子 提交于 2020-01-22 03:32:11
问题 I try to write in my database but only the sender and the message is written.I don't understand why this happens.I think the problem is where I use the sendMessage.I think the problem is that I don't have something to read/write the primary key for the other users. The Activity where I written in the database the messages. public class MessageActivity extends AppCompatActivity { TextView username; FirebaseUser fuser; DatabaseReference reference; Intent intent; ImageButton btn_send; EditText

Creating your own custom keySet for a custom HashMap class

时光怂恿深爱的人放手 提交于 2020-01-22 02:05:58
问题 I am creating a program where a user can create a chose number of tasks, add a title to them and set whether if its favorite or not. I have set my key to a class called favorites and the status of being a favorite or not as a boolean for the value: public class Favorites { private String task; //Title of bookmarked task private boolean bookmark; //either favorite or otherwise public Favorites(String task, boolean bookmark) { this.task = task; this.bookmark = bookmark; } public String getTask(

《算法导论》第11章 散列表 (3)开放寻址

╄→尐↘猪︶ㄣ 提交于 2020-01-22 01:50:52
前一节介绍是最简单的冲突解决方法-链接法。开放寻址与链接法不同,所有元素都放在散列表内。 在这种方法中,散列表可能会被填满。开放寻址不需要指针,只需要计算出要存取的各个槽。 由于不用存储指针而节省的空间可以提供更多的槽。 有三种技术常用来计算开放寻址法中的探查序列:线性探查、二次探查和双重探查。 下面的实现中,三种方法的差别只在计算探查序列的那一行代码。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define SIZE 20 typedef struct _Entry { char *key; char *val; } Entry; // 指针数组 Entry *hashmap[SIZE]; // Same as hashcode when String put to HashMap unsigned hashcode(char *key) { // Ensure >> is logical shift unsigned h = 0; // String.hashcode() do h = 31 * h + *key++; while (*key != '\0'); // HashMap.hash() h ^= (h >> 20) ^ (h >> 12); return h ^ (h >> 7) ^ (h

《算法导论》第11章 散列表 (2)散列表

╄→尐↘猪︶ㄣ 提交于 2020-01-22 01:14:37
用散列表来解决直接寻址表的那两个问题。但由此带来的散列值的碰撞问题。 最简单的解决方法是链接法,以及下一节介绍的开放寻址法。 链接法,即把散列到同一槽中的所有元素都放在一个链表中。 链表是无序的,在查找一个元素时需要遍历链表。 对于删除函数,假如参数是要删除的结点,那么如果链表是双向的,删除操作可以O(1)内完成。 在下面的删除函数中,参数是关键字,这样更为方便。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define SIZE 20 // 链表结点的定义 typedef struct _ListNode { struct _ListNode *prev, *next; char *key; char *val; } ListNode; // 定义全局的各个槽链表的指针数组 ListNode *hashmap[SIZE]; // 这里的散列函数与Java中String及HashMap中的散列相同 // 注意为了保证向右逻辑运算(用0而不是符号位补高位) // 要将h声明为无符号的 unsigned hashcode(char *key) { // Ensure >> is logical shift unsigned h = 0; // String.hashcode() do h = 31 * h +

《算法导论》第11章 散列表 (2)散列表

妖精的绣舞 提交于 2020-01-22 01:12:06
用散列表来解决直接寻址表的那两个问题。但由此带来的散列值的碰撞问题。 最简单的解决方法是链接法,以及下一节介绍的开放寻址法。 链接法,即把散列到同一槽中的所有元素都放在一个链表中。 链表是无序的,在查找一个元素时需要遍历链表。 对于删除函数,假如参数是要删除的结点,那么如果链表是双向的,删除操作可以O(1)内完成。 在下面的删除函数中,参数是关键字,这样更为方便。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define SIZE 20 // 链表结点的定义 typedef struct _ListNode { struct _ListNode *prev, *next; char *key; char *val; } ListNode; // 定义全局的各个槽链表的指针数组 ListNode *hashmap[SIZE]; // 这里的散列函数与Java中String及HashMap中的散列相同 // 注意为了保证向右逻辑运算(用0而不是符号位补高位) // 要将h声明为无符号的 unsigned hashcode(char *key) { // Ensure >> is logical shift unsigned h = 0; // String.hashcode() do h = 31 * h +

这可能是第一次也是最全面的一次学习--HashMap

时光毁灭记忆、已成空白 提交于 2020-01-22 01:11:42
java-HashMap 学习HashMap的第一天: 如何学习: 1.从上到下的看一遍(先注释): 1.点开HashMap源码(前面的小部分注释内容) 2.核心内容: 3.从上到下啊开始看注释: 小总结: 学习HashMap的第一天: 如何学习: 1.从上到下的先总体过一遍 2.对于其中一些特殊的地方进行特殊的处理 3.融会贯通,总结在当中的特性和常见的面试问题 4.拓展与应用 1.从上到下的看一遍(先注释): 1.点开HashMap源码(前面的小部分注释内容) 2.核心内容: 1.HashMap的key和value可空,无序 2.初始容量和负载因子决定性能 3.线程不安全 3.从上到下啊开始看注释: 基于哈希表实现的Map接口,允许key和value值为空,大致相当于 hashtable (1) 只是它不同步,允许为空.这个类不能保证map的顺序,无法保证顺序会随时间变化 HashMap为基本功能提供了恒定时间的性能,假设使用哈希函数(散列函数)将元素适当的分散子各个同种,集合视图上的迭代需要的时间与模型的’容量(HashMap实例及其大小)'成正比.因此,如果迭代性能不佳,不要设置初始值或者设置负载因子过低( very importent ) HashMap中有两个参数会影响他的性能: 初始容量 和 负载因子. 初始容量就是HashMap中桶的数量