Chuenhung的个人网站

chuenhung.github.io

HashMap的存储结构

JDK 1.8之前

在JDK 1.7,HashMap采用的是**数组+链表(头插法)**的存储结构。HashMap通过key的hashCode经过hash方法处理过后得到hash值,然后通过 (n - 1) & hash 判断当前元素存放的位置(n指的是数组的长度),如果当前位置存在元素的话,就判断该元素与要存在的元素的hash值以及key是否相同,如果相同的话,直接覆盖,不相同就通过拉链法解决冲突。JDK 1.8之前的hash方法如下:

1
2
3
4
static int hash(int h) {
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}

存储结构如下:
在这里插入图片描述

所谓 “拉链法” 就是将链表和数组相结合。也就是说创建⼀个链表数组,数组中每⼀格就是⼀个链表。若遇到哈希冲突,则将冲突的值加到链表中即可

阅读全文 »

简介

同一方法作用于不同类的实例,将产生不同的执行结果。即"一个对外接口的方法有多种表现形式"。
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
Java中,父类的引用既可以指向父类的对象,也可以指向子类的对象,但子类的引用不能指向父类的对象

阅读全文 »

简介

什么是线程池

线程池(ThreadPool)是一种基于池化思想管理和使用线程的机制。它是将多个线程预先存储在一个“池子”内,当有任务出现时可以避免重新创建和销毁线程所带来性能开销,只需要从“池子”内取出相应的线程执行对应的任务即可。常见的运用池化思想的有:内存池、数据库连接池。使用线程池的优点如下:

  • 提高线程的利用率
  • 提高程序的响应速度
  • 便于统一管理线程对象
阅读全文 »

JVM体系结构概述

JVM位置

在这里插入图片描述
JVM是运行在操作系统之上的,它与硬件没有直接的交互。

JVM体系结构

在这里插入图片描述

  • 白色的模块说明线程私有,几乎不存在垃圾回收。方法区和堆存在垃圾回收。
  • 栈管运行,堆管存储。栈是线程私有,不存在垃圾回收。栈保存基本类型变量+对象的引用+实例方法。java方法 = 栈帧。
  • 栈记录了方法之间调用和执行情况,类似于排班表。用来存储指向下一条指令的地址。它是当前线程所执行的字节码的行号执行器。
  • Native方法不归JAVA管,所以计数器是空的 。
  • 方法区是存放类结构信息的地方,是一种规范。
阅读全文 »

WebFlux概述

简介

  • WebFlux是Spring5新添加的模块以用于web开发,功能和SpringMVC类似。
  • Webflux使用响应式编程的框架。
  • Webflux 是一种异步非阻塞的框架,异步非阻塞的框架在 Servlet3.1 以后才支持,核心是基于Reactor的相关 API 实现的。

异步非阻塞

异步和同步针对调用者,调用者发送请求,如果等着对方回应之后才去做其他事情就是同步,如果发送请求之后不等着对方回应就去做其他事情就是异步。
阻塞和非阻塞针对被调用者,被调用者收到请求之后,做完请求任务之后才给出反馈就是阻塞,收到请求之后马上给出反馈然后再去做事情就是非阻塞。

阅读全文 »
0%