hash函数

Java面试---HashSet 是如何保证不重复的

你离开我真会死。 提交于 2019-12-15 03:15:55
HashSet类实现了Set接口, 其底层其实是包装了一个HashMap去实现。HashSet采用HashCode算法来存取集合中的元素,因此具有比较好的读取和查找性能。 下面我们来看一下源码: 下面是HashSet的几个构造方法 可以看得出 HashSet的底层其实是HashMap存储的 通俗来说HashSet就是HashMap的马甲: // 默认构造函数 底层创建一个HashMap public HashSet() { // 调用HashMap的默认构造函数,创建map map = new HashMap<E,Object>(); } // 带集合的构造函数 public HashSet(Collection<? extends E> c) { // 创建map。 map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16)); // 将集合(c)中的全部元素添加到HashSet中 addAll(c); } // 指定HashSet初始容量和加载因子的构造函数 public HashSet(int initialCapacity, float loadFactor) { map = new HashMap<E,Object>(initialCapacity, loadFactor); } //

搭建Memcache服务详解

不羁的心 提交于 2019-12-15 00:09:59
博文大纲: 一、Memcache简介 二、Memcache工作流程 三、Memcache调度算法 四、Memcache实现原理 五、安装Memcache (1)安装nginx服务器 (2)安装PHP服务器 (3)安装MySQL数据库 (4)测试PHP与Nginx、MySQL的连通性 (5)安装Memcache服务器 (6)PHP服务器安装Memcache客户端 (7)使用 memcache 实现 session 共享 (8)测试Memcache缓存数据库 一、Memcache简介 Memcache是一套自由、开源、高性能、分布式的高速缓存系统。由于Memcache通过在内存中缓存数据和对象来减少读取数据库的次数。目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站访问速度提升效果十分显著。 Memcache是一个存储键值对的HashMap,在内存中对任意的数据都可以使用key-value的方式存储,数据库可以来自数据库调用或API调用。Memcache设计理念就是小而强大,她简单的设计促进了快速部署、易于开发并解决大规模的数据缓存的许多难题,而其所开放的API使得Memcache能用于Java、C/C++/C#、Perl、Python等大部分流行的程序语言。 二、Memcache工作流程 注意Memcache虽然被称为“分布式缓存”

文本相似度计算-JaccardSimilarity和哈希签名函数

萝らか妹 提交于 2019-12-14 21:10:26
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 在目前这个信息过载的星球上,文本的相似度计算应用前景还是比较广泛的,他可以让人们过滤掉很多相似的新闻,比如在搜索引擎上,相似度太高的页面,只需要展示一个就行了,还有就是,考试的时候,可以用这个来防作弊,同样的,论文的相似度检查也是一个检查论文是否抄袭的一个重要办法。 文本相似度计算的应用场景 过滤相似度很高的新闻,或者网页去重 考试防作弊系统 论文抄袭检查 光第一项的应用就非常广泛。 文本相似度计算的基本方法 文本相似度计算的方法很多,主要来说有两种,一是 余弦定律 ,二是 JaccardSimilarity 方法, 余弦定律 不在本文的讨论范围之内,我们主要说一下 JaccardSimilarity 方法。 JaccardSimilarity方法 JaccardSimilarity 说起来非常简单,容易实现,实际上就是两个集合的交集除以两个集合的并集,所得的就是两个集合的相似度,直观的看就是下面这个图。 数学表达式是: |S ∩ T|/|S ∪ T| 恩,基本的计算方法就是如此,而两个集合分别表示的是两个文本,集合中的元素实际上就是文本中出现的词语啦,我们需要做的就是把两个文本中的词语统计出来,然后按照上面的公式算一下就行了,其实很简单。 统计文本中的词语 关于统计文本中的词语,可以参考我的另外一篇博文

Java四年面试总结

≯℡__Kan透↙ 提交于 2019-12-13 07:18:46
1.为什么工作中常用String拼接字符串,而不用StringBuffer/StringBuilder? 2.string是不可变对象,在后面拼接字符串不会重新创建对象;而用StringBuffer的话,太多就会占用过多的内存,特别是循环添加时,主要是考虑JVM内存才用的String。 读取一个有100万条数据的文件,并且把着100万条数据插入数据库需要注意些什么? 1)JVM是否可以承受住这么大的数据量; 2)每当放入1000条数据就提交一次,然后重新new一个Table,赋值给原来的变量、再继续放入下一个1000条记录; 3)先取消数据库表的索引、外键和触发器等会加大写入的速度。 3.数组(arrayList)与链表(linkedList)的优缺点和区别 1.数组数组:是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素。但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中。同样的道理,如果想删除一个元素,同样需要移动大量元素去填掉被移动的元素。如果应用需要快速访问数据,很少插入和删除元素,就应该用数组 2链表:中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起,每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的 指针。如果要访问链表中一个元素

深入浅出HashMap的设计与优化

空扰寡人 提交于 2019-12-13 00:50:09
一:常用的数据结构 众所周知, ArrayList 是基于数组的数据结构实现的,LinkedList 是基于链表的数据结构实现的,而 HashMap 是基于哈希表的数据结构实现的。我们不妨一起来温习下常用的数据结构。 数组: 采用一段连续的存储单元来存储数据。对于指定下标的查找,时间复杂度为 O(1),但在数组中间以及头部插入数据时,需要复制移动后面的元素。 链表: 一种在物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素)组成,结点可以在运行时动态生成。每个结点都包含“存储数据单元的数据域”和“存储下一个结点地址的指针域”这两个部分。由于链表不用必须按顺序存储,所以链表在插入的时候可以达到 O(1) 的复杂度,但查找一个结点或者访问特定编号的结点需要 O(n) 的时间。 哈希表: 根据关键码值(Key value)直接进行访问的数据结构。通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做哈希函数,存放记录的数组就叫做哈希表。 树: 由 n(n≥1)个有限结点组成的一个具有层次关系的集合,就像是一棵倒挂的树。 二:HashMap 的实现结构 了解完数据结构后,我们再来看下 HashMap 的实现结构。作为最常用的 Map 类,它是基于哈希表实现的,继承了 AbstractMap

php底层运行机制与原理

橙三吉。 提交于 2019-12-12 10:21:41
php底层运行机制与原理 1 PHP的设计理念及特点 多进程模型 :由于PHP是多进程模型,不同请求间互不干涉,这样保证了一个请求挂掉不会对全盘服务造成影响,当然,时代发展,PHP也早已支持多线程模型。 弱类型语言 :和C/C++、Java、C#等语言不同,PHP是一门弱类型语言。一个变量的类型并不是一开始就确定不变,运行中才会确定并可能发生隐式或显式的类型转换,这种机制的灵活性在web开发中非常方便、高效。 引擎(Zend)+组件(ext)的模式,降低内部耦合。 中间层(sapi),隔绝web server和PHP。 语法简单灵活,没有太多规范。 2 PHP的核心架构 PHP核心架构如下图,从下到上可以简单分为四层体系: Zend引擎 :纯C实现,是PHP的内核部分,它将PHP代码翻译(词法、语法解析等一系列编译过程)为可执行opcode的处理并实现相应的处理方法、实现了基本的数据结构(如hashtable、oo)、内存分配及管理、提供了相应的api方法供外部调用,是一切的核心,所有的外围功能均围绕Zend实现。 Extensions :围绕着Zend引擎,extensions通过组件式的方式提供各种基础服务,我们常见的各种内置函数(如array 系列)、标准库等都是通过extension来实现。 Sapi :全称是Server Application Programming

学了这篇redis从入门到精通,redis笔记全收录,必须收藏

别来无恙 提交于 2019-12-12 10:17:57
一、概述 二、数据类型 STRING LIST SET HASH ZSET 三、数据结构 字典 跳跃表 四、使用场景 计数器 缓存 查找表 消息队列 会话缓存 分布式锁实现 其它 五、Redis 与 Memcached 数据类型 数据持久化 分布式 内存管理机制 六、键的过期时间 七、数据淘汰策略 八、持久化 RDB 持久化 AOF 持久化 九、事务 十、事件 文件事件 时间事件 事件的调度与执行 十一、复制 连接过程 主从链 十二、Sentinel 十三、分片 十四、一个简单的论坛系统分析 文章信息 点赞功能 对文章进行排序 参考资料 一、概述 Redis 是速度非常快的非关系型(NoSQL)内存键值数据库,可以存储键和五种不同类型的值之间的映射。 键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。 Redis 支持很多特性,例如将内存中的数据持久化到硬盘中,使用复制来扩展读性能,使用分片来扩展写性能。 二、数据类型 数据类型 可以存储的值 操作 STRING 字符串、整数或者浮点数 对整个字符串或者字符串的其中一部分执行操作 对整数和浮点数执行自增或者自减操作 LIST 列表 从两端压入或者弹出元素 对单个或者多个元素进行修剪, 只保留一个范围内的元素 SET 无序集合 添加、获取、移除单个元素 检查一个元素是否存在于集合中 计算交集、并集、差集

HashMap源码学习

…衆ロ難τιáo~ 提交于 2019-12-12 08:49:47
HashMap 简介 HashMap 主要用来存放键值对,它基于哈希表的Map接口实现,是常用的Java集合之一。 JDK1.8 之前 HashMap 由 数组+链表 组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突).JDK1.8 以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)时,将链表转化为红黑树(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树),以减少搜索时间,具体可以参考 treeifyBin 方法。 底层数据结构分析 JDK1.8之前 JDK1.8 之前 HashMap 底层是 数组和链表 结合在一起使用也就是 链表散列 。 HashMap 通过 key 的 hashCode 经过扰动函数处理过后得到 hash 值,然后通过 (n - 1) & hash 判断当前元素存放的位置(这里的 n 指的是数组的长度),如果当前位置存在元素的话,就判断该元素与要存入的元素的 hash 值以及 key 是否相同,如果相同的话,直接覆盖,不相同就通过拉链法解决冲突。 所谓扰动函数指的就是 HashMap 的 hash 方法。使用 hash 方法也就是扰动函数是为了防止一些实现比较差的 hashCode() 方法 换句话说使用扰动函数之后可以减少碰撞 JDK 1

hashcode的理解

不想你离开。 提交于 2019-12-10 08:41:06
============================================================ 如何理解hashCode的作用: ============================================================ 以java.lang.Object来理解,JVM每new一个Object,它都会将这个Object丢到一个Hash哈希表中去,这样的话,下次做Object的比较或者取这个对象的时候,它会根据对象的hashcode再从Hash表中取这个对象。这样做的目的是提高取对象的效率。具体过程是这样: 1.new Object(),JVM根据这个对象的Hashcode值,放入到对应的Hash表对应的Key上,如果不同的对象确产生了相同的hash值,也就是发生了Hash key相同导致冲突的情况,那么就在这个Hash key的地方产生一个链表,将所有产生相同hashcode的对象放到这个单链表上去,串在一起。 2.比较两个对象的时候,首先根据他们的hashcode去hash表中找他的对象,当两个对象的hashcode相同,那么就是说他们这两个对象放在Hash表中的同一个key上,那么他们一定在这个key上的链表上。那么此时就只能根据Object的equal方法来比较这个对象是否equal。当两个对象的hashcode不同的话

Python类中特殊方法__eq__和__hash__的关系

♀尐吖头ヾ 提交于 2019-12-10 01:47:39
class Point ( object ) : def __init__ ( self , x , y ) : self . x = x self . y = y def __repr__ ( self ) : return repr ( ( self . id , self . x , self . y ) ) def __eq__ ( self , other ) : return self . x == other . y and self . y == self . y def __hash__ ( self ) : return hash ( ( self . x , self . y ) ) 上面定义了一个二维点的类其中 __repr__ 主要用来以一个字符串表示该类的实例,例如 Point(1,2) ,在调试时打印该点会获得字符串 (1,2) 。 当对两个点的实例进行值的比较时,比如 p1=Point(1,1) p2=Point(1,2) ,判断 p1==p2 时 __eq__() 会被调用,用以判断两个实例是否相等。在上述代码中定义了只要x和y的坐标相同,两个点相等。需要注意, __eq__() 对 is 不生效, == 是比较的值,而 is 比较的是引用,也就是内存地址。举个例子, p1=Point(1,1) p2=Point(1,1) , p1==p2 为