
java
砥砺-前行
努力路上前行
展开
-
java 面试宝典
1.类的加载过程:一个类的加载到执行总共两个过程,编译和执行,编译就是把我们的java文件编译成.class字节码文件,执行就是把.class加载进内存并解析生成对象的过程主要阶段有5个 加载 连接 初始化 使用 销毁加载 通过类加载器(双亲委派机制)将class文件加载到内存中去连接 分为 验证 准备 解析三个阶段 验证就是验证字节码是否符合文件规范(文件格式,元数据,字节码,符号引用),准备阶段主要是为变量分配内存并赋初值,解析就是将常量池的符号引用替换为直接引用初始化 执行类构造原创 2022-02-21 00:07:13 · 1361 阅读 · 1 评论 -
bio nio aio
1.bio同步阻塞,就是客户端与服务没发送一个通信就需要创建一个线程完成实现原理:bio 几个关键词acceptor监听客户端与服务端的每个请求,就是典型的一问一答模式,客户数量增多就需要频繁的创建和销毁线程,给服务器造成巨大的压力,后期呢改成用线程池的模式,bio 通信呢主要是通过socket,socketserver,实现通行2.nio 同步非阻塞客户端和服务端之间通过通道建立通信,nio可以在channal中实现读写通能,然后将这些通道注册到多路复用器上(selector),selector通过原创 2022-02-19 22:58:46 · 300 阅读 · 0 评论 -
redisson分布式锁,分布式事物
redis 分布式锁加锁机制如果一个客户需要加锁,且客户端面对的是一个redis集群,则客户端会根据hash值获取一台机器来进行加锁,会发送一大段lua脚本进行执行,保证代码的原子性(首先判断锁是否存在,添加一个锁到redis中,最后设置过期时间)锁互斥机制当第二个客户端来访问的时候通过判断发现锁已经存在,则判断当前客户端是否存在,显然是不存在的,客户端二则进入while循环阶段,尝试加锁watch dog 自动延时机制默认的锁的生存时间为30秒,如果超过30秒,客户端1还想拥有当前锁原创 2022-02-16 16:59:30 · 1202 阅读 · 0 评论 -
AQS原理及使用
AQS简介aqs的全称AbstractQueuedSynchronizer,抽象队列同步器AQS 核心原理核心变量state,是int类型代表加锁的一个状态还有一个变量记录当前加锁的线程,线程运行,通过cas操作,来修改state状态,state加1,操作线程设置为当前线程,每次都会判断操作线程是否是当前线程,如果是就加1 不是就继续等待,重入锁(state=2)假如说其他线程来访问发现已经加锁了 ,则放入队列中等待执行,(所以aqs还有个关键变量是消息队列,来存放加锁失败的对象)操作完成就会原创 2022-02-16 14:44:25 · 266 阅读 · 0 评论 -
Atomic原子类及底层原理
Atomic简介在多线程同时操作一个变量的时候,类似++这种方式,用锁就显得大材小用了,所以用到了atomic原子类,可以保证在多线程的情况下,安全高性能的执行程序更新变量,atomic原子类的底层不是传统意义上的锁机制,而是无锁化的cas机制,CAS 全称compare and set 比较后再设置简单理解就是多线程操作的情况下先获取一个值,看谁先发起cas操作,判断时候和获取的时候值一样 如果一样就修改值,如果不一样就重新获取再进行修改jdk1.8之前内就是通过cas机制不断地循环判断,这样在并原创 2022-02-16 14:23:55 · 1454 阅读 · 0 评论 -
volatile作用及原理
1.背景在java的内存模型中,每个线程都有自己的工作内存,同时还共享一个主内存。假如说有两个线程要读取同一个变量的时候,首先需要把值放到自己工作内存中,这样执行的时候就可以直接使用缓存值了 不需要读取主内存中的值了,但是这样有一个问题就是多线程的时候,其中一个线程修改了值之后无法同步到其他线程中,所以需要修改之后刷到主内存中去,这就是可见性volatile关键字:可见性:1.当线程1修改了变量之后会强制刷新主内存中的值,2.如果有其他线程有使用这个变量,就会强制让其他线程工作内存中的这个值时效原创 2022-02-16 13:58:23 · 233 阅读 · 0 评论 -
设计模式(单例模式)
1.基础式单例模式(线程不安全)public class Singleton { private static Singleton singleton; public Singleton() { } public static Singleton getInstance() { if (singleton == null) { singleton = new Singleton(); } retur原创 2022-02-14 16:07:55 · 164 阅读 · 0 评论 -
java多线程实现顺序执行
1.使用线程的join方法 public static void main(String[] args) { final Thread t1 = new Thread(new Runnable() { @Override public void run() { System.out.println("起床"); } }); final Thread t2原创 2022-02-14 15:07:45 · 1939 阅读 · 0 评论 -
redis详解
redis 数据库支持的类型1.string:键值对2.list:队列3.set:可重复队列4.hash:类似map5.zset:有序集合6.hyperloglog:统计基数7.geo:地图镜像8.pub/sub:消息订阅,消费redis持久化方式aof 持久化是以日志的方式记录服务器增删改操作,是通过追加的方式实现的,aof持久化有三种策略 每秒 每次 不记录 这样效率会有点影响,恢复数据的时候慢。rdb 指定时间内将内存中的数据写入磁盘,优势是在数据备份方面是一个非常不错的选择原创 2021-08-20 10:31:28 · 162 阅读 · 0 评论 -
springboot集成easyExcel
1.excel的上传下载,我们调用普通的解析excel的jar包比较复杂而且使用非常不方便,集成easyexcel之后在 springboot中如鱼得水,开发时长大大缩短时间集成首先导入maven包<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <versio原创 2021-08-20 10:27:39 · 840 阅读 · 0 评论 -
设计模式(模板模式)
模板模式个人的理解在java中的使用场景更适合于一个固定模式的加载流程,定义一个模式,流程固定,通过抽象类方式 通过继承来不同的实现,例如加载配置文件,加载的流程是一样的 只是具体的实现不同上代码package com.jvm.模板模式;public class Main1 { public static void main(String[] args) { 架构类型 aa=new 用户(); aa.jiazai(); }}package原创 2021-06-21 10:03:51 · 148 阅读 · 0 评论 -
设计模式(策略模式)
策略模式和工厂模式很相似,但是确实有不同的地方,从我的理解看工厂模式一切都是封装好的,只能调用,策略模式更倾向通过当前状况去创建不同的类处理策略模式一种行为模式首先需要一个接口和工厂模式一样,举个例子刘备去江东,诸葛亮给力三个精囊妙计,package com.jvm.策略模式;public interface 策略模式 { void handler(String name);}package com.jvm.策略模式;public class 锦囊1 implements 策略模原创 2021-06-18 18:41:07 · 286 阅读 · 0 评论 -
设计模式(抽象工厂模式)
抽象工厂模式介绍及应用场景抽象工厂模式从个人理解上来说适应的场景就是我们所做的事情有相同的也有不同的地方,例如:造飞机,造火车,造汽车相同的地方我们都可以造轮子,车身,但是造飞机得造跑道,造机翼,造火车得造铁轨,汽车得造铁轨,造汽车就要汽车工厂,造火车需要火车工厂,造飞机需要飞机制造厂,...原创 2021-06-18 16:10:17 · 264 阅读 · 0 评论 -
相似实体类赋值
我们经常会遇到实体类赋值的情况,尤其是两个实体类有很多相似的变量,如果想传递参数一般只能 通过get set方法一个个赋值在springframework提供了赋值的工具类 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <原创 2021-06-15 14:52:07 · 984 阅读 · 0 评论 -
设计模式(工厂模式)
1.工厂模式简介纯粹个人理解,工厂模式更适合使用在 同一类型的东西,都有自己独特的数据,例如:车辆(大巴,小轿车,货车)车辆由轮子,车身,车座,发动机组成,但是不同车的轮子,车身,发动机时不一样的,所以我们就可以使用工厂模式来生产不同的车型。首先我们先定义一个能实现造车的接口,接口的方法有 造轮子,造车身,造车座,造发动机package com.jvm;public interface 造车接口 { void 造轮子(); void 造车身(); void 造车座();原创 2021-06-10 20:18:49 · 858 阅读 · 0 评论 -
布隆过滤器
布隆过滤器在好多地方用的到,例如大量数据去重操作,redis中的防止击穿等。布隆过滤器的优点是占用空间少,缺点是有可能会有重复数据,所以在绝对严谨的重复判断操作情况下 简单的布隆过滤器是无法使用的,而且无法进行删除操作,因为里面保存的是hashcode码 并不是具体数据,下面将通过java实现简单的布隆过滤器package com.jvm;import java.util.BitSet;public class BlooFilter { private static final int C原创 2021-06-08 18:55:06 · 851 阅读 · 0 评论 -
springboot+netty 服务端
搭建服务端启动类在springboot中利用netty替换tomcat,关闭tomcat与banner。添加扫描注解 import org.springframework.boot.Banner;import org.springframework.boot.WebApplicationType;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.原创 2021-06-07 14:47:20 · 1741 阅读 · 0 评论 -
mysql事物
事物的四种特性(ACID)1.原子性事物是数据库的逻辑最小单位,要么都执行,要么都不执行2.一致性事物执行的结果必须从一个一致性状态到另一个一致性状态,如果数据库只包含事物提交成功后结果,就保持了数据的一致性,如果中途某一阶段提交失败,事物就不是一致性了3.隔离性事物之间是相互隔离的,互不影响4.持续性事物提交之后,数据库数据就永久性保存,对后面的事物执行不产生影响事物的四种隔离级别1.读取未提交数据所有事物可以看到其他事物未提交的执行结果,也就是读取未提交的数据(脏读)2.读取提交原创 2021-06-07 14:34:46 · 878 阅读 · 0 评论 -
jvm运行原理及垃圾回收
Java代码编译是由Java源码编译器来完成,流程图如下所示:Java字节码的执行是由JVM执行引擎来完成,流程图如下所示这部分比较复杂,涉及特别底层的执行过程,不在此做出解释,一个.java文件到.class文件,到jvm加载类的一个过程。类的加载过程加载类加载阶段就是由类加载器负责根据一个类的全限定名来读取此类的二进制字节流到JVM内部,并存储在运行时内存区的方法区,然后将其转换为一个与目标类型对应的java.lang.Class对象实例,简单理解就是查找class文件并加载方法区。原创 2021-05-31 15:30:55 · 1151 阅读 · 1 评论 -
链表增删查(数据结构)
链表的添加 头插法 尾插法 ,某个字段前 后添加元素,删除元素package com.jvm;import lombok.ToString;@ToStringpublic class LinkList<T extends Comparable<T>> { private Node<T> head; private int size; public LinkList() { this.head = new Node&原创 2021-05-26 15:51:42 · 1086 阅读 · 0 评论 -
字典树的实现与应用
字典树概念字典树(TrieTree),又称单词查找树或键树。字典树的基本特性,根节点是不包含信息的,根节点到叶子节点之间的信息连接起来就是数据的所有信息,每个节点子节点的信息时不一样的。2.字典树java实现先定义每个节点package com.jvm;import lombok.Data;import java.util.Arrays;import java.util.HashMap;import java.util.Map;@Datapublic class DictT.原创 2021-05-24 10:32:27 · 1404 阅读 · 0 评论 -
java锁的概念
悲观锁 / 乐观锁悲观锁是当并发操作数据的时候为了防止自己在编辑数据的时候别人也在修改数据就会对操作的对象加锁,个人理解悲观是因为不管是否有其他线程在修改此数据都会加锁,其缺点是造成性能的损耗乐观锁是当并发操作的时候并不会直接对操作数据加锁,不管其他线程是否在操作当前数据都不会加锁,而是在提交数据的时候发现数据被修改了通过重试的方式来提交数据。公平锁 / 非公平锁公平锁自然是遵循FIFO(先进先出)原则的,先到的线程会优先获取资源,后到的会进行排队等待,而非公平锁是不遵循这个原则。重入..原创 2021-05-20 11:44:30 · 1116 阅读 · 0 评论 -
java线程池详解(源码)
为什么推荐用ThreadPoolExecutor创建线程池,而不用默认提供的四种线程池FixedThreadPool 和 SingleThreadPool:允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM。CachedThreadPool 和 ScheduledThreadPool:允许的创建线程数量为 Integer.MAX_VALUE,可能会创建大量的线程,从而导致 OOM。所以建议用ThreadPoolExecutor创建线程池,用.原创 2021-05-19 18:45:14 · 1186 阅读 · 0 评论 -
Hashmap源码详解
1.通常我们会Map map=new HashMap();查看new的时候hashmap源码:构造一个空的hashmap 负载因子为0.75 初始容量为16 ,负载因为为什么是0.75 按我理解其实就是从统计学上得到的一个比较通用的参数,初始容量为什么是16在下面说 /** * Constructs an empty <tt>HashMap</tt> with the default initial capacity * (16) a.原创 2021-05-18 18:41:17 · 1116 阅读 · 0 评论 -
JVM 双亲委派模型
从虚拟机的角度来讲只有两种加载器一种是启动类加载器,另一种是其他类的加载器,但是他也是继承启动类加载器的从java来讲有三种加载器启动(Bootstrap)类加载器:启动类加载器是用本地代码实现的类加载器,它负责将JAVA_HOME/lib下面的核心类库或-Xbootclasspath选项指定的jar包等虚拟机识别的类库加载到内存中。由于启动类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用。具体可由启动类加载器加载到的路径可通过System.getProperty(“sun.bo原创 2021-05-12 17:16:41 · 1078 阅读 · 0 评论 -
为什么要重写hashCode()方法和equals()方法
1.首先我们看下object源码中如何定义hashcode与equals方法的public native int hashCode();public boolean equals(Object obj) { return (this == obj); }Object类中的hashCode()方法,用的是native关键字修饰,说明这个方法是个原生函数,也就说这个方法的实现不是用java语言实现的,是使用c/c++实现的,并且被编译成了DLL,由java去调用,jdk源码中不原创 2021-05-12 17:00:36 · 1420 阅读 · 3 评论 -
java算法(3)
1.给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。public int[] plusOne(int[] digits) { int base=1; for (int i = digits.length - 1; i >= 0; i--) { int num=digits[i]+base; digits[i]=num%10; base=num/10;原创 2021-04-07 16:46:34 · 1048 阅读 · 0 评论 -
java 算法(二)
1.回文数class Solution { public boolean isPalindrome(int x) { if (x == 0) return true; if (x < 0|| x % 10 == 0) return false; int fanzhuan = 0; while (x > fanzhuan) { fanzhuan = fanzhuan * 10 +原创 2021-03-30 11:44:24 · 1116 阅读 · 0 评论 -
java 算法题(1)
public static void main(String[] args) { //给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。 int target = 12; int[] aa = {3, 6, 4, 8, 22}; for (int i = 0; i < aa.length; i++) { int base = ta..原创 2021-03-15 18:12:26 · 1174 阅读 · 1 评论 -
idea 插件 通过mysql生成controller,model,mapper,service
1.下载插件EasyCode-mybatiscod2. 安装完成重启连接数据库3. 重启完成后 选中所要生成的表选择 文件生成路径4. 通过修改模板样式生成自己想要的文件格式entity模板##引入宏定义$!define##使用宏定义设置回调(保存位置与文件后缀)#save("/entity", ".java")##使用宏定义设置包后缀#setPackageSuffix("entity")##使用全局变量实现默认包导入$!autoImpor.原创 2020-07-07 12:10:10 · 2777 阅读 · 0 评论