JDK

jdk1.8 HashMap底层数据结构:散列表+链表+红黑树(图解+源码)

别说谁变了你拦得住时间么 提交于 2020-11-23 23:49:40
一、前言   本文由jdk1.8源码整理而得,附自制jdk1.8底层数据结构图,并截取部分源码加以说明结构关系。 二、 jdk1.8 HashMap底层数据结构图    三、源码    1.散列表(Hash table,也叫哈希表): /** * 表,第一次使用时初始化(而非实例化集合时进行初始化),并根据需要调整大小。 当分配时,长度总是2的幂。 (在某些操作中,我们还允许长度为零,以允许当前不需要的引导机制。)    */ transient Node<K,V>[] table;    2.链表: /** * Basic hash bin node, used for most entries. (See below for * TreeNode subclass, and in LinkedHashMap for its Entry subclass.) */ static class Node<K,V> implements Map.Entry<K,V> { final int hash; final K key; V value; Node <K,V> next;      …… }    3.红黑 树: /** * Entry for Tree bins. Extends LinkedHashMap.Entry (which in turn * extends Node

美团面试官问我: ZGC 的 Z 是什么意思

我怕爱的太早我们不能终老 提交于 2020-11-23 23:06:57
> 本文的阅读有一定的门槛,请先了解 GC 的基本只知识。 现代垃圾收集器的演进大部分都是往减少停顿方向发展。 像 CMS 就是分离出一些阶段使得应用线程可以和垃圾回收线程并发,当然还有利用回收线程的并行来减少停顿的时间。 基本上 STW 阶段都是利用多线程并行来减少停顿时间,而并发阶段不会有太多的回收线程工作,这是为了不和应用线程争抢 CPU,反正都并发了慢就慢点(不过还是得考虑内存分配速率)。 而 G1 可以认为是打开了另一个方向的大门: 只回收部分垃圾来减少停顿时间 。 不过为了达到只回收部分 reigon,每个 region 都需要 RememberSet 来记录各 region 之间的引用。这个内存的开销其实还是挺大的,可能会占据整堆的20%或以上。 并且 G1 还有写屏障的开销,虽说用了 logging wtire barrier,但也还是有开销的。 当然 CMS 也用了写屏障,不过逻辑比较简单,啥都没判断就单纯的记录。 其实 G1 相对于 CMS 只有在大堆的场景下才有优势,CMS 比较伤的是 remark 阶段,如果堆太大需要扫描的东西太多。 而 G1 在大堆的时候可以选择部分收集,所以停顿时间有优势。 今天的主角 ZGC 和 G1 一样是基于 reigon 的, 几乎所有阶段都是并发的,整堆扫描,部分收集 。 而且 ZGC 还不分代,就是没分新生代和老年代。

Hbase单机模式环境搭建

落花浮王杯 提交于 2020-11-23 09:46:03
Hbase 单机模式环境搭建 【注】 本文章为笔者2016年期间为北京某高校硕士班编写的Hbase实验课程,现将此分享至CSDN平台,供大家学习。 【实验目的】 学会Hbase单机模式配置 理解环境的配置文件 【实验原理】 Hbase单节点配置是在没有多台计算机节点的情况下,对Hbase的分布式存储和计算进行模拟安装和配置。通过在一台计算机节点上解压Hbase安装压缩包后,然后进行Hbase相关文件进行配置,让Hbase运行在一台机器上并实现对数据存储和计算的测试支持。默认情况下,Hbase运行在单机模式下。在单机模式中,Hbase使用本地文件系统,而不是HDFS。 【实验环境】 本次环境是:centos6.5 + jdk1.7.0_79 工具包在/simple/soft目录下 host01是计算机名称对应ip地址为 192.168.0.131,可以在/etc/hosts文件中查看映射关系 【实验步骤】 一、安装包解压 1.1 查找安装包位置。 进入/simple/soft目录,执行ls命令,发现hbase安装包hbase-0.96.2-hadoop2-bin.tar.gz。如下图1所示。 图1 1.2 解压安装文件到/simple。 执行命令tar -zxvf /simple/soft/hbase-0.96.2-hadoop2-bin.tar.gz,进行安装包解压。如下图2所示。

spring 如何决定使用jdk动态代理和cglib(转)

孤人 提交于 2020-11-23 07:40:32
Spring1.2: 将事务代理工厂[ TransactionProxyFactoryBean] 或 自动代理拦截器[ BeanNameAutoProxyCreator] 的 proxyTargetClass 属性,设置为 true,则使用 CGLIB代理,此属性默认为 false,使用 JDK动态代理. 以下引用 Spring Framework reference 2.0.5: Spring2.0: Spring AOP部分使用JDK动态代理或者CGLIB来为目标对象创建代理。(建议尽量使用JDK的动态代理) 如果被代理的目标对象实现了至少一个接口,则会使用JDK动态代理。所有该目标类型实现的接口都将被代理。若该目标对象没有实现任何接口,则创建一个CGLIB代理。 如果你希望强制使用CGLIB代理,(例如:希望代理目标对象的所有方法,而不只是实现自接口的方法)那也可以。但是需要考虑以下问题: 无法通知(advise)Final 方法,因为他们不能被覆写。 你需要将CGLIB 2二进制发行包放在classpath下面,与之相较JDK本身就提供了动态代理 强制使用CGLIB代理需要将 |aop:config| 的 proxy-target-class 属性设为true: |aop:config proxy-target-class="true"| ... |/aop:config|

2016年第七届蓝桥杯JavaB组省赛试题解析

故事扮演 提交于 2020-11-23 07:19:26
题目及解析如下: 题目大致介绍: 第一题到第三题以及第六题、第七题是结果填空,方法不限只要得到最后结果就行 第四题和第五题是代码填空题,主要考察算法基本功和编程基本功 第八题到第十题是编程题,要求编程解决问题 第一题 煤球数目(结果填空) 此题是一个找规律的题,规律比较好发现,第1层就是1,第二层就是1+2,第三层就是1+2+3,第n层就是1+2+3+、、、+n 但是注意看清楚题意,题目要求的是100层的总共的煤球数,不是求第100层的煤球数! 1 /* 2 有一堆煤球,堆成三角棱锥形。具体: 3 第一层放1个, 4 第二层3个(排列成三角形), 5 第三层6个(排列成三角形), 6 第四层10个(排列成三角形), 7 .... 8 answer: 171700 9 */ 10 public class t1 { 11 private static int f( int n){ // 算第n层有多少个 12 int res = 0 ; 13 for ( int i=1; i<=n; i++ ){ 14 res += i; 15 } 16 17 return res; 18 } 19 20 private static int cal( int n){ 21 int res = 0 ; 22 for ( int i=1; i<=n; i++ ){ 23 res += f(i); 24

死磕Java内部类

大兔子大兔子 提交于 2020-11-23 07:07:00
Java内部类,相信大家都用过,但是多数同学可能对它了解的并不深入,只是靠记忆来完成日常工作,却不能融会贯通,遇到奇葩问题更是难以有思路去解决。这篇文章带大家一起死磕Java内部类的方方面面。 友情提示:这篇文章的讨论基于JDK版本 1.8.0_191 开篇问题 我一直觉得技术是工具,是一定要落地的,要切实解决某些问题的,所以我们通过先抛出问题,然后解决这些问题,在这个过程中来加深理解,最容易有收获。 so,先抛出几个问题。(如果这些问题你早已思考过,答案也了然于胸,那恭喜你,这篇文章可以关掉了)。 为什么需要内部类? 为什么内部类(包括匿名内部类、局部内部类),会持有外部类的引用? 为什么匿名内部类使用到外部类方法中的局部变量时需要是final类型的? 如何创建内部类实例,如何继承内部类? Lambda表达式是如何实现的? 为什么需要内部类? 要回答这个问题,先要弄明白什么是内部类?我们知道Java有三种类型的内部类 普通的内部类 public class Demo { // 普通内部类 public class DemoRunnable implements Runnable { @Override public void run() { } } } 复制代码 匿名内部类 public class Demo { // 匿名内部类 private Runnable

Jenkins与Docker的自动化CI/CD实战

六眼飞鱼酱① 提交于 2020-11-23 06:37:18
在互联网时代,对于每一家公司,软件开发和发布的重要性不言而喻,目前已经形成一套标准的流程,最重要的组成部分就是持续集成(CI)及持续部署、交付(CD)。本文基于Jenkins+Docker+Git实现一套CI自动化发布流程。 一、发布流程设计 工作流程: 开发人员提交代码到Git版本仓库; Jenkins人工/定时触发项目构建; Jenkins拉取代码、代码编码、打包镜像、推送到镜像仓库; Jenkins在Docker主机创建容器并发布。 环境规划如下: | 角色 | IP | | :-------- | ::--------:| | Jenkins/Docker | 192.168.0.217 | | Docker | 192.168.0.218 | | Git/Registry | 192.168.0.219 | 操作系统:CentOS7.4 二、部署Git仓库 # yum install git -y 创建Git用户并设置密码 # useradd git # passwd git 创建仓库 # su - git # mkdir solo.git # cd solo.git # git --bare init 访问创建的这个仓库 # git clone git@192.168.0.212:/home/git/solo.git 三、准备Jenkins环境

Docker之dockerfile制作jdk镜像

妖精的绣舞 提交于 2020-11-23 06:14:23
目的:    Dockerfile 简介    Dockerfile 制作 jdk 镜像 Dockerfile简介     了解dockerfile之前要先了解Docker基本概念和使用可参考: https://www.cnblogs.com/huangting/p/11960196.html    Dockerfile是一个文本文档,文本里面包含了很多命令,每一条命令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。有了 Dockerfile,当我们定义自己额外添加的需求时,只需在 Dockerfile 上添加或者修改指令,重新docker image build即可,省去了敲命令的麻烦。   殷切我们使用Docker时其中的镜像和容器都是基于Dockerfile运行的,所以Dockerfile可以快速定义镜像; 简单来说就如同pom文件去构建maven工程一样 我们来用一张图来康康镜像,容器和Docker之间的关系:   这三者的关系就是 Dockerfile构建镜像,然后运行镜像启动容器。 Dockerfile 基本结构       Dockerfile 由一行行命令语句组成,并支持以 # 开头的注释行。例如:    主体内容分为四部分:      基础镜像信息、 维护者信息、 镜像操作指令和容器启动时执行指令。    基础镜像信息 FROM:

【Dubbo源码阅读系列】之 Dubbo SPI 机制

北城以北 提交于 2020-11-23 05:45:56
最近抽空开始了 Dubbo 源码的阅读之旅,希望可以通过写文章的方式记录和分享自己对 Dubbo 的理解。如果在本文出现一些纰漏或者错误之处,也希望大家不吝指出。 Dubbo SPI 介绍 Java SPI 在阅读本文之前可能需要你对 Java SPI(Service Provider Interface) 机制有过简单的了解。这里简单介绍下:在面向对象的设计中,我们提倡模块之间基于接口编程。不同模块可能会有不同的具体实现,但是为了避免模块的之间的耦合过大,我们需要一种有效的服务(服务实现)发现机制来选择具体模块。SPI 就是这样一种基于接口编程+策略模式+配置文件,同时可供使用者根据自己的实际需要启用/替换模块具体实现的方案。 Dubbo SPI 的改进点 以下内容摘录自 https://dubbo.gitbooks.io/dubbo-dev-book/SPI.html Dubbo 的 扩展点 加载从 JDK 标准的 SPI (Service Provider Interface) 扩展点发现机制加强而来。 JDK 标准的 SPI 会一次性实例化扩展点所有实现,如果有扩展实现初始化很耗时,但如果没用上也加载,会很浪费资源。 如果扩展点加载失败,连扩展点的名称都拿不到了。比如:JDK 标准的 ScriptEngine,通过 getName() 获取脚本类型的名称,但如果

JAVA8之lambda表达式详解及使用

♀尐吖头ヾ 提交于 2020-11-23 05:39:53
原文:https://blog.csdn.net/jinzhencs/article/details/50748202 lambda表达式详解 一.问题 1.什么是lambda表达式? 2.lambda表达式用来干什么的? 3.lambda表达式的优缺点? 4.lambda表达式的使用场景? 5.lambda只是一个语法糖吗? 二.概念 lambda表达式是JAVA8中提供的一种新的特性,它支持JAVA也能进行简单的“函数式编程”。 它是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。 三.先看看效果 先看几个例子: 1.使用lambda表达式实现Runnable package com.lambda; /** * 使用lambda表达式替换Runnable匿名内部类 * @author MingChenchen * */ public class RunableTest { /** * 普通的Runnable */ public static void runSomeThing(){ Runnable runnable = new Runnable() { @Override public void run() { System.out.println("I am