
Java基础
文章平均质量分 81
Java基础
DP成长之路
这个作者很懒,什么都没留下…
展开
-
Java双亲委派机制
如果面试官问你,类加载过程是哪几步?巴拉巴拉巴拉...(加载、验证、准备、解析、初始化)见这小伙子面容惊奇,脸泛红光,不由自主的就问了一下双亲委派模型说一下吧;遇见没准备充分的,瞬间懵逼。下面我们就来说一下这个一个有意思的虚拟机类加载机制。一说起双亲委派,就必然要先聊一下Java中的类加载器。Java中的类加载器Bootstrap ClassLoader (启动类加载器)Bootstrap ClassLoader,启动类加载,默认加载的是jdk\lib目录下jar中诸多类;转载 2021-06-19 11:45:10 · 178 阅读 · 0 评论 -
面试官:为什么Integer用==比较时127相等而128不相等?2021-06-11
前言这个几乎是Java 5引入自动装箱和自动拆箱后,很多人都会遇到(而且不止一次),而又完全摸不着头脑的坑。虽然已有很多文章分析了原因,但鉴于我这次还差点坑了同学,还是纪录下来长点记性。问题描述例一来个简单点的例子publicstaticvoidmain(String[]args){for(inti=0;i<150;i++){Integera=i;Integerb=i;...转载 2021-06-11 21:30:45 · 268 阅读 · 0 评论 -
Java中的零拷贝和NIO
前言'零拷贝'这个词大家应该不陌生了,也算是大厂面试中的一个高频考点,玩过 NETTY 的朋友应该对此相当熟悉了,NETTY 的「高并发」很大程度上都是因为 NIO,而 NIO 的核心就是零拷贝技术了,今天就让你十分钟玩懂零拷贝。传统的IO模型是怎么样的?我们来看一张图,让我们看看一个文件从磁盘传输到网卡究竟要经历什么样的磨难: 「第一步」:将文件通过「DMA」技术从磁盘中拷贝到内核缓冲区 「第二步」:将文件从内核缓冲区拷贝到用户进程缓冲区域中 「第三步」:将文..转载 2021-05-16 18:10:36 · 227 阅读 · 0 评论 -
描述Java动态代理的几种实现方式,分别说出相应的优缺点。
AOP的拦截功能是由java中的动态代理来实现的。说白了,就是在目标类的基础上增加切面逻辑,生成增强的目标类(该切面逻辑或者在目标类函数执行之前,或者目标类函数执行之后,或者在目标类函数描述Java动态代理的几种实现方式,分别说出相应的优缺点。抛出异常时候执行。不同的切入时机对应不同的Interceptor的种类,如BeforeAdviseInterceptor,AfterAdviseInterceptor以及ThrowsAdviseInterceptor等)。那么动态代理是如何实现将切面逻辑(advi转载 2021-04-29 10:21:17 · 498 阅读 · 0 评论 -
面试官:为什么重写 equals 同时要重写 hashCode? 我:…
如果使用了HashMap等容器,并且使用了自定义对象作为Key是一定要重写的。重写equals是为了在业务逻辑上判断实例之间是否相等。重写hascode是为了让集合快速判重。 hashCode()与 equals() 的规定: 如果两个对象相等,则 hashcode 一定也是相同的 两个对象相等,对两个 equals() 方法返回 true 两个对象有相同的 hashcode 值,它们也不一定是相等 综上,equals() 方法被覆盖过,则 has..转载 2021-04-27 22:47:10 · 179 阅读 · 0 评论 -
平衡二叉树和红黑树的区别
首先红黑树是不符合AVL树的平衡条件的,即每个节点的左子树和右子树的高度最多差1的二叉查找树。但是提出了为节点增加颜色,红黑是用非严格的平衡来换取增删节点时候旋转次数的降低,任何不平衡都会在三次旋转之内解决,而AVL是严格平衡树,因此在增加或者删除节点的时候,根据不同情况,旋转的次数比红黑树要多。所以红黑树的插入效率更高!!!Answer红黑树的 查询性能略微逊色于AVL树,因为他比avl树会稍微不平衡最多一层,也就是说红黑树的查询性能只比相同内容的avl树最多多一次比较,但是,红黑树在插入和删除上完.原创 2021-04-01 13:31:31 · 417 阅读 · 0 评论 -
从浏览器地址栏输入url到请求返回发生了什么?
你一看这种烂掉牙的问题,小case,但996面试大佬由此延展的问题已经远远超越了这个问题本身了,不信你就接着看。我回答了首先会进行 url 解析,根据 dns 系统进行 ip 查找。话音刚落,此时一位喜欢修福报的公司的大佬打断了我,说url为啥要解析,dns查询规则是什么?我一听就心里想,不按套路出牌啊,网上一般都没问这两个问题,心里再一想,俗话说,万事开头难,扛过这一波,答出来,就是阳光明媚,万物骚动的春天!先说为什么url要解析(也就是编码) 我回答大概内容是:因为网络标准规定了U转载 2021-03-31 19:43:58 · 234 阅读 · 0 评论 -
面对千万级、亿级流量怎么处理?
这是一道很常见的面试题,但是大多数人并不知道怎么回答,这种问题其实可以有很多形式的提问方式,你一定见过而且感觉无从下手:面对业务急剧增长你怎么处理?业务量增长10倍、100倍怎么处理?你们系统怎么支撑高并发的?怎么设计一个高并发系统?高并发系统都有什么特点?... ...诸如此类,问法很多,但是面试这种类型的问题,看着很难无处下手,但是我们可以有一个常规的思路去回答,就是围绕支撑高并发的业务场景怎么设计系统才合理?如果你能想到这一点,那接下来我们就可以围绕硬件和软件层面怎么支撑高转载 2021-03-25 20:42:03 · 278 阅读 · 0 评论 -
Java 后端线上问题排查常用命令
内存瓶颈freefree是查看内存使用情况,包括物理内存、交换内存(swap)和内核缓冲区内存。free -h -s 3表示每隔三秒输出一次内存情况,命令如下[1014154@cc69dd4c5-4tdb5~]$freetotalusedfreesharedbuff/cacheavailableMem:1196236564305222045611364431376...转载 2021-03-23 19:39:55 · 348 阅读 · 0 评论 -
常见的Java锁总结:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,偏向锁,自旋锁等等
前言在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类。介绍的内容如下:1.公平锁 / 非公平锁2.可重入锁 / 不可重入锁3.独享锁 / 共享锁4.互斥锁 / 读写锁5.乐观锁 / 悲观锁6.分段锁7.偏向锁 / 轻量级锁 / 重量级锁8.自旋锁公平锁 / 非公平锁公平锁公平锁是指多个线程按照申请锁的顺序来获取锁。非公平锁非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先.转载 2021-03-23 18:59:37 · 165 阅读 · 0 评论 -
多线程面试
1. 线程池都有哪些状态?RUNNING:这是最正常的状态,接受新的任务,处理等待队列中的任务。 SHUTDOWN:不接受新的任务提交,但是会继续处理等待队列中的任务。 STOP:不接受新的任务提交,不再处理等待队列中的任务,中断正在执行任务的线程。 TIDYING:所有的任务都销毁了,workCount 为 0,线程池的状态在转换为 TIDYING 状态时,会执行钩子方法 terminated()。 TERMINATED:terminated()方法结束后,线程池的状态就会变成这个。2. 守原创 2021-03-23 09:31:34 · 85 阅读 · 0 评论 -
线程池中多余的线程是如何回收的?
下面以JDK1.8为例进行分析1.runWorker(Worker w)工作线程启动后,就进入runWorker(Worker w)方法。里面是一个while循环,循环判断任务是否为空,若不为空,执行任务;若取不到任务,或发生异常,退出循环,执行processWorkerExit(w, completedAbruptly); 在这个方法里把工作线程移除掉。取任务的来源有两个,一个是firstTask,这个是工作线程第一次跑的时候执行的任务,最多只能执行一次,后面得从getTask()方法里.转载 2021-03-22 21:07:30 · 292 阅读 · 0 评论 -
为什么MySQL不推荐使用uuid作为主键?
1. 前言在MySQL中设计表的时候,MySQL官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一,单机递增),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究竟有什么坏处?2. MySQL和程序实例★要说明这个问题,我们首先来建立三张表分别是user_auto_key,user_uuid,user_random_key,分别表示自动增长的主键,uuid作为主键,随机key作为主键,...转载 2021-03-22 19:31:29 · 292 阅读 · 0 评论 -
阻塞、非阻塞、多路复用、同步、异步、BIO、NIO、AIO 一锅端
承接上文的操作系统,关于IO会涉及到阻塞、非阻塞、多路复用、同步、异步、BIO、NIO、AIO等几个知识点。知识点虽然不难但平常经常容易搞混,特此Mark下,与君共勉。1 阻塞跟非阻塞1.1 阻塞阻塞IO阻塞IO情况下,当用户调用read后,用户线程会被阻塞,等内核数据准备好并且数据从内核缓冲区拷贝到用户态缓存区后read才会返回。可以看到是阻塞的两个部分。 CPU把数据从磁盘读到内核缓冲区。 CPU把数据从内核缓冲区拷贝到用户缓冲区。 1.2 非阻塞.转载 2021-03-20 14:01:08 · 121 阅读 · 0 评论 -
硬核操作系统讲解
1 冯诺伊曼体系1.1 冯诺伊曼体系简介现代计算机之父冯诺伊曼最先提出程序存储的思想,并成功将其运用在计算机的设计之中,该思想约定了用二进制进行计算和存储,还定义计算机基本结构为 5 个部分,分别是中央处理器(CPU)、内存、输入设备、输出设备、总线。 存储器:代码跟数据在RAM跟ROM中是线性存储, 数据存储的单位是一个二进制位。最小的存储单位是字节。 总线:总线是用于 CPU 和内存以及其他设备之间的通信,总线主要有三种: 地址总线:用于指定 CPU 将要操作的内存转载 2021-03-20 14:00:07 · 293 阅读 · 0 评论 -
TCP/IP 开胃菜 之 HTTP
1 TCP/IP1.1 TCP/IP 定义TCP/IP协议族是一组协议的集合,也叫互联网协议族,计算机之间只有遵守这些规则,才能进行通信。TCP和IP只是其中2个重要的协议,所以用TCP/IP来命名这个互联网协议族,实际上他大致包括四层协议。1.2 TCP/IP 功能上文说过 TCP/IP 宏观上分为四层,接下来说下四层的具体作用。1.2.1. 应用层应用层 为用户直接提供不同的网络服务协议,比如 HTTP、Email、FTP 等,这些协议都是为了解决实际生...转载 2021-03-20 13:58:34 · 171 阅读 · 0 评论 -
TCP/IP高频考点之一个数据包的流浪日记 - 网络层
4 网络层 IP数据包的传输主要经过应用层、传输层、网络层、链路层。承接应用层HTTP、传输层TCP讲解,应用层数据被传输层包裹后接下来就需要被网络层包裹了,网络层的核心任务就是实现主机与主机之间的通信。讲解IP层之前需铺垫众多基础知识。4.1 IP 基础知识4.1.1 IP 定义现实生活人能找到人是因为知道彼此的详细地址,在网络中要通讯就要知道对方的 IP 地址,IPv4 是由32位二进制数据来表示的,每4位算一组并换算成10进制数据,组与组之间通过.分割。IPv44.1...转载 2021-03-20 13:57:16 · 686 阅读 · 0 评论 -
面试反客为主 TCP
3 传输层 TCP/UDP承接上文HTTP,数据经过应用层就到传输层,但数据到传输层之前需要先获得服务端的 IP 地址,这就涉及到DNS域名解析。3.1 DNS3.1.1 DNS 讲解主机的真正地址是IP,问题是IP地址不方便人们记忆,就像你拿手机给张三打电话,难道你能瞬间说出张三电话号码么,手机里做一个名字跟电话的映射即可,想通话时直接从通讯录找到张三就可以找到对应的手机号,在网络请求时候也是需要映射的,而域名服务器Domain Name System就是干这个事的,深入...转载 2021-03-20 13:55:47 · 216 阅读 · 0 评论 -
Java并发
1、HashMap面试第一题必问的HashMap,挺考验Javaer的基础功底的,别问为啥放在这,因为重要!HashMap具有如下特性: HashMap 的存取是没有顺序的。 KV 均允许为 NULL。 多线程情况下该类不安全,可以考虑用 HashTable。 JDk8底层是数组 + 链表 + 红黑树,JDK7底层是数组 + 链表。 初始容量和装载因子是决定整个类性能的关键点,轻易不要动。 HashMap是懒汉式创建的,只有在你put数据时.转载 2021-03-20 13:53:13 · 188 阅读 · 0 评论 -
Java学习笔记-NIO
Java NIO(New IO或 Non Blocking IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API。NIO支持面向缓冲区的、基于通道的IO操作。NIO将以更加高效的方式进行文件的读写操作。java IO 与 java NIO 的区别一、通道(Channel)与缓冲区(Buffer)若需要使用 NIO 系统,需要获取用于连接 IO 设备的通道以及用于容纳数据的缓冲区。然后操作缓冲区,对数据进行处理。简而言之,Channel 负责传输, B转载 2021-02-18 21:55:19 · 216 阅读 · 0 评论 -
CAS总结
一、什么是CASCAS(Compare-And-Sawp):CAS算法保证数据的原子性。 CAS算法是硬件对于并发操作共享数据的支持 CAS包含三个操作数: 内存值E 预期值V 更新值N 当且仅当E == V 时,E =N,否则,将不做任何操作。 二、CAS带来的问题1.ABA的问题 因为CAS需要在操作值的时候,检查值有没有发生变化,如果没有发生变化则更新,但是如果一个值原来是A,变成了B,又变成了A,那么CAS进行检查的时候发现它的值没有发生...原创 2021-02-16 22:21:07 · 222 阅读 · 0 评论 -
Java 8 新特性笔记-Lambda、Stream、Optional、新日期API
1. Java 81.1 生态Lambda 表达式 函数式接口 方法引用 / 构造器引用 Stream API 接口中的默认方法 / 静态方法 新时间日期 API 其他新特性1.2 新特性速度更快 代码更少 强大的 Stream API 便于并行 最大化减少空指针异常 Optional (Kotlin ?)1.3 温故而知新 Hashmap 底层结构/原理 老话题不再阐述 … 并发hashmap … Java虚拟机 … Java内存模型原创 2021-02-16 17:06:05 · 411 阅读 · 1 评论 -
面试:操作系统中用户态和内核态
用户态:当进程在执行用户自己的代码时,则称其处于用户态,这时cpu 访问资源有限,运行在用户态下的程序不能直接访问操作系统内核数据结构和程序。内核态当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核状态,这时cpu可以访问计算机的任何资源。内核的功能:(1)进程(线程)管理(进程或者线程的调度)(2)低级存储器管理(用户程序逻辑空间到内存空间的物理地址的变换)(3)中断和陷入管理(中断和陷入)由于微内核结构的存在,那么程序就运行在两种不同的地方,...原创 2021-02-10 00:03:23 · 936 阅读 · 0 评论 -
JVM学习笔记(三) 类加载与字节码技术
1.类文件结构2.字节码指令3.编译期处理4.类加载阶段5.类加载器6.运行期优化原创 2021-02-08 23:00:30 · 140 阅读 · 0 评论 -
JVM学习笔记(二) JVM的垃圾回收及调优
一、如何判断对象可以回收1.引用计数法(reference-counting)每个对象有一个引用计数器,当对象被引用一次则计数器加1,当对象引用失效一次则计数器减1,对于计数器为0的对象意味着是垃圾对象,可以被GC回收。缺点:若两个对象相互引用,他们的count都不会是0,所以一直不能被垃圾回收。2.可达性分析算法(GCRootsTracing)扫描堆中的对象,从GCRoots作为起点开始搜索,那么整个连通图中的对象便都是活对象,对于GCRoots无法到达的对象便成了垃圾回收的对...原创 2021-02-07 22:56:03 · 293 阅读 · 0 评论 -
JVM学习笔记(一) JVM的内存结构及简单调优
什么事JVM?定义:JavaVirtualMachine -java程序的运行环境(java二进制字节码的运行环境)好处:一次编写,多处运行 自动内存管理,垃圾回收功能 数组下标越界检查 多态 ......JDK和JRE之间的关系:一、程序计数器(寄存器)程序执行:二进制字节码 ->解释器 ->机器码 ->CPU | -->程序计数...原创 2021-02-05 21:34:01 · 148 阅读 · 0 评论 -
堆排序
package Sort;public class HeapSort { public static void main(String[] args) { int[] arr = {5, 1, 7, 3, 1, 6, 9, 4};// int[] arr = { 16, 7, 3, 20, 17, 8 }; heapSort(arr); for (int i : arr) { System.out.print(i + " "); } } /** * 创建堆 .原创 2021-02-04 18:47:03 · 134 阅读 · 0 评论 -
两个线程循环打印ab10次
package hy;import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;import java.util.Comparator;import java.util.List;import java.util.stream.Collector;public class Solution{ // ab 线程交叉打印 // 该变量可以理解成:上一次打印是否字符A private.原创 2021-02-04 18:43:37 · 798 阅读 · 1 评论 -
CAS的优缺点
前言什么是CAS?CAS是compare and swap的缩写,即我们所说的比较交换。CAS是一种基于锁的操作,而且是乐观锁。在java中锁分为乐观锁和悲观锁。悲观锁是将资源锁住,等一个之前获得锁的线程释放锁之后,下一个线程才可以访问。而乐观锁采取了一种宽泛的态度,通过某种方式不加锁来处理资源,比如通过给记录加version来获取数据,性能较悲观锁有很大的提高。CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。如果内存地址里面的值和A的值是一样的,那么就将内存里面的原创 2021-02-04 17:51:11 · 1029 阅读 · 0 评论 -
java触发full gc的几种情况概述
前言近期被问及这个问题,在此记录整理一下。System.gc()方法的调用此方法的调用是建议JVM进行Full GC,虽然只是建议而非一定,但很多情况下它会触发 Full GC,从而增加Full GC的频率,也即增加了间歇性停顿的次数。强烈影响系建议能不使用此方法就别使用,让虚拟机自己去管理它的内存,可通过通过-XX:+ DisableExplicitGC来禁止RMI调用System.gc。老年代空间不足老年代空间只有在新生代对象转入及创建为大对象、大数组时才会出现不足的现象,当执行Fu转载 2021-02-04 16:19:13 · 1577 阅读 · 0 评论 -
机器人的运动范围(Java)
机器人的运动范围(Java)题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7=18。但是,它不能进入方格(35,38),因为3+5+3+8=19。请问该机器人能够达到多少个格子?解答:回溯法class Solution { public int movingCount(int m, int原创 2020-12-30 21:21:08 · 148 阅读 · 0 评论 -
Java用队列实现栈(LinkedList中的poll()和pop()区别)
LeetCode使用队列实现栈的下列操作:push(x) -- 元素 x 入栈pop() -- 移除栈顶元素top() -- 获取栈顶元素empty() -- 返回栈是否为空解题思路自己用两个队列实现了栈,是最容易想到的方法,也是数据结构中常规的方法,但是在java中用一个队列也可以容易实现栈。先给出结论:pop与poll都是取出LinkedList的第一个元素...原创 2020-03-01 17:09:23 · 6845 阅读 · 0 评论 -
题目:岛屿的个数
给一个01矩阵,求不同的岛屿的个数。0代表海,1代表岛,如果两个1相邻,那么这两个1属于同一个岛。我们只考虑上下左右为相邻。样例在矩阵:输入m,n[ [1, 1, 0, 0, 0], [0, 1, 0, 0, 1], [0, 0, 0, 1, 1], [0, 0, 0, 0, 0], [0, 0, 0, 0, 1]]解题:对某个位置(i,j)当...原创 2020-02-13 11:34:58 · 343 阅读 · 0 评论 -
Centos7安装MongoDB
下载MongoDB安装包wgethttps://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.2.4.tgz解压安装包到指定目录tar -zxvf mongodb-linux-x86_64-rhel70-3.2.4.tgz -C /opt/software/创建数据库目录cd /opt/module/mon...原创 2019-11-16 15:26:00 · 159 阅读 · 0 评论 -
MongoDB的基本使用
MongoDB简介MongoDB是为快速开发互联网Web应用而设计的数据库系统 MongoDB的设计目标是极简、灵活、作为Web应用栈的一部分 MongoDB的数据模型是面向文档的,所谓文档是一种类似于JSON的结构,简单理解MongoDB这个数据库中存的是各种各样的JSON。(BSON)三个概念数据库(database) –数据库是一个仓库,在仓库中可以存放集合。 集合(col...原创 2019-11-14 09:45:25 · 144 阅读 · 0 评论 -
Redis的Java客户端Jedis(全干货,简单上手)
Maven的依赖导入<!-- https://mvnrepository.com/artifact/commons-pool/commons-pool --><dependency><groupId>commons-pool</groupId><artifactId>commons-pool</artif...原创 2019-11-12 23:49:27 · 242 阅读 · 0 评论