后端开发
未读HashMap的底层实现JDK1.8 之前JDK1.8 之前 HashMap 底层是 数组和链表 结合在一起使用也就是 链表散列。HashMap 通过 key 的 hashcode 经过扰动函数处理过后得到 hash 值,然后通过 (n - 1) & hash 判断当前元素存放的位置(这里的 n 指的是数组的长度),如果当前位置存在元素的话,就判断该元素与要存入的元素的 hash 值以及 key 是否相同,如果相同的话,直接覆盖,不相同就通过拉链法解决冲突
所谓扰动函数指的就是 HashMap 的 hash 方法
使用 hash 方法也就是扰动函数是为了防止一些实现比较差的 hashCode() 方法 换句话说使用扰动函数之后可以减少碰撞
JDK 1.7 HashMap 的 hash 方法源码:
12345678static int hash(int h) { // This function ensures that hashCodes that differ only by // constant multiples at each bit posit ...
HashMap和常用集合类的区别HashMap 和 HashTable 的区别
线程是否安全: HashMap 是非线程安全的,HashTable 是线程安全的,因为 HashTable 内部的方法基本都经过synchronized 修饰。(如果要保证线程安全的话推荐使用 ConcurrentHashMap )
效率: 因为线程安全的问题,HashMap 要比 HashTable 效率高一点,HashTable 基本被淘汰,尽量不要在代码中使用它
对 Null key 和 Null value 的支持: HashMap 可以存储 null 的 key 和 value,但 null 作为键只能有一个,null 作为值可以有多个,HashTable 不允许有 null 键和 null 值,否则会抛出NullPointerException
初始容量大小和每次扩充容量大小的不同:
创建时如果不指定容量初始值,HashTable 默认的初始大小为 11,之后每次扩充,容量变为原来的 2n + 1,HashMap 默认的初始化大小为 16。之后每次扩充,容量变为原来的 2 倍
创建时如果给定了 ...
JUC面试题volatile关键字的作用?一个共享变量(类的成员变量、类的静态成员变量)在被 volatile关键字 修饰之后,那么就具备了两层语义:
保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的
禁止进行指令重排序
volatile和synchronized的区别
volatile 本质是在告诉 jvm 当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取synchronized 则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住
volatile 仅能使用在变量级别synchronized则可以使用在变量、方法、和类级别的
volatile仅能实现变量的修改可见性,并不能保证原子性synchronized则可以保证变量的修改可见性和原子性
volatile不会造成线程的阻塞synchronized可能会造成线程的阻塞
volatile标记的变量不会被编译器优化synchronized标记的变量可以被编译器优化
后端开发
未读Java 多线程什么是并发和并行
并发:同一时刻多个指令在单个 CPU 上交替执行
并行:同一时刻多个指令在多个 CPU 上同时执行
线程实现方式Thread 实现通过将类继承 Thread 类,并重写 Run 方法
优点:实现简单,可以直接使用Thread 类中的方法
缺点:可扩展性差,不能继承其他的类
123456789101112131415161718class ExtendThread extends Thread { @Override public void run() { for (int i = 0; i < 20; i++) { System.out.println(getName() + " : " + "ExtendThread-Thread"); } super.run(); }}private static void runExtendThread() { ...
什么是Arthas(阿尔萨斯)Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
Arthas(阿尔萨斯)的用途
查找类加载jar包,类相关的Exception
反编译线上jar包,查找与本地代码不一致的地方
线上debug
全局视角查看系统的运行状况
监控JVM的实时运行状态
快速定位应用的热点,生成火焰图
直接从JVM内查找某个类的实例
安装Arthas
点击下载Arthas
解压后,在文件夹里有arthas-boot.jar,直接用java -jar的方式启动:1java -jar arthas-boot.jar
打印帮助信息:1java -jar arthas-boot.jar -h
Arthas基础入门启动 math-game 进行测试math-game是一个简单的程序,每隔一秒生成一个随机数,再执行质因数分解,并打印出分解结果。
mat ...
Java 多线程-认真学习版线程相关概念进程
进程指定的运行中的程序,操作系统会为进程分配内存空间
进程是程序的一次执行过程,或者说是一个正在运行的程序。这个进程有它自己的生命周期,产生、存在、销毁的过程
在这里IDEA程序就是一个进程
线程
线程是由进程创建的,是进程的一个实体
一个进程可以拥有多个线程
我们可以看到在IDEA整个进程中有 142 个线程
线程的一些补充概念
单线程: 在一个时刻,只允许执行一个线程
多线程: 同一时刻可以执行多个线程,这里如上图所示,IDEA就是一个多线程应用
并发: 同一时刻,多个任务交替执行,单核 CPU 实现的多任务处理就是并发
并行: 同一时刻,多个任务同时执行。多核 CPU 才能实现并行。
12345678public class CpuNum { public static void main(String[] args) { // 获取挡圈端脑 CPU 数量 Runtime runtime = Runtime.getRuntime(); int cpuNu ...
Java IO流-认真学习版什么是文件和文件流文件是保存数据的地方文件流: 文件在程序中是以流的形式来操作的
流: 数据在数据源(文件)和程序(内存)之间的路径输入流: 数据从数据源(文件)到程序(内存)之间的路径输出流: 数据从程序(内存)到数据源(文件)之间的路径
常用文件操作创建文件对象相关构造器和方法
new File(String pathname)根据路径构建一个File对象
new File(File parent, String child)根据父目录文件 + 子路径构建
new File(String parent, String child)根据父目录 + 子路径构建
createNewFile创建新文件
这里的flie对象,在 Java 程序中只是个对象,只有执行了createNewFile方法才会真正的在磁盘创建该文件
方式一、根据路径构建一个File对象12345678String filePath = "/Volumes/Code/IdeaProjects/java-IO-learn/src/main/java/com/chongyan/fi ...