hash函数

一次性搞清楚equals和hashCode

試著忘記壹切 提交于 2020-02-22 00:28:08
  在程序设计中,有很多的“公约”,遵守约定去实现你的代码,会让你避开很多坑,这些公约是前人总结出来的设计规范。   Object类是Java中的万类之祖,其中,equals和hashCode是2个非常重要的方法。   这2个方法总是被人放在一起讨论。最近在看集合框架,为了打基础,就决定把一些细枝末节清理掉。一次性搞清楚! 下面开始剖析。 public boolean equals(Object obj)   Object类中默认的实现方式是 : return this == obj 。那就是说,只有this 和 obj引用同一个对象,才会返回true。(如果我们没有重写equals方法,equals和==一样比较的都是内存地址,只是equals可以让我们重写。)   而我们往往需要用equals来判断 2个对象是否等价,而非验证他们的唯一性。这样我们在实现自己的类时,就要重写equals. 按照约定,equals要满足以下规则。 自反性 : x.equals(x) 一定是true 对null : x.equals(null) 一定是false 对称性 : x.equals(y) 和 y.equals(x)结果一致 传递性: a 和 b equals , b 和 c equals,那么 a 和 c也一定equals。 一致性: 在某个运行时期间

eqauls和hashCode的对比

*爱你&永不变心* 提交于 2020-02-22 00:27:18
public boolean equals(Object obj) Object类中默认的实现方式是 : return this == obj 。那就是说,只有this 和 obj引用同一个对象,才会返回true。 而我们往往需要用equals来判断 2个对象是否等价,而非验证他们的唯一性。这样我们在实现自己的类时,就要重写equals. 按照约定,equals要满足以下规则: 自反性 : x.equals(x) 一定是true 对null : x.equals(null) 一定是false 对称性 : x.equals(y) 和 y.equals(x)结果一致 传递性 : a 和 b equals , b 和 c equals,那么 a 和 c也一定equals。 一致性 : 在某个运行时期间,2个对象的状态的改变不会不影响equals的决策结果,那么,在这个运行时期间,无论调用多少次equals,都返回相同的结果。 一个例子 class Test { private int num; private String data; public boolean equals(Object obj) { if (this == obj) return true; if ((obj == null) || (obj.getClass() != this.getClass()))

collection(list,set,map)、HashMap

断了今生、忘了曾经 提交于 2020-02-18 02:53:39
collection里面有什么子类?(list和set是实现了collection接口的。)   List: 1.可以允许重复的对象(可重复,有序集合)。 2.可以插入多个null元素。 3.常用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的随意访问,而 LinkedList 则对于经常需要从 List 中添加或删除元素的场合更为合适。 ———————————————— Set: 1.不允许重复对象(不可重复,无序集合)。 2 只允许一个 null 元素 3.Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 实现的 HashSet;TreeSet 还实现了 SortedSet 接口,因此 TreeSet 是一个根据其 compare() 和 compareTo() 的定义进行排序的有序集合。而且可以重复。 ———————————————— Map: 1.Map不是collection的子接口或者实现类。Map是一个接口。 2.不允许重复元素。 3. Map 里你可以拥有随意个 null 值但只能有一个 null (key)键。 4. Map 接口最流行的几个实现类是 HashMap、LinkedHashMap、Hashtable

HashMap 实现原理及源码分析

偶尔善良 提交于 2020-02-18 00:43:39
HashMap是JDK中非常重要的容器,采用 数组 + 链表 的方式实现,理想情况下能支持 O(1) 时间复杂度的增删改查操作。本文将由浅入深地讲解哈希表的实现原理,并对HashMap的部分源码进行分析。 1. 从数组说起 数组应该是我们最先学习的数据结构,它是内存中一块连续的存储单元,因此计算机可以根据数组起始地址、元素长度和下标,计算出我们要访问的元素的地址,时间复杂度为 O(1) 。 以下代码定义了一个简单的 Student 类,假如我们要存储 20 个 Student 对象,我们希望能够在 O(1) 时间复杂度内,根据 studentID 找到相应的对象。 public class Student { public int studentID; public String name; public Student(int studentID, String name) { this.studentID = studentID; this.name = name; } } 如果我们要存储的 20 个 Student 对象的 studentID 刚好就是从 0 到 19,我们自然可以新建一个长度为 20 的 Student 数组 students,然后将对象的 studentID 作为数组下标,放到对应的 slot 里面,如下图所示。这样的话,如果我们想找 studentID

浅析分布式系统中的一致性哈希算法

点点圈 提交于 2020-02-17 08:59:42
分布式系统与高并发高可用 浅析分布式系统中的一致性哈希算法 通过本文将了解到以下内容: 分布式系统的简单概念和基本作用 分布式系统常用负载均衡策略 普通哈希取模策略优缺点 一致性哈希算法的定义和思想 一致性哈希的基本过程 Redis集群中一致性哈希的实现 1.分布式系统的基本概念 分布式系统与高并发高可用 当今高并发和海量数据处理等场景越来越多,实现服务应用的高可用、易扩展、短延时等成为必然。 在此情况下分布式系统应运而生,互联网的场景无外乎存储和计算,因此分布式系统可以简单地分为: 分布式存储 分布式计算 所谓分布式系统就是一批计算机组合起来共同对外提供服务,对于用户来说具体有多少规模的计算机完成了这次请求,完全是无感知的。分布式系统中的计算机越多,意味着计算和存储资源等也就越多,能够处理的并发访问量也就越大,响应速度也越快。 如图为简单整体架构图: 大前端 主要实现了服务应用对应的所有流量的接入,比如xyz域名下可能有N个子服务,这一层涉及很多网络流量的处理,也很有挑战,像百度的BFE(百度统一前端)接入了百度的大部分流量,每日转发1万亿次,峰值QPS1000w。 中间层 完成了各个服务的调度和分发,粒度相比大前端接入层更细致一些,这一层实现了用户的无感知体验,可以简单理解为反向代理层。 业务层 完成了数据存储、数据计算、数据缓存等,各个业务环节高度解耦,并且基于集群化来实现。

linux常用命令使用格式

让人想犯罪 __ 提交于 2020-02-17 01:43:40
whatis命令 显示命令的简短描述 使用数据库 刚安装后不可立即使用 makewhatis | mandb制作数据库 使用示例: whatis cal 或 man –f cal 获取命令帮助  内部命令:help COMMAND 或 man bash  外部命令: (1) COMMAND --help 或 COMMAND -h (2) 使用手册(manual) man COMMAND (3) 信息页 info COMMAND 内部外部命令 内部命令:由shell自带的,而且通过某命令形式提供 help 内部命令列表 enable cmd 启用内部命令 enable –n cmd 禁用内部命令 enable –n 查看所有禁用的内部命令 外部命令:在文件系统路径下有对应的可执行程序文件 查看路径:which -a |–skip-alias ; whereis 区别指定的命令是内部或外部命令 type COMMAND Hash缓存表 系统初始hash表为空,当外部命令执行时,默认会从PATH路径下寻找该命 令,找到后会将这条命令的路径记录到hash表中,当再次使用该命令时,shell解 释器首先会查看hash表,存在将执行之,如果不存在,将会去PATH路径下寻找, 利用hash缓存表可大大提高命令的调用速率 hash常见用法 hash 显示hash缓存 hash

Python—内置函数和匿名函数

≯℡__Kan透↙ 提交于 2020-02-16 01:22:43
楔子 在讲新知识之前,我们先来复习复习函数的基础知识。 问:函数怎么调用? 函数名() 如果你们这么说。。。那你们就对了!好了记住这个事儿别给忘记了,咱们继续谈下一话题。。。 来你们在自己的环境里打印一下自己的名字。 你们是怎么打的呀? 是不是print('xxx'),好了,现在你们结合我刚刚说的函数的调用方法,你有没有什么发现? 我们就猜,print有没有可能是一个函数? 但是没有人实现它啊。。。它怎么就能用了呢? 早在我们“初识函数”的时候是不是就是用len()引出的? 那现在我们也知道len()也是一个函数,也没人实现,它好像就自己能用了。。。 之前老师给你讲你可以这样用你就用了,那你有没有想过像这样直接拿来就能用的函数到底有多少? 内置函数 接下来,我们就一起来看看python里的内置函数。截止到python版本3.6.2,现在python一共为我们提供了 68个内置函数 。它们就是python提供给你直接可以拿来使用的所有函数。这些函数有些我们已经用过了,有些我们还没用到过,还有一些是被封印了,必须等我们学了新知识才能解开封印的。那今天我们就一起来认识一下python的内置函数。这么多函数,我们该从何学起呢? Built-in Functions abs() dict() help() min() setattr() all() dir() hex() next()

深入理解Oracle表(5):三大表连接方式详解之Hash Join的定义,原理,算法,成本,模式和位图...

孤街浪徒 提交于 2020-02-14 07:25:15
Hash Join只能用于相等连接,且只能在CBO优化器模式下。相对于nested loop join,hash join更适合处理大型结果集 Hash Join的执行计划第1个是hash表(build table),第2个探查表(probe table),一般不叫内外表,nested loop才有内外表 Hash表也就是所谓的内表,探查表所谓的外表 两者的执行计划形如: nested loop outer table --驱动表 inner table hash join build table (inner table) --驱动表 probe table (outer table) 先看一张图片,大致了解Hash Join的过程: 下面详细了解一下Hash Join ㈠ Hash join概念 H ash join算法的一个基本思想就是根据小的row sources(称作build input 也就是前文提到的build table,我们记较小的表为S,较大的表为B) 建立一个可以存在于hash area内存中的hash table 然后用大的row sources(称作probe input,也就是前文提到的probe table) 来探测前面所建的hash table 如果hash area内存不够大,hash table就无法完全存放在hash area内存中

C++-POJ2503-Babelfish[hash]

北城余情 提交于 2020-02-12 00:41:01
哈个希加挂个链表 一个要背的字符串hash函数 ELFhash() mod数取数据最大容量的1.5倍最佳?! 1 #include <set> 2 #include <map> 3 #include <cmath> 4 #include <queue> 5 #include <vector> 6 #include <cstdio> 7 #include <cstdlib> 8 #include <cstring> 9 #include <iostream> 10 #include <algorithm> 11 using namespace std; 12 const int MAXN=150001;//比1e5大的质数 13 struct node{char e[11],f[11];int next;}word[MAXN]; 14 int cnt,hashHead[MAXN];char s[30]; 15 16 int ELFhash(char *key){ 17 unsigned long h=0; 18 for(unsigned long g;*key;h&=~g){ 19 h=(h<<4)+(*key++); 20 g=h&0Xf0000000L; 21 if(g)h^=g>>24; 22 } 23 return h%MAXN; 24 } 25 26 void find()

数据分析面试题解答

与世无争的帅哥 提交于 2020-02-12 00:27:46
本文用于自己学习 部分内容来自网络 数据分析面试题解析 问题描述:对于一个文本集合,把相似的单词进行归类。这里这样定义相似单词:两个单词只有一个字母不一样! 解析:找到两个单词之中只有一个字母不一样的单词 1.暴力读取 方法一:对于这个问题,我们最开始使用的是暴力穷举办法。遍历文本中的每个单词,找出在文本中与其相似的单词,算法的时间复杂度是o(n**2),对于常见的英文词典,差不多有将近20000个单词,那么需要经过4亿次运算,时间惊人,在实际中不可能行得通。当然这里还是有一个trick,因为相似单词总是长度一样的,所以你也许可以少许多计算。 2.使用正则的方式找到只有一个字母不同的单词(使用正则的思想进行查找) 方法二: 从相似单词的特点入手。‘son’和‘sun’都可以用正则表达式中的‘s.n’来表示,其中.在正则表达式中可以代表任意的符号 我们使用一个一个字典结构:key是正则字符串 value:是相似单词的集合。举个例子:对于单词’son’,那么符合它的正则匹配有‘.on’,‘s.n’,‘so.’,那么字典中,分别是:key:’.on’,value:‘son’,key:‘s.n’,value:‘son’,key:‘so.’,value:‘son’,对于单词‘sun’,进行同样的计算,同时字典开始更新:key:’.un’,value:‘sun’,key:‘s.n’,value