面试题-集合
1:Collection 集合框架2:并发集合框架List,Set,Queue。
3:HashMap3-1:HashMap 的数据结构数组+链表,链表容量为 9 时转化为红黑树,扩容时小于等于 6 退化为链表。
3-2:链表插入法3-2-1:头插法12node.next = head;head = node;
2-2-2:尾插法12tail.next = node;tail = node;
3-2-3:扩容死循环问题jdk1.8 以前链表扩容是加入到链表首,而 1.8 是加入到链表尾,已经不会出现这个问题。
3-3:红黑树的引入3-3-1:HashMap 为什么要树化?在最坏的情况下,查询效率从 O(1)变为线性的 O(n),而红黑树就是为了解决这个问题。红黑树能保证最坏情况也有 O(logn)的时间复杂度。
3-3-2:HashMap 树化门槛及作用链表长度大于 8 就会进行树化,是为了保证最坏情况的时间复杂度。
3-3-3:为什么不把链表全部换为红黑树只有数据很多的情况下才需要红黑树,因为红黑树所消耗的资源和链表更大,而时间消耗也不会差太多。
3-3-4:为什么是使用红黑树而不 ...
面试题-Java基础
1:Java 特性1-1:Java 特点
简单性
面向对象
分布式
健壮性
安全性
体系结构中立
可移植性
解释型
高性能
多线程
动态性
1-2:JVM\JRE\JDK\JIT
JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java 的开发环境和运行环境。
JRE:Java Runtime Environment 的简称,Java 运行环境,为 Java 的运行提供了所需环境。
JVM:Java Virtual Machine,Java 虚拟机。
JIT:Just-In-Time Compiler,即时编译器。
JDK 包含 JRE 和编译器 Javac,还包含很多 Java 程序调试和分析的工具。JRE(Java 运行时环境)包含虚拟机但是不包含编译器。简单来说:如果需要运行 Java 程序,只需安装 JRE ,如果需要编写 Java 程序,则需要安装 JDK。
1-3:变量的初始化顺序
父类静态代码块
子类静态代码块
父类成员代码块
父类构造函数
子类成员代码块
子类构造函数
静态代码块和非静态代码块按顺序加载。
1-4:⾯向过程性 ...
Integer源码解析
构造函数123456789private final int value;public Integer(int value) { this.value = value;}public Integer(String s) throws NumberFormatException { this.value = parseInt(s, 10);}
从构造方法中我们可以知道,初始化一个 Integer 对象的时候只能创建一个十进制的整数。
Integer 转 String转化为 16 进制/8 进制/2 进制方法如下:
123456789101112public static String toHexString(int i) { return toUnsignedString0(i, 4);}public static String toOctalString(int i) { return toUnsignedString0(i, 3);}public static String to ...
ArrayList源码解析
基础结构12345678910111213141516171819202122232425262728293031323334353637383940414243444546// 默认初始化容量,私有常量private static final int DEFAULT_CAPACITY = 10;// 初始容量设为0时的数组,私有常量private static final Object[] EMPTY_ELEMENTDATA = {};// 未设置初始容量时的空数组,与上一步拆分以在第一个元素添加时确定数组大小,私有常量private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};// 存放数据,如果 elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA,那么第一个数据时,容量为默认容量10transient Object[] elementData; // non-private to simplify nested cla ...
HashMap源码解析
基本结构123456789101112131415161718192021222324252627282930// 默认容量16static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16// 默认最大容量static final int MAXIMUM_CAPACITY = 1 << 30;// 默认负载因子0.75 16*0.75 = 12 即容量为13时扩容static final float DEFAULT_LOAD_FACTOR = 0.75f;// 树转化临界点8 链表容量为9时扩容static final int TREEIFY_THRESHOLD = 8;// 树退化临界点6 扩容时如果链表容量<=6,退化为链表static final int UNTREEIFY_THRESHOLD = 6;// 树容量 转换为红黑树时,如果table长度小于64,扩容static final int MIN_TREEIFY_CAPACITY = 64;// 链表节点static class N ...
常量池
Class 常量池
原文地址:Java 工程师成神之路
在 Java 中,常量池的概念想必很多人都听说过。这也是面试中比较常考的题目之一。在 Java 有关的面试题中,一般习惯通过 String 的有关问题来考察面试者对于常量池的知识的理解,几道简单的 String 面试题难倒了无数的开发者。所以说,常量池是 Java 体系中一个非常重要的概念。
谈到常量池,在 Java 体系中,共用三种常量池。分别是字符串常量池、Class 常量池和运行时常量池。
本文先来介绍一下到底什么是 Class 常量池。
什么是 Class 文件在Java 代码的编译与反编译那些事儿中我们介绍过 Java 的编译和反编译的概念。我们知道,计算机只认识 0 和 1,所以程序员写的代码都需要经过编译成 0 和 1 构成的二进制格式才能够让计算机运行。
我们在《深入分析 Java 的编译原理》中提到过,为了让 Java 语言具有良好的跨平台能力,Java 独具匠心的提供了一种可以在所有平台上都能使用的一种中间代码——字节码(ByteCode)。
有了字节码,无论是哪种平台(如 Windows、Linux 等), ...
Java内存结构
概述总所周知,Java 代码都是运行在虚拟机上的,而虚拟机在执行 Java 程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途。这些区域的统称就是运行时数据区域。也正是因为 Java 的自动内存管理机制,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会是一个非常艰巨的任务。这篇文章就是介绍一下 Java 内存结构即运行时数据区域。
Java 内存结构在《Java 虚拟机规范(Java SE 8)》中描述了 JVM 运行时内存区域结构如下:
图片来自JVM 内存结构 VS Java 内存模型 VS Java 对象模型
线程共享
线程私有
Java 堆
PC 寄存器(程序计数器)
方法区
Java 虚拟机栈
本地方法栈
JDK1.8 后,方法区的实现由永久代改为了元空间,这里按下不表,后面再说。
PC 寄存器(程序计数器)程序计数器是一块较小的内存空间,几乎可以忽略不记,也是运行速度最快的存储区域(因为只存放了指向下一条指令的地址)。可以看作是当前线程所执行的字节码的行号指示器。
字节码解释器工 ...
为什么HashMap的hash值要右移16位?
前言
一时兴起,去看了看 HashMap 的源码,越过大段的注释后,第一个方法就给我难住了。为什么这么计算出的 hash 值可以更加分散呢?
1234static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);}
概念介绍
<<: 左移运算符,num << 1,相当于 num 乘以 2 低位补 0举例:3 << 2将数字 3 左移 2 位,将 3 转换为二进制数字:0000 0000 0000 0000 0000 0000 0000 0011,然后把该数字高位(左侧)的两个零移出,其他的数字都朝左平移 2 位,最后在低位(右侧)的两个空位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 1100,则转换为十进制是 12。
>>: 右移运算符举例:11 >> 2则是将数字 11 右移 ...
Nacos + Gateway + OAuth2
前言这一篇文章是项目框架的重头戏,在找了多方文章后才从这一系列博客–>Spring Cloud实战 | 第六篇:Spring Cloud Gateway + Spring Security OAuth2 + JWT实现微服务统一认证鉴权成功的搭建了OAuth2框架。
跟随上面介绍的博客,使用Gateway作为资源服务器,OAuth2作为认证服务器,使用JWT作为token。搭建了这个框架。在搭建完成后写下这一篇博客记录项目搭建过程和所遇到的问题。
概念介绍这一模块留待后续补充,目前先介绍项目搭建过程。
认证服务器Spring Security OAuth过时在最开始使用OAuth2时,我才发现Spring Security OAuth已过时,Spring官方已经OAuth2整合到Spring Security中,但是经过多次搜索,我依旧没找到基于Spring Security如何使用OAuth2,所以决定使用spring-cloud-starter-oauth2先用着,等日后博客更多或者我的技术更好再进行更换,也算留个坑。
Spring Security OAuth
导入依 ...
Nacos + Spring Cloud Gateway
前言
Nacos: 一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。–>NacosSpring Cloud Gateway: 该项目提供了一个用于在Spring WebFlux之上构建API网关的库。Spring Cloud Gateway旨在提供一种简单而有效的方法来路由到API,并为它们提供跨领域的关注,例如:安全性,监视/度量和弹性–>Srping Cloud Gateway
概念介绍这一模块留待后续补充,目前先介绍项目搭建过程。
NacosNacos配置见–>Nacos-server,可以参考阿里官方文档–>Nacos手册。这里我在本地使用单机模式启动并连接本地数据库。
在nacos中,与gateway相关的文件有三个:
Application-dev.properties
Gateway-dev.properties
gateway-router
第一个文件是所有服务通用的配置,例如:redis,knife4j等等可以通用的配置。第二个文件作为有Gateway服务特有的配置文件,例如:端口号,数据库地址等等。第三个文件是Gatew ...