哈希表

JavaSE-day17- 哈希表-HashSet LinkedHashSet

回眸只為那壹抹淺笑 提交于 2019-12-01 13:59:59
哈希表原理: 特点: 此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序(无序的);特别是它不保证该顺序恒久不变。此类允许使用 null 元素 package cn.itcast.p4.hashset.test; import java.util.HashSet; import java.util.Iterator; import cn.itcast.p.bean.Person; /* * 往hashSet集合中存储Person对象。如果姓名和年龄相同,视为同一个人。视为相同元素。 */ public class HashSetTest { /** * @param args */ public static void main(String[] args) { HashSet hs = new HashSet(); /* * HashSet集合数据结构是哈希表,所以存储元素的时候, * 使用的元素的hashCode方法来确定位置,如果位置相同,在通过元素的equals来确定是否相同。 * */ hs.add(new Person("lisi4",24)); hs.add(new Person("lisi7",27)); hs.add(new Person("lisi1",21)); hs.add(new Person(

IPFS技术浅析

[亡魂溺海] 提交于 2019-12-01 12:15:44
一、IPFS是什么? 星际文件系统IPFS(Inter-Planetary File System)是一个面向全球的、点对点的分布式版本文件系统,致力于创建持久且分布式存储和共享文件的网络传输协议。目标是为了补充(甚至是取代)目前统治互联网的超文本传输协议(HTTP),将所有具有相同文件系统的计算设备连接在一起。 简单来说IPFS是一个可以永远存在的、由多个节点组成且没有中心化的文件存储和共享系统。 二、IPFS的起源 IPFS是一个开放源代码项目,在2014年开始由Protocol Labs在开源社区的帮助下发展。其最初由Juan Benet设计,他建立实验室开发IPFS初衷正是为了通过设计一个协议建立更加安全、高效、开放的网络。他进入斯坦福大学后,学习计算机技术方面的知识,从事对分布式存储网络技术的研究开发。 三、IPFS原理 原理用基于内容的地址替代基于域名的地址,也就是用户寻找的不是某个地址而是储存在某个地方的内容,不需要验证发送者的身份,而只需要验证内容的哈希,通过这样可以让网页的速度更快、更安全、更健壮、更持久。 IPFS中文件通常不会都存在.一个节点上,.而是分片存在其他一些子节点上。提取.文件时IPFS把这些节点列表全部并行抓取,最后在本地拼成完整的.文件。并行的速度远远大于直接下载完整⽂文件的速度,用户很快就能在本地获得文件,还可以继续分享给其他人

重新认识Java 8的HashMap

瘦欲@ 提交于 2019-12-01 11:46:32
【转自】 美团技术博客 HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。随着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等。本文结合JDK1.7和JDK1.8的区别,深入探讨HashMap的结构实现和功能原理。 Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap,类继承关系如下图所示: 下面针对各个实现类的特点做一些说明: (1) HashMap:它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。 HashMap最多只允许一条记录的键为null,允许多条记录的值为null。HashMap非线程安全,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致。如果需要满足线程安全,可以用 Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap。 (2) Hashtable:Hashtable是遗留类,很多映射的常用功能与HashMap类似

比特币里的计算机知识

[亡魂溺海] 提交于 2019-12-01 10:24:56
比特币里的计算机知识 一、人民币、支付宝和比特币有什么区别 (1)人民币 大家都很清楚,人民币就是中国人民银行发行的货币。这些货币流通到市场中,每个人有了钱以后可以去购买各种商品和服务,人民币就会从一个人手里转到另外一个人手里。钱流通到市场中后,具体某一个编号的纸币在某个特定的时候在谁身上是不确定的,国家也不关心。纸币在实际中是很难复制的,复制成本高、风险也很大。 (2)支付宝 支付宝,当然包括微信,里面的余额说白了就是一个数据,存储在支付宝和微信公司的服务器上。同人民币不同,数据的复制、修改是不需要成本的。这些电子货币在市场上是怎样运行的?以支付宝为例,首先你要申请一个支付宝账户,然后关联一张银行卡,这样你就可以把支付宝中的钱转出到银行卡或者将银行卡的钱充值到支付宝中。当你消费时利用支付宝付款或者营收通过支付宝收款时,对方也必须要有一个支付宝账号,这样付多少钱实际上是从你的支付宝账号上扣款,给对方支付宝账户加钱。 这其中涉及到两个方面的数据变动。一是和银行相关:支付宝在各大银行都开了一个账号,个人在用银行卡往自己的支付宝账号充值或者提现,实际上是银行中支付宝那个大账号和你的账号之间的存款变动。当然支付宝公司会将你支付宝账号上的数值进行相应的变动。二是和银行无关,支付宝内部数据转换。当你和对方之间一个用支付宝进行付钱、另一个进行收钱,这个时候就跟银行没有关系

redis相关命令

狂风中的少年 提交于 2019-12-01 10:16:19
redis相关命令详解 1 常用命令 keys * :获取所有的keys select 0 :选择第一个库 move key dbindex :将当前的key移动到某个数据库,目标库有,则不能移动 。 flushdb :清除数据库 randomkey :从当前数据库随机返回 type key :查看key的类型 del key :删除key exists key 判断是否存在key expire key 10 :10秒过期 ttl key :查看还有多少秒过期 ,-1表示永不过期,-2表示已经过期 persist key :删除过期的时间 2 String类型相关命令 set key value get key getrange key start end 字符串分段 0-1是全部 0 -2 == n-1 getset key newvalue 设置值,返回旧值 mset key1 key2 批量设置 mget key1 key2 批量获取 setnx key value 不存在就插入 setrange key index value 从index开始替换value incr key :key对应的value+1 前提是value是integer类型的数据 incrby key number :递增number decr key 递减 decrby key number

算法题------两数求和

六眼飞鱼酱① 提交于 2019-12-01 10:02:48
题目描述: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 示例: 给定 nums = [2, 7, 11, 15], target = 9;因为 nums[0] + nums[1] = 2 + 7 = 9,所以返回 [0, 1]。 Java解法: 方法一:暴力法 暴力法很简单,遍历每个元素 xx,并查找是否存在一个值与 target - x相等的目标元素。 class Solution { public int[] twoSum(int[] nums, int target) { for (int i = 0; i < nums.length; i++) { for (int j = i + 1; j < nums.length; j++) { if (nums[j] == target - nums[i]) { return new int[] { i, j }; } } } throw new IllegalArgumentException("No two sum solution"); } } 复杂度分析: 时间复杂度:O(n^2), 对于每个元素,我们试图通过遍历数组的其余部分来寻找它所对应的目标元素,这将耗费 O

1124. 表现良好的最长时间段

夙愿已清 提交于 2019-12-01 09:54:50
题意: 给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。 我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。 所谓「表现良好的时间段」,意味在这段时间内,「劳累的天数」是严格 大于「不劳累的天数」。 请你返回「表现良好时间段」的最大长度。 示例 1: 输入:hours = [9,9,6,0,6,6,9] 输出:3 解释:最长的表现良好时间段是 [9,9,6]。 提示: 1 <= hours.length <= 10000 0 <= hours[i] <= 1 题解: 方法1.(o(n)) 贪心,哈希表 大于8的记为1,小于等于1的记为-1;用哈希表维护一些前缀和的位置;从开头遍历数组,如果sum>0,答案更新为i+1,否则在哈希表中查找有没有sum-1的记录,如果有则更新ans=max(ans,i-visit[sum-1]),如果没有sum的记录,则新增 visit[sum]=i; 代码: class Solution { public: int longestWPI(vector<int>& hours) { int n=hours.size(); int sum=0,ans=0; unordered_map<int,int>visit; for(int i=0;i<n;i++) { sum+=(hours[i]>8?1:

Redis shell

流过昼夜 提交于 2019-12-01 08:56:54
Redis的使用 Redis key 值是二进制安全的, 可以用任何二进制序列作为key值, 无论是简单字符串还是JPEG文件的内容皆可。空字符串也是有效key值。 切换数据库 select databaseid 选中数据库 (redis 默认有16个实例库, 0~15, 登录时默认库0) Key操作 KEYS pattern 查找所有符合给定模式 pattern 的 key EXISTS key 检查给定 key 是否存在 EXPIRE key seconds 给key设置生命周期, 当key过期时会被自动删除 MOVE key db 将当前数据库的 key 移动到给定的数据库 db 中 如果源数据库和目标数据库有相同的key, 或 key 不存在于当前数据库, 那么 MOVE 无效 TTL key 以秒为单位, 返回给定key的剩余存活时间(保留时间) TYPE key 返回 key 所存储的值的类型 DEL key [key ...] 删除给定的一个或多个key。 不存在的 key 会被 忽略 练习: # exercise 127.0.0.1:6379> select 1 OK 127.0.0.1:6379[1]> exists ronnie (integer) 0 127.0.0.1:6379[1]> set ronnie yuan OK 127.0.0.1:6379[1]

HashMap

时光总嘲笑我的痴心妄想 提交于 2019-12-01 08:09:14
HashMap实现了Map接口,并继承 AbstractMap 抽象类,其中 Map 接口定义了键值映射规则。AbstractMap 抽象类提供了 Map 接口的骨干实现,以最大限度地减少实现Map接口所需的工作。 public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable{ ... } 初始容量 和 负载因子,这两个参数是影响HashMap性能的重要参数。其中,容量表示哈希表中桶的数量 (table 数组的大小),初始容量是创建哈希表时桶的数量;负载因子是哈希表在其容量自动增加之前可以达到多满的一种尺度,它衡量的是一个散列表的空间的使用程度,负载因子越大表示散列表的装填程度越高,反之愈小。 哈希的相关概念    Hash 就是把任意长度的输入(又叫做预映射, pre-image),通过哈希算法,变换成固定长度的输出(通常是整型),该输出就是哈希值。 这种转换是一种 压缩映射 ,也就是说,散列值的空间通常远小于输入的空间。不同的输入可能会散列成相同的输出,从而不可能从散列值来唯一的确定输入值。简单的说,就是一种将任意长度的消息压缩到某一固定长度的息摘要函数。 1 /** 2 * Constructs an empty HashMap with the

Hbase扩展

半世苍凉 提交于 2019-12-01 07:24:47
1 HBase在商业项目中的能力 每天: 1) 消息量:发送和接收的消息数超过60亿 2) 将近1000亿条数据的读写 3) 高峰期每秒150万左右操作 4) 整体读取数据占有约55%,写入占有45% 5) 超过2PB的数据,涉及冗余共6PB数据 6) 数据每月大概增长300千兆字节。 2 布隆过滤器 在日常生活中,包括在设计计算机软件时,我们经常要判断一个元素是否在一个集合中。比如在字处理软件中,需要检查一个英语单词是否拼写正确(也就是要判断它是否在已知的字典中);在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上;在网络爬虫里,一个网址是否被访问过等等。最直接的方法就是将集合中全部的元素存在计算机中,遇到一个新元素时,将它和集合中的元素直接比较即可。一般来讲,计算机中的集合是用哈希表(hash table)来存储的。它的好处是快速准确,缺点是费存储空间。当集合比较小时,这个问题不显著,但是当集合巨大时,哈希表存储效率低的问题就显现出来了。比如说,一个像 Yahoo,Hotmail 和 Gmai 那样的公众电子邮件(email)提供商,总是需要过滤来自发送垃圾邮件的人(spamer)的垃圾邮件。一个办法就是记录下那些发垃圾邮件的 email 地址。由于那些发送者不停地在注册新的地址,全世界少说也有几十亿个发垃圾邮件的地址,将他们都存起来则需要大量的网络服务器。如果用哈希表