哈希表

Object有哪些方法

不打扰是莪最后的温柔 提交于 2019-12-16 23:43:25
object类的一些常用方法: 1 public final Class<?> getClass() 获取当期运行时的类。 public int hashCode() 返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。 hashCode 的常规协定是: 在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。 如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。 如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法 不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。 实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 Java TM 编程语言不需要这种实现技巧。) public boolean

collection(list,set,map)集合详解

本小妞迷上赌 提交于 2019-12-16 21:06:56
一:java集合的体系结构如下: Java集合大致分为Set、List、Queue、Map四个体系 。Collection: List和Set,Queue继承自Collection接口。 |--List: |--ArrayList |--Vector |--LinkedList |--Set: |--HashSet |--TreeSet |--LinkedHashSet |--Queue: 队列集合,有PriorityQueue类 List:有序且允许元素重复。ArrayList、LinkedList和Vector是三个主要的实现类。 Set:不允许元素重复。HashSet和TreeSet是两个主要的实现类。 Map:也属于集合系统,前两个继承至collection接口,Map为独立接口。Map是key对value的映射集合,其中key列就是一个集合。key不能重复,但是value可以重复。HashMap、Hashtable,TreeMap,LinkedHashMap前三个主要的实现类。 TreeMap是有序的,HashMap和HashTable是无序的。 Hashtable的方法是同步的,HashMap的方法不是同步的。这是两者最主要的区别。 Collection的功能概述: A:添加功能:boolean add(E e)确保此 collection 包含指定的元素(可选操作)。

001. Two Sum

血红的双手。 提交于 2019-12-16 17:55:43
题目: Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would have exactly one solution, and you may not use the same element twice. Example: Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1]. 题意: 给定一个整数数组 nums 和一个目标值 target ,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 Solution: 方法一:暴力法 Java: 1 public int[] twoSum(int[] nums, int target) { 2 for (int i = 0; i < nums.length; i++) { 3 for (int j = i + 1; j < nums.length; j++) { 4 if (nums

集合

陌路散爱 提交于 2019-12-16 11:20:44
集合 什么是集合 集合(Collection)类是专门用于数据存储和检索的类。这些类提供了对栈(stack)、队列(queue)、列表(list) 和哈希表(hash table)的支持。大多数集合类实现了相同的接口 集合(Collection)类服务于不同的目的,如为元素动态分配内存,基于索引访问列表项等等。这些类创建Object类的对象的集合。在C#中,Object类是所有数据类型的基类 数组是一组有顺序的列表项,集合也是一组有顺序的列表项 数组的大小是固定的,集合大小的动态分配的 常用的集合类 类 描述和用法 动态数组 (Array List) 它代表了可被单独索引的对象的有序集合。它基本上可以替代一个数组。但是,与数组不同的是,您可以使用索引在指定的位置添加和移除项目,动态数组会自动重新调整它的大小。它也允许在列表中进行动态内存分配、增加、搜索、排序各项。 哈希表 (Hasht able) 它使用键来访问集合中的元素。当您使用键访问元素时,则使用哈希表,而且您可以识别一个有用的键值。哈希表中的每一项都有一个键/值对。键用于访问集合中的项目。 排序列表 (Sorte dList) 它可以使用键和索引来访问列表中的项。排序列表是数组和哈希表的组合。它包含一个可使用键或索引访问 各项的列表。如果您使用索引访问各项,则它是一个动态数组(ArrayList),如果您使用键访问各项,则

哈希情史知多少

感情迁移 提交于 2019-12-16 10:49:04
——日拱一卒,不期而至! 简介 hash是我们工作中经常听到的词,比如哈希表、哈希函数、hashCode、HashTable、HashMap等等,那么它们之间到底有怎样的爱恨情仇呢?来一起看一看吧~~ 数组 讲哈希表之前,我们先来看看数据结构的鼻祖——数组。 数组比较简单,我就不多说了,大家都会都懂,见下图。 数组的下标一般从0开始,依次往后存储元素,查找元素也是一样,只能从头(或从尾)依次查找元素。 比如,要查找4这个元素,从头开始查找的话需要查找3次,从尾的话也需要2次。 早期的哈希表 上面讲了数组的缺点,查找某个元素只能从头或者从尾依次查找元素,直到匹配为止,它的均衡时间复杂是O(n)。 那么,利用数组有没有什么方法可以快速的查找元素呢? 聪明的程序员哥哥们想到一种方法,通过哈希函数计算元素的值,用这个值确定元素在数组中的位置,这样时间复杂度就能缩短到O(1)了。 比如,有5个元素分别为3、5、4、1,把它们放入到数组之前先通过哈希函数计算位置,精确放置,而不是像简单数组那样依次放置元素。 假如,这里申请的数组长度为8,我们可以造这么一个哈希函数为hash(x) = x % 8,那么最后的元素就变成了下图这样: 这时候我们再查找4这个元素,先算一下它的hash值为hash(4) = 4 % 8 = 4,所以直接返回4号位置的元素就可以了。 进化的哈希表 事情看着挺完美,但是

手写HashMap底层(源码)

╄→尐↘猪︶ㄣ 提交于 2019-12-16 05:15:51
底层结构: 在手写HashMap的时候,需要首先弄清楚HashMap底层结构实现原理。HashMap底层采用哈希表实现,其中哈希表相当于“数组+链表”的结构。其结构示意图如下: 采用哈希表实现HashMap的时候,需要首先弄清楚其存储流程。首先创建Entry节点的结构,并且创建指定长度的数组;其次根据哈希函数计算的哈希值确定节点在数组中的存储位置,最后判断数组指定位置是否已有其他节点,并在链表的尾部添加新的节点。其存储流程示意图如下: 源码: Entry类: package cn.csu.hashmap; public class Entry { private int hash; private Object key; private Object value; private Entry next; public Entry() { } public Entry(int hash, Object key, Object value, Entry next) { super(); this.hash = hash; this.key = key; this.value = value; this.next = next; } public int getHash() { return hash; } public void setHash(int hash) { this

Mysql索引

≡放荡痞女 提交于 2019-12-15 14:07:02
简介 一句话简单来说,索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。一本500页的书,如果你想快速找到其中的某一个知识点,在不借助目录的情况下,那我估计你可得找一会儿。同样,对于数据库的表而言,索引其实就是它的“目录”。 索引的常见模型 哈希表 :哈希表是一种以键-值(key-value)存储数据的结构。处理冲突的方式:链表 特点: 哈希表适用于等值查询的场景,但是在区间查询的速度很慢(因为hash不是有序的) 有序数组 :有序数组在等值查询和范围场景查询中的性能都非常优秀。 缺点: 有序数组只适用于静态存储引擎。在需要更新数据的时候就麻烦了,你往中间插入一个记录就必须得挪动后面所有的记录,成本太高。 二叉搜索树 :每个节点的左儿子小于父节点,父节点又小于右儿子。 你可以想象一下一棵100万节点的平衡二叉树,树高20。一次查询可能需要访问20个数据块。在机械硬盘时代,从磁盘随机读一个数据块需要10 ms左右的寻址时间。也就是说,对于一个100万行的表,如果使用二叉树来存储,单独访问一个行可能需要20个10 ms的时间,这个查询可真够慢的。 为了让一个查询尽量少地读磁盘,就必须让查询过程访问尽量少的数据块。那么,我们就不应该使用二叉树,而是要使用“N叉”树。这里,“N叉”树中的“N”取决于数据块的大小。 InnoDB的索引模型 InnoDB使用了B+树索引模型

ConcurrentHashMap的实现原理(JDK1.7和JDK1.8)

☆樱花仙子☆ 提交于 2019-12-15 07:14:37
哈希表 1.介绍 哈希表就是一种以 键-值(key-indexed) 存储数据的结构,我们只要输入待查找的值即key,即可查找到其对应的值。 哈希的思路很简单,如果所有的键都是整数,那么就可以使用一个简单的无序数组来实现:将键作为索引,值即为其对应的值,这样就可以快速访问任意键的值。这是对于简单的键的情况,我们将其扩展到可以处理更加复杂的类型的键。 2.链式哈希表 链式哈希表从根本上说是由一组链表构成。每个链表都可以看做是一个“桶”,我们将所有的元素通过散列的方式放到具体的不同的桶中。插入元素时,首先将其键传入一个哈希函数(该过程称为哈希键),函数通过散列的方式告知元素属于哪个“桶”,然后在相应的链表头插入元素。查找或删除元素时,用同们的方式先找到元素的“桶”,然后遍历相应的链表,直到发现我们想要的元素。因为每个“桶”都是一个链表,所以链式哈希表并不限制包含元素的个数。然而,如果表变得太大,它的性能将会降低。 3.应用场景 我们熟知的缓存技术(比如redis、memcached)的核心其实就是在内存中维护一张巨大的哈希表,还有大家熟知的HashMap、CurrentHashMap等的应用。 ConcurrentHashMap与HashMap等的区别 1.HashMap 我们知道HashMap是线程不安全的,在多线程环境下,使用Hashmap进行put操作会引起死循环

可扩充散列、可扩充哈希、可扩展散列、可扩展哈希 (Extendable Hashing)

走远了吗. 提交于 2019-12-15 05:21:47
文章目录 1.背景知识 2.图解可扩充散列 3.可扩充散列的代码实现 1.背景知识 不知道,大家听没听说过” 知识图谱 “? 嘿嘿,没听说过也不要紧,但你一定听说过” 思维导图 “吧? ”知识图谱“实际上是用图的形式把知识体系描绘出来,以梳理知识与知识之间的关联。 这里给出一个知识图谱的图片 ” 知识图谱 “现已被广泛应用于各个领域,包括 人工智能 领域。 为什么有”知识图谱“的产生? 尤其是现在,处于一个知识和信息大爆炸的时代,以往积聚了大量的知识,而新的知识又在不断地产生。这些知识有的杂乱无章,有些拥有内在联系。如何对知识进行梳理和管理?”知识图谱“就是来做这件事情的。让知识形成体系,挖掘知识之间的内在联系。 我们来谈 可扩展散列 时,同样按照这种思路:首先,我们不是要搞懂”什么是可扩展散列“,而是要明白”可扩展散列是要解决什么问题“ ”可扩展散列在它所处的知识体系中处于什么位置“。 可扩展散列 (Extendable Hashing)是动态散列(Dynamic Hashing)的一种,动态散列有两种常见的实现方式:可扩展散列 (Extendable Hashing)和线性散列(Linear hashing )。而与”动态散列“相对应的概念是”静态散列“(Static Hashing)。 不管是静态散列还是动态散列,都是Hash在索引上的运用( Hashing can be

【算法笔记】散列表(上)

こ雲淡風輕ζ 提交于 2019-12-15 03:35:20
散列表(上) 1.如何理解散列思想? 2.有哪些散列函数? 1 散列函数的定义 2 散列函数设计的基本要求 3.散列冲突的解决方法是什么? 1. 开放寻址法 2 链表法 4 Word 文档中单词拼写检查功能是如何实现的? 5. 总结 1.如何理解散列思想? 散列表的英文叫“Hash Table”,我们平时也叫它“哈希表”或者“Hash 表”; 散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。可以说,如果没有数组,就没有散列表。 散列表使用的是数组支持按照下标随机访问的时候,时间复杂度是O(1)的特性; 通过散列函数把元素的键值映射为下标,然后将数据存储在数组中对应的下标的位置; 当按照键值查询元素的时候,用同样的散列函数,间键值转化为数组下标,从对应的数组下标的位置取数据; 2.有哪些散列函数? 1 散列函数的定义 散列函数在散列表中起着非常关键的作用。 散列函数,顾名思义,它是一个函数。可以把它定义成 hash(key),其中 key 表示元素的键值,hash(key) 的值表示经过散列函数计算得到的散列值。 2 散列函数设计的基本要求 散列函数计算得到的散列值是一个非负整数; 如果 key1 = key2,那 hash(key1) == hash(key2); 如果 key1 ≠ key2,那 hash(key1) ≠ hash