自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(29)
  • 收藏
  • 关注

原创 线程池高频面试题(ThreadPoolExecutor)

为什么使用线程池?线程池的优势 线程复用,减少线程创建、销毁的开销,提高性能 提高响应速度,当任务到达时,无需等待线程创建就能立即执行。 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资 源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。 什么时候用线程池? 多个任务操作之间互不影响,或者多个操作需要汇总之类的场景。 需要处理的任务数量很大 线程池状态 private final AtomicInteg

2022-05-13 15:52:36 587

原创 ReentrantLock可重入锁的实现原理

独占锁 :同一时间内只有一个线程可以获取这个锁并占用资源。其他线程想要获取锁,必须等待这个线程释放锁。公平锁先从lock方法中去获取锁,进入acquire()方法 ,先 tryAcquire()去尝试获取锁如果没有获取成功 就封装成节点 进入CLH队列等待static final class FairSync extends Sync { final void lock() { acquire(1); } // AbstractQueuedSynch

2022-05-13 15:43:02 319

原创 在浏览器中输入 url 地址显示主页的过程

用户在浏览器中输入URL,例如http为协议,www.baidu.com为域名。 DNS 解析:获取域名对应IP TCP 连接: 发送 HTTP 请求:向web服务器发送一个Http请求 服务器处理请求并返回 HTTP 报文: 浏览器解析渲染页面: 连接结束 DNS解析流程 输入网址回车时,浏览器首先查询浏览器的缓存,如果没有找到就去查询本地的DNS存储和hosts文件,如果有与域名对应的IP则直接通过这个IP访问网络服务器 如果本

2022-05-09 17:27:36 1426

原创 JAVA基础高频

包装类型常量池技术Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,Character 创建了数值在 [0,127] 范围的缓存数据,Boolean 直接返回 True or False。如果有一个int和一个Integer他们之间可以用==比较吗?理论上来说因为有包装类的常量池技术,Integer类型的数据如果处于[-128,127] 之间,则可以直接使用==进行判断,但是如果在这个区间之外的数据会在堆上产生,要使用eq

2022-04-10 19:36:13 130

原创 InnoDB锁类型详细介绍

数据库锁一般可以分为两类,悲观锁、乐观锁乐观锁一般指用户自己实现的锁机制,假设认为数据一般情况下不会造成冲突,类似CAS,乐观锁实现的方式一般有版本号和时间戳,悲观锁一般就是数据库层的锁机制。Lock的精度(type)分为 行锁、表锁、意向锁Lock的模式(mode)分为: 锁的类型 ——【读锁和写锁】或者【共享锁和排他锁】即 【X or S】 锁的范围 ——【record lock、gap lock、Next-key lock】 Record lock:单个行记录上.

2022-04-10 16:59:45 537

原创 MySQL高频面试题

InnoDB引擎的三大特点,四大特性三大特点: 支持事务安全 支持行锁 支持外键 四大特性: 插入缓冲(insert buffer) 二次写(double write) 自适应哈希索引(ahi) 预读(read ahead) 什么是脏读?幻读?不可重复读? 脏读(Dirty Read):一个事务读到另一个事务还未提交的数据 不可重复读(Non-repeatable read):一个事务先后读取同一条记录,但是两次读取的

2022-03-06 14:21:21 366

原创 MySQL-索引失败的情况

索引语法--创建索引create [unique|fulltext] index index_name on table_name(index_col_name,...)--查看索引show index from table_name;--删除索引drop index index_name on table_name;性能分析 慢查询日志 记录了所有执行时间超过指定参数的所有SQL语句的日志,默认未开启 profile详情 帮助我们了解时间都耗费到哪里去了.

2022-03-03 19:40:00 652

原创 MySQL基本语句(DDL,DML,DQL,DCL)

SQL通用语法 SQL语句可以单行或多行书写,以分号结尾 SQL语句可以使用空格/缩进来增强语句的可读性 MySQL数据库的SQL语句不区分大小写,关键字建议使用大写 注释: 单行:-- 或 # 多行:/* */ SQL语句分类分类 全称 说明 DDL Data Definition Language 数据定义语言,用来定义数据库对象 DML Data Manipulation Language

2022-03-01 20:07:08 356

原创 Java实现二叉树的遍历(层次,先中后递归/非递归)

层次遍历//层次public int[] levelOrder(TreeNode root) { if(root==null) return new int[0]; List<Integer> list = new ArrayList<>(); Queue<TreeNode> queue = new LinkedList<>(); //TreeNode node = root;

2022-02-28 13:15:51 366

原创 JUC-AQS面试(AbstractQuenedSynchronizer)

Java.util.concurrent(J.U.C)大大提高了并发性能,AQS是JUC的核心,是阻塞式锁相关的同步器工具的框架,是一个主要用来构建锁和同步器的抽象类。全称AbstractQuenedSynchronizer 意思就是抽象队列同步器。AQS特点 用state属性来表示资源的状态(分独步模式和共享模式),子类需要定义如何维护这个状态,控制如果获取锁和释放锁 getState-获取state状态 setState-设置state状态 com..

2022-02-27 15:42:46 275

原创 Java面试题:一些高频易混淆的名词解释

throws&throw throws出现在方法头,throw出现在方法体 throws表示出现异常的一种可能性,并不一定会发生异常;throw则是抛出了异常,执行throw一定抛出了某种异常 两者都是消极的异常处理方式,只是抛出或可能抛出异常 重写/重载重载和重写都是多态的一种体现方式重载是编译期间的活动,重写是运行期间的活动重载是在一个类中定义相同名字的方法,方法的参数列表或者类型要互不相同,但是返回值类型不作为是否重载的标准,可以修改可见性。重写要

2022-02-26 19:15:28 300

原创 JVM-运行时数据区:方法区

方法区的理解方法区可以看作是独立于Java堆的内存空间方法区与Java堆一样,是各个线程共享的内存区域 方法区在JVM启动时被创建,实际物理内存与堆一样是可以不连续的 方法区的大小与堆一样是可以选择固定大小或者扩建的 方法区的大小决定了系统可以保存多少类 关闭JVM就会释放这个区域的内存JDK7及之前:java.lang.OutOfMemoryError:PermGen [永久代]JDK8及之后:java.lang.OutOfMemoryError:Metaspae [元空间]方

2022-02-25 13:26:24 364

原创 JUC-创建和运行线程

直接用Thread//直接用ThreadThread t = new Thread(){ public void run(){ //... }};//启动线程t.start();//赋名t.setName("t1")Runnable配合Tread//Thread 代表线程 Runnable可运行的任务Runnable runnalbe = new Runnable(){ public void run(){ //...

2022-02-24 14:29:36 2006

原创 JVM-运行时数据区:Java堆(Heap) 内存管理的核心区

堆(Heap) :内存管理的核心区一個JVM实例只存在一个堆内存 Java堆区在JVM启动时被创建,空间大小也确定,是JVM管理的最大的一块内存空间 堆可以处于物理上不连续的内存空间,但在逻辑上视为连续的 虽然所有线程共享堆,但是可以划分线程私享区 几乎所有的对象实例化以及数组都应该在运行时分配在堆上(栈上分配) 数组和对象可能永远不会存储在栈上,因为栈帧中保存引用这个引用指向对象或数组在堆中的位置 在方法结束后,堆中的对象不会马上被移除,仅仅在垃圾收集时才会被移除 对是GC执行垃圾回收的

2022-02-24 14:15:00 167

原创 JVM-运行时数据区:本地方法栈

Java虚拟机用于管理Java方法的调用,而本地方法栈用于管理本地方法的调用 本地方法栈是线程私有的 允许被实现成固定或可动态扩展的内存大小 本地方法栈是使用C语言实现的 它具体的做法是Nativa Method Stack中登记的native方法,在Execution Engine 执行时加载本地方法库当某线程调用本地方法时,就不受虚拟机限制,且拥有虚拟机同等的权限方法执行完毕后相应的栈帧也会出栈并释放内存空间,也会出现StackOverFlowError和OutOfMemoryErr...

2022-02-23 16:07:42 763

原创 JVM-运行时数据区:虚拟机栈

每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个栈帧,对应一次次的Java方法调用 是线程私有的作用:主管Java程序的运行,它保存方法的局部变量,部分结果,并参与方法的调用和返回栈是不存在垃圾回收的问题的栈的存储单位:栈帧线程上正在执行的每个方法都各自对应一个栈帧,栈帧是一个内存区块,是一个数据集。栈帧中存着:局部变量,操作数栈,动态链接,方法返回地址+一些附加消息局部变量表 定义为一个数字数组,主要是存储方法参数和定义在方法体内的局部变量 最基.

2022-02-23 15:42:16 716

原创 JVM-运行时数据区:PC寄存器

虚拟机Java虚拟机:JAVA字节码的虚拟计算机,就是二进制字节码的运行环境特点:一次编译,到处运行 自动内存管理 自动垃圾回收JVM运行在操作系统之上。硬件-操作系统--JVM--字节码--USERJVM的生命周期:启动--执行--结束虚拟机的启动是通过引导类加载器创建一个初始类来完成的 虚拟机的执行 程序开始执行时虚拟机才运行,程序结束虚拟机结束 执行一个所谓的Java程序时,真正在执行的是一个叫Java虚拟机的进程 虚拟机的退出 程序正常退出 执行过程中遇

2022-02-23 14:37:24 588

原创 JVM-类的加载子系统

• 类加载器子系统负责从文件系统 或网络中加载.class文件• ClassLoader只负责class文件的加载,主语是否允许由ExecutionEngine决定• 加载的类的信息存放于一块称为方法区的内存空间。类的加载过程:加载阶段 通过一个类的全限定名获取定义此类的二进制字节流 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构 在内存中生成一个代表这个类的java.lang.Class对象,作为该方法区这个类的各种数据的访问入口 链接阶段 验证:目标在于确

2022-02-23 13:46:06 172

原创 单例模式-Singleton(饿汉式,懒汉式,双重校验锁,静态内部类)

class Solution { public List<String> letterCombinations(String digits) { //定义一个返回的结果集 List<String> res = new ArrayList<>(); //如果字符串为空,直接返回 if(digits.length() == 0){ return res; } .

2022-02-22 13:32:38 249

原创 Java面试题:反转链表

class Solution { public ListNode reverseList(ListNode head) { ListNode cur = null; ListNode pre = head; while(pre!=null){ ListNode temp = pre.next; pre.next = cur; cur = pre; ...

2022-02-21 15:51:47 437

原创 Java虚拟机特点与内存视图

• Java虚拟机:JAVA字节码的虚拟计算机,就是二进制字节码的运行环境特点:1) 一次编译,到处运行2) 自动内存管理3) 自动垃圾回收• JVM运行在操作系统之上,硬件-操作系统-JVM-字节码文件-USER•Java编译器输入的指令流基本上是一种基于栈的集架构,另一种是棘突寄存器指令集的架构基于栈:使用零地质指令方式分配,指令集更小,编译器更容易实现,不需要硬件支持,可移植性更好基于寄存器:应用二进制指令集,完全依赖硬件,可移植性差,性能优秀执行更高效JVM生命周期:启动-执行..

2022-02-21 13:54:33 464

原创 Java面试题每日一背

考察点:数据类型1.int和Integer有什么区别?Integer是int的包装类Java为了编程方便所以引入了基本数据类型,但是为了能将这些基本数据类型当成对象操作为每个基本数据类型引入了对应的包装类。自动拆装箱机制使得二者可以互相装换。自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间做的一个转化- 原始类型: boolean,char,byte,short,int,long,float,double 包装类型:Boolean,Character,Byte,Sho

2022-02-17 21:27:55 89

原创 Java基础:面向对象的三大特征

简单来讲,面向对象设计师一种程序设计技术。他将重点放在数据(对象)和对象的接口上。在本质上Java的面向对象能力与C++是一样的,主要不同点在于多重继承,在Java中取而代之的是更简单的接口的概率。三大特征分别为:封装、继承、多态封装:封装是把客观事物抽象成类,并且把自己的属性和方法让可信的类或对象操作,对不可性的隐藏。将权限设置为private则仅可在本类中访问;设置公开的get/set方法访问数据访问修饰符:访问修饰符 本类 同包 同包子类 其他包

2022-02-12 22:37:04 384

原创 Leetcode:判断对称二叉树(递归的相关思考)

递归思考三步: 递归函数要干什么? 判断两个树是否为镜像 递归的停止条件时什么? 当有一个节点为null时递归停止,或判断到一半确定有节点不一样即非对称树 若前边所有判断都为true 到最后左右节点都为空 则true 当两节点的值不相等 false; 从某层到下一层的关系是什么? 要想两棵树镜像,那么一棵树左边的左边要和二棵树右边的右边镜像,一棵树左边的右边要和二棵树右边的左边镜像,下一层左左是否等于右右,左右是否等于右左。 class Solution

2022-02-11 22:26:20 172

原创 Leetcode:旋转字符串,String相关用法

//查找字符串中下标为index的字符,返回一个字符:System.out.println("student".charAt(0)); //输出:s//按照字典顺序比较两个字符串大小:System.out.println("abc".compareTo("abc")); //输出:0//判断前面的字符串是否包含后面的字字符串:System.out.println("hello World".contains("hello")); //输出:truepublic String tri.

2022-02-10 21:01:47 68

原创 Leetcode:双向链表的复制,Map的相关用法

Map的相关用法map中的值成对存在 Key-valueMap中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。HashMap<K,V>:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。LinkedHashMap<K,V>:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可

2022-02-10 20:53:50 128

原创 Leetcode:双栈实现队列(LinkedList)

栈:先进后出队列:先进先出Java中实现栈和队列操作都可以通过使用LinkedList类LinkedList相关用法//获取链表元素List.getFirst(); ​List.getLast(); ​//泛型有多少个元素 .length()方法是针对字符串String.size(); while(!A.isEmpty()){//遍历 }//获取子链表.subList(int index,int index); //添加链表元素list.add("D");

2022-02-09 15:32:38 256

原创 JVM学习笔记:垃圾回收的相关算法

标记阶段:在堆里激活存放着所有对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有被标记为已死亡的对象,GC才会在执行垃圾回收时释放掉其所占用的内存空间,这个过程称之为垃圾标记阶段标记阶段:引用技术算法对每一个对象保存一个整型的引用计数器属性,用于记录对象被引用的情况对于一个对象A,只要有任何一个对象引用A,则A的引用计数器就+1;当引用失效时计数器就-1。只要对象A的引用计数器的值为0,即表示对象A不能再被使用则可进行回收。优点:实现简单,垃圾对

2022-02-07 16:32:10 173

原创 JVM学习笔记:StringBuilder

String的基本特性 String:字符串,用""引起来表示 String 声明为final,不可以被继承 String实现了Serializable接口,表示字符串时支持序列化的 String实现了Comparable接口,表示String可以比较大小 JDK8之前用char[]存储字符串数据,JDK9改为byte[] String代表不可变得字符序列 字符串常量池中是不会存储相同内容的字符串的 String的 String Pool是一

2022-02-07 16:28:22 217

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除