HashMap核心功能源码解读(二):哈希函数
如无特别说明,本文源码基于 JDK 1.8 进行解读。 从 HashMap 的源码中的 get(Object key) 和 put(K key, V value) 两个基本操作方法中,我们可以发现,要从一个 HashMap 中获取某个 key 对应的哈希桶位置,需要先通过 hash(Object key) 方法计算出 hash 值,再通过位运算 (n - 1) & hash 得出哈希桶位置。 相关源码如下(这里以 get(Object key) 方法为入口): 123456789101112131415161718192021222324252627282930313233// 获取 key 的哈希值static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);}// 获取 key 对应的值public V get(Object key) { ...
HashMap核心功能源码解读(一):概述
在开始分析 HashMap 核心源码之前,本文先试着从使用的角度对其进行解读,包括 HashMap 特性、如何正确使用,以及影响 Map 性能的因素等。 HashMap特性HashMap 是 Map 接口的一个基于哈希表实现,主要用来存储键值对数据。作为一个使用频率较高的集合类,了解它的特性有助于我们在实践中正确使用它。 首先,HashMap 允许键为 null 和值为 null。 其次,HashMap 不保证 Map 的有序性,即不保证遍历 HashMap 输出元素的顺序与其插入的顺序相同(可能存在顺序相同情况)。另外,HashMap 也不保证其顺序在一段时间内保持不变。如果需要在项目中保证 Map 有序性的话,可以使用 LinkedHashMap 代替 HashMap。 再次,HashMap 是不同步的,即 HashMap 不是线程安全的。如果多个线程同时访问同一个 HashMap 实例,并且其中至少有一个线程从结构上修改了 HashMap 实例时,会导致数据不一致的情况发生。这里的“从结构上修改”是指对 HashMap...
毛泽东:体育之研究
前 言国力苶弱,武风不振,民族之体质,日趋轻细。此甚可忧之现象也。提倡之者,不得其本,久而无效。长是不改,弱且加甚。夫命中致远,外部之事,结果之事也。体力充实,内部之事,原因之事也。体不坚实,则见兵而畏之,何有于命中,何有于致远?坚实在于锻炼。锻炼在于自觉。今之提倡者,非不设种种之方法,然而无效者,外力不足以动其心,不知何为体育之真义。体育果有如何之价值,效果云何,著手何处,皆茫乎如在雾中,其无效亦宜。欲图体育之效,非动其主观,促其对体育之自觉不可。苟自觉矣,则体育之条目,可不言而自知,命中致远之效,亦当不求而自至矣。不佞深感体育之要,伤提倡者之不得其当,知海内同志,同此病而相怜者必多。不自惭赧,贡其愚见,以资商榷。所言并非皆己实行,尚多空言理想之处,不敢为欺。倘辱不遗,赐之教诲,所虚心百拜者也。 第一 ...
具有产品思维的工程师具备什么特点,如何才能变得更加具有产品思维?
近日在网上读到一篇标题为《The Product-Minded Software Engineer》的文章,该文讲述了具有产品思维的软件工程师都具备哪些特点,在文末也给出了如何成为具有产品思维的软件工程师的秘诀。读完很有感触,身处现如今的互联网环境,工程师如果还只专注于技术,未免有些狭隘。毕竟工程师的价值并不只体现在技术层面上,还应体现在产品、商业等层面上。 文章很好,于是就把它翻译了出来,以期大家一起学习探讨,共同提高。 具有产品思维的工程师是指那些对产品本身非常感兴趣的开发人员。他们会想去了解每个产品决策背后的原因,以及用户如何使用他们的产品,同时他们也乐于参与产品决策。如果他们决定放弃工程的乐趣(即放弃从事工程师工作),他们很可能会成为一名优秀的产品经理。我曾经与许多具有产品思维的优秀工程师一起工作,并认为自己也是这样的开发人员。在开发世界级产品的公司中,具有产品思维的工程师能把团队的影响力提升到一个新的水平。 Atlassian 公司的产品经理 Sherif Mansour...
袁隆平:我的两个梦
...
李大钊:青春
《青春》一文,是反袁护国运动兴起以后,李大钊于1916年3至4月在日本所写的一篇理论文章,发表于同年9月出版的《新青年》第2卷第1号。这是他在《新青年》发表的第一篇论文。在《青春》中,李大钊系统地阐述了他对宇宙、对人生、对国家和民族前途的看法,歌颂了积极进取、乐观向上的革命精神,提出了“青春”的宇宙观和人生观。概括而言,主要有以下四点:一,宇宙无尽,青春无尽,天地老而青春永在。二,国家与民族是青春还是白首,取决于青年是否自觉,主张青年自觉方有青春。在此基础上,提出了“青春”的人生观,即积极进取的人生观。三,...
Elasticsearch倒排索引简介
什么是倒排索引倒排索引(Inverted index,亦称反向索引),是一种索引方法,用来存储在全文搜索下某个单词在某一个文档或某一组文档中的存储位置的映射。 倒排索引的数据结构倒排索引是文档检索系统中最常用的一种数据据构。它包含两部分——单词词典(Term Dictionary)和倒排列表(Posting List)。 其中,单词词典是用来记录所有文档的单词,记录单词到倒排列表的关系,所以单词词典一般也会比较大,为满足快速地插入与查询,通常采用 B+ 树或者哈希链表法来实现。 而倒排列表是用来记录单词对应的文档结合,由倒排索引项(Posting)组成。 倒排索引项结构主要包括以下四项内容: 文档ID; 词频(TF)——该单词在文档中的出现次数,用于相关性评分; 位置(Position)——单词在文档中分词的位置,用于语句搜索(Phrase Query); 偏移(Offset)——记录单词的开始、结束位置,用于高亮显示。 倒排索引项结构示例: Document...
使用Homebrew在macOS上安装Elasticsearch
在 macOS 上通过 Homwbrew 安装 Elasticsearch 非常简单,首先通过 brew tap 命令关联 Elastic Homebrew 存储库: 1brew tap elastic/tap 接下来就可以使用 brew install 命令安装最新发布的 Elasticsearch 的默认发行版: 1brew install elastic/tap/elasticsearch-full 如果你看到类似以下的输出内容,就表示安装成功: 1Pruned 0 symbolic links and 3 directories from /usr/local 通过 brew 安装的 Elasticsearch,其配置文件,日志和数据目录存储在以下位置: HOME(主目录),位于 /usr/local/Cellar/elasticsearch-full/7.8.1/; bin (可执行文件所在目录)位于 ll /usr/local/Cellar/elasticsearch-full/7.8.1/bin; config(配置文件)位于...
使用Java将List<String>元素按指定分隔符连接成字符串
在日常开发工作中,经常会遇到需要将 List<String> 转换为使用某个符号连接的字符串。如将 List<String> 转换为按英文逗号(,)分隔的字符串: 123456789101112List<String> weekList = Arrays.asList( "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" );// 将 weekList 输出转换为按英文逗号(,)分隔的字符串://...
在macOS编译JDK14
一、系统环境操作系统:macOS 10.15.4(Catalina) 处理器:2.6 GHz 双核Intel Core i5 内存:8G 硬盘:512G NOTE: 在 macOS 平台编译 OpenJDK 14,操作系统版本官方建议至少使用 Mac OS X 10.13(High Sierra),可用磁盘空间建议至少 6 GB。 二、准备工作2.1 Boot JDK矛盾的是,为了编译 OpenJDK,我们需要预先安装一个版本的 JDK,官方称这个 JDK 为 Boot JDK,即引导 JDK。 何为 Boot JDK我们知道,OpenJDK 源码由多个部分组成,包括 HotSpot、JDK 类库、JAXP 等。其中一部分的代码是使用 C/C++ 编写的,如 HotSpot;而更多的代码其实是使用 Java 实现的,如我们熟知的 JDK 类库。编译这些 Java 代码就需要用到另一个已经编译的 JDK,官方称这个 JDK 为 Bootstrap JDK,即引导 JDK,作用是编译 OpenJDK 源码中 Java 代码。 如何选择 Boot JDK...
CentOS7 系统中,如何禁止Linux系统用户通过SSH登录服务器?
出于安全考虑,有时候我们会禁止系统上的某些用户使用 ssh 命令登录服务器。例如,用于启动 MongoDB 服务的用户 mongod,就不允许通过 ssh 命令进行登录。在 CentOS 7 系统中,可以通过修改配置文件 /etc/ssh/sshd_config 达到禁用的目的。 一、单个用户这里以禁用 mongod 用户为例,具体步骤如下: 打开配置文件 /etc/ssh/sshd_config, 1vim /etc/ssh/sshd_config 在文件末尾加入以下内容,只允许后面的用户使用 ssh 命令登陆, 1DenyUsers mongod 保存文件修改,并退出,重启 ssh 服务,即可禁用 mongod 用户通过 ssh 命令登陆。 1service sshd restart 二、多个用户若需要禁用多个系统帐户使用 ssh 命令登陆服务器,只需把系统账户名追加在 DenyUsers 行尾,并以空格隔开即可,如禁用 mongod、kafka、robbot 三个用户: 1DenyUsers mongod kafka...
Apache Kafka(二):CentOS 7下安装Apache Kafka
系统要求Kafka 服务端代码是用 Scala 开发语言编写的,Scala 是 JVM 系语言中的一种,这意味着用 Scala 编写的源代码编译之后也是 Java 字节码,并运行在 Java 虚拟机上。因此,在开始安装 Kafka 之前,我们需要先在系统上安装 JDK(Java SE Development Kit, Java SE开发套件),JDK 包含的 JRE(Java SE Runtime Environment,Java 运行时环境)是运行 Java 应用程序所必需的。 多数情况下,推荐安装 JDK 8 及以上的版本,因为 Kafka 自 2.0.0 版本开始,就已经正式摒弃对 Java 7 的支持了。本文安装示例采用的是 JDK 8 版本。 在 CentOS 7 安装 JDK 可参考这篇博文—— CentOS7下安装JDK1.8 另外,运行 Kafka 还需要安装 Apache ZooKeeper 服务,该服务是用来同步分布式进程。ZooKeeper 安装可参考这篇博文——在CentOS7系统安装和配置ZooKeeper。 安装Kafka推荐将 Kafka 安装在...
Apache Kafka(一):简介
Kafka简介Kafka 最早是由 LinkedIn 公司开发的一套分布式的高性能消息引擎服务,于 2011 年初开源,并于 2012 年 10 月 23 日从 Apache 孵化器毕业,成为 Apache 的顶级项目。 Kafka 最初的设计目的是用于处理海量的日志,后来历经多年发展和完善,如今的 Kafka 集消息系统、存储系统和流式处理平台于一身,在消息引擎领域是执牛耳者,在大数据工程领域、流计算领域也起着举足轻重的作用,具有非常广阔的应用场景。 为什么要掌握Kafka因为掌握了 Kafka,手上就多了一份拿高薪的筹码。 援引美国 2019 年 Dice 技术薪资报告中的数据,在十大薪资最高的技术技能中,掌握 Kafka 以平均每年 12.7554 万美元排名第二!虽然这是美国人才市场的数据,但从国内互联网公司的技术招聘需求中,我们也可以看出 Kafka...
通过yum方式在CentOS7系统安装MySQL8
一、添加 MySQL YUM 源根据自己的操作系统版本选择合适的安装源(https://dev.mysql.com/downloads/repo/yum/),这里选择的是 CentOS 7,MySQL 8。点击 Download 按钮,进入下载页。可以直接下载 rpm 文件,再上传到 CentOS 7 系统,也可以通过复制链接地址(地址为:https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm),进入 CentOS 7 系统,通过 wget 命令下载。 这里以进入 CentOS 7 系统,通过 wget 命令下载为例,展示如何添加 MySQL yum 源,相关命令如下: 12345678# 进入存放 rpm 文件的目录$ cd /homw/software# 下载 rpm 文件$ wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm# 通过 rpm -Uvh 安装$ sudo rpm -Uvh...
Spring Boot 2.x 集成Jpa示例
一、如何集成首先,在 pom 文件新增 redis 依赖: 1234<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency> 接着修改项目配置文件 application.properties,增加 redis 配置 1234# redis hostspring.redis.host=172.24.58.226# redis portspring.redis.port=6379 经过上面简单的两步,即可在项目中使用 StringRedisTemplate 和 RedisTemplate<Object,Object>,因为从 Spring Boot 2.0 开始,Spring...
Spring Boot 2.x 集成Redis示例
一、如何集成首先,在 pom 文件新增 redis 依赖: 1234<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency> 接着修改项目配置文件 application.properties,增加 redis 配置 1234# redis hostspring.redis.host=172.24.58.226# redis portspring.redis.port=6379 经过上面简单的两步,即可在项目中使用 StringRedisTemplate 和 RedisTemplate<Object,Object>,因为从 Spring Boot 2.0 开始,Spring...
在CentOS7系统安装和配置ZooKeeper
安装步骤 下载安装包,命令如下, 1wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.5.6/apache-zookeeper-3.5.6-bin.tar.gz 输出结果: 12345678910111213# 当前目录为 /home/software[jump@205 software]$ wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.5.6/apache-zookeeper-3.5.6-bin.tar.gz--2019-12-12 16:43:27-- http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.5.6/apache-zookeeper-3.5.6-bin.tar.gzResolving mirror.bit.edu.cn (mirror.bit.edu.cn)... 219.143.204.117, 202.204.80.77,...
【ZooKeeper启动失败】Error: Could not find or load main class org.apache.zookeeper.server.quorum.QuorumPeerMain
在 CentOS 7 系统中安装好 ZooKeeper 后,进入安装目录 /usr/local/zookeeper/apache-zookeeper-3.5.6/bin/,使用命令 ./zkServer.sh start 启动,发现启动失败: 1234[zookeeperu@202 bin]$ ./zkServer.sh startZooKeeper JMX enabled by defaultUsing config: /usr/local/zookeeper/apache-zookeeper-3.5.6/bin/../conf/zoo.cfgStarting zookeeper ... FAILED TO START 进入目录 /usr/local/zookeeper/apache-zookeeper-3.5.6/logs,查看日志文件: 12[zookeeperu@202 bin]$ cd /usr/local/zookeeper/apache-zookeeper-3.5.6/logs[zookeeperu@202 bin]$ vim...
关于MySQL数据库自增主键,说几个容易被忽略的点
自增主键是什么自增主键是指在自增列上定义的主键。自增主键可以让主键索引尽量地保持递增顺序插入,避免了页分裂,索引也更紧凑。 在建表语句中一般是这么定义的: 1NOT NULL PRIMARY KEY AUTO_INCREMENT 如: 12345CREATE TABLE `t` ( `id` int(11) NOT NULL AUTO_INCREMENT, `step` int(11) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB; 自增值保存在哪里不同的数据库引擎对于自增值的保存策略不同: MyISAM 引擎:自增值保存在数据文件中; InnoDB引擎: 在 MySQL 5.7 及之前的版本,自增值保存在内存里,并没有持久化。每次重启后,第一次打开表的时候,都会去找自增值的最大值 max(id),然后将 max(id)+1 作为这个表当前的自增值。 在 MySQL 8.0 版本,将自增值的变更记录在了 redo log 中,重启的时候依靠 redo log...