![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java基础
文章平均质量分 89
寻烟的衣袖
这个作者很懒,什么都没留下…
展开
-
juc并发包之CopyOnWriteArrayList
一. 线程不安全的ArrayList1、为什么说ArrayList是线程不安全的:add()操作抛出数组越界异常;add()操作会丢失元素;set()操作去修改元素,get()操作去获取元素时,可以读到新值也可能读到旧值,无法保证一致性。源码分析:public boolean add(E e) { //确定添加元素之后,集合的大小是否足够,若不够则会进行扩容 ensureCapacityInternal(size + 1); // Increments modCount!!原创 2022-04-14 22:07:46 · 585 阅读 · 0 评论 -
redis详解
什么是 RedisRedis的全称是:Remote Dictionary.Server,本质上是一个Key-Value 类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis 的性能非常出色,每秒可以处理超过 10 万次读写操作,是已知性能最快的Key-Value DB。Redis 的出色之处不仅仅是性能,Redis 最大的魅力是支持保存多种数据结构,此外单个 value 的最大限制是 1GB,原创 2022-04-06 15:38:19 · 1255 阅读 · 0 评论 -
Rocketmq详解
什么是RocketmqRocketMQ是一款分布式、队列模型的消息中间件,具有以下特点1、’能够保证严格的消息顺序2、提供丰富的消息拉取模式3、高效的订阅者水平扩展能力4、实时的消息订阅机制5、亿级消息堆积能力二、核心概念Producer: 消息生成者,负责消息产生,由业务系统负责产生。Consumer:消息消费者,负责消费消费,由后台业务系统负责异步消费。Push Consumer:Consumer的一种,应用通常向Consumer对象注册一个Listener接口,一旦接收到消息,Co原创 2022-04-04 15:40:29 · 7072 阅读 · 0 评论 -
jvm实例,tomcat容器,spring容器,在内存中的关系和tomcat的类加载机制
jvm实例,tomcat容器,spring容器,在内存中的关系问题:1.一个java项目对应一个jvm 吗?2.tomcat里面加载多个java项目 ,是不是用了一个jvm?3.java项目中的spring容器,部署到tomcat容器,启动tomcat以后的jvm实例 ,在内存中是怎么一个包含关系?1、集群环境可能是多个jvm2、一个java进程就是一个jvm,main方法启动的,而同一个tomcat的多个web应用都在一个jvm里3、jvm包含tomcat运行环境,tomcat加载了应用上原创 2022-04-03 15:17:31 · 1037 阅读 · 0 评论 -
ReentrantReadWriteLock详解
之前长时间的面试暴露了一些知识面不够深入,其中一块是ReentrantReadWriteLock读写锁方面,一直没有时间来深入学习,这次补上,关于ReentrantLock的内容可以看一下我前面的文章Java锁详解,里面第二部分详细的介绍了ReentrantLock,废话不多说,直接开始从前面一文Java锁详解中,分析了以非阻塞同步算法为基础实现的可重入独占锁ReentrantLock。所谓** “独占” 即同一时间只能有一个线程持有锁。而 “重入” **是指该线程如果持有锁,可以在同步代码块内再次请求占原创 2022-03-24 21:31:35 · 842 阅读 · 0 评论 -
mybaties是如何创建代理的
问题:mapper层和我们平时说的dao层指的是同一个内容,都是数据库操作的封装,但是在没有集成mybatis时,dao层的接口都是需要我们手动去写其实现类,可在springboot集成中我们却发现:我们并没有手动去实现Mapper接口,但工程却能实实在在的查询数据库,获取我们需要的数据,那么问题来了,mybatis是何时、何地、如何生成mapper代理实例的呢?Mybatis的自动配置类:MybatisAutoConfiguration,至于如何加载此类,可参考:spring-boot-2.0.3启动原创 2022-03-15 21:25:18 · 2384 阅读 · 0 评论 -
动态规划详解
面试过程动态规划题没做出来,痛定思痛,决心弄明白这个过去一直没有解决的问题原链接:https://www.cnblogs.com/zhangfuxiao/p/11369230.html自己总结后的题目:1、跳台阶题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。实现代码:本质是斐波那契函数,不多讲class Solution {public: int jumpFloorII(int number) {原创 2022-02-27 21:55:29 · 343 阅读 · 0 评论 -
CPU过载、内存溢出分析
CPU过载、内存溢出问题一般出现在线上项目中,因为开发环境用户量和数据量都很小,即使你的代码有问题也不会爆发出来。线上出现这样的问题是比较严重的,需要认真对待,妥善解决。问题原因造成这样问题有两个大类型的原因:一,性能问题,高并发高访问情况下线程太多,内存不够用;这个时候体现了多线程的一个危害,cpu过载而且可能内存溢出二,代码问题,如代码中有死循环、一次查询数据量太大、存在太多对象引用内存无法回收(如集合里有大对象没有回收),数据库死锁等。使用top, free, uptime等命令查看CPU、原创 2022-02-25 14:26:30 · 3589 阅读 · 0 评论 -
linux load average负载详细解释
转载至linux load average负载详细解释CPU利用率和load averageCPU利用率,就是对于CPU的使用状况,这是对一个时间段内CPU使用状况的统计,通过这个指标可以看出在某一个时间段内CPU被占用的情况,如果被占用时间很高,那么就需要考虑CPU是否已经处于超负荷运作,长期超负荷运作对于机器本身来说是一种损害,因此必须将CPU的利用率控制在一定的比例下,以保证机器的正常运作。Load Average是CPU的Load,它所包含的信息不是CPU的使用率状况,而是在一段时间内CPU正转载 2022-02-24 14:46:30 · 5346 阅读 · 0 评论 -
动态代理详解
一直没弄明白动态代理实现原理,这次弄清楚一、动态代理的区别动态代理分为JDK的动态代理和cglib动态代理。JDK的动态代理只能针对实现了接口的类生成代理。而cglib的动态代理是针对类实现代理,这两种代理我们可以灵活使用。我们通过汽车跑的例子来解读这两种动态代理。JDK动态代理...原创 2022-02-16 17:11:20 · 778 阅读 · 0 评论 -
序列化的那点东西
一直没太明白序列化的细节,这次弄懂它1、什么是序列化们有时候将一个java对象变成字节流的形式传出去或者从一个字节流中恢复成一个java对象,例如,要将java对象存储到硬盘或者传送给网络上的其他计算机,这个过程我们可以自己写代码去把一个java对象变成某个格式的字节流再传输,但是,jre本身就提供了这种支持,我们可以调用OutputStream的writeObject方法来做,如果要让java 帮我们做,要被传输的对象必须实现serializable接口,这样,javac编译时就会进行特殊处理,编译的原创 2022-02-10 11:11:03 · 81 阅读 · 0 评论 -
hessian序列化原理分析
参考官方文档的描述,下面做一些简要描述,http://hessian.caucho.com/doc/hessian-serialization.html。1、它必须自我描述序列化类型,即不需要外部模式或接口定义2、它必须是独立于语言的,包括支持脚本语言3、它必须是可以通过单一方式进行读写4、它必须尽可能紧凑5、它必须简单,这样才能有效地测试和实现6、必须尽可能地快7、它必须支持Unicode字符串8、它必须支持8位二进制数据,而不需要转义或使用附件9、它必须支持加密、压缩、签名和事务上下文原创 2021-05-18 22:09:21 · 1072 阅读 · 5 评论 -
IO流的分类及用法原理
IO流的操作在工作中由于都是工具类来完成,导致一直对其理解不够深,想写篇文章来学习下,分类如下:一、IO流的概念Java的IO流是实现输入/输出的基础,它可以方便地实现数据的输入/输出操作,在Java中把不同的输入/输出源抽象表述为"流"。流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。流有输入和输出,输入时是流从数据源流向程序。输出时是流从程序传向数据源,而数据源可以是原创 2021-05-18 21:46:33 · 655 阅读 · 0 评论 -
lambada用法
public class LambadaTest {public static void main(String[] args) {Student s1 = new Student(“张三”,12);Student s2 = new Student(“张2”,13);Student s3 = new Student(“张四”,13);Student s4 = new Student(“张5”,15);List list = new ArrayList<>();List list2原创 2021-04-07 17:16:49 · 504 阅读 · 0 评论 -
@SneakyThrows注解
@SneakyThrows注解的用途得从java的异常设计体系说起这是异常的类图。Throwable是Error和Exception的父类,用来定义所有可以作为异常被抛出来的类。UML图如下:说明1.Error和Exception区分:Error是编译时错误和系统错误,系统错误在除特殊情况下,都不需要你来关心,基本不会出现。而编译时错误,如果你使用了编译器,那么编译器会提示。Exception则是可以被抛出的基本类型,我们需要主要关心的也是这个类。Exception又分为RunTimeEx原创 2021-04-07 15:50:55 · 108926 阅读 · 2 评论 -
线程启动的那些方式以及源码分析
Runnble先说说Runnable接口:package cic.threadpractice;public class RunnbaleTest implements Runnable { @Override public void run() { System.out.println(Thread.currentThread().getName()); } public static void main(String[] args) {原创 2020-10-28 17:20:08 · 260 阅读 · 0 评论 -
Unsafe对象 之LockSupport方法原理剖析
LockSupport 和 CAS 是Java并发包中很多并发工具控制机制的基础,它们底层其实都是依赖Unsafe实现为什么使用LockSupport类如果只是LockSupport在使用起来比Object的wait/notify简单,那还真没必要专门讲解下LockSupport。最主要的是灵活性。上边的例子代码中,主线程调用了Thread.sleep(1000)方法来等待线程A计算完成进入wait状态。如果去掉Thread.sleep()调用,代码如下:public class TestObjW原创 2020-10-28 15:36:11 · 453 阅读 · 3 评论 -
spring mvc拦截器,spring拦截器以及AOP切面的区别和源码
SpringMVC 拦截器执行时机对于springmvc,有两种方式配置拦截器。一是实现HandlerInterceptor接口,如public class MyInterceptor1 implements HandlerInterceptor { //该方法在action执行前执行,可以实现对数据的预处理, // 比如:编码、安全控制等。如果方法返回true,则继续执行action。 @Override public boolean preHandle(HttpSe原创 2020-09-28 16:22:34 · 2567 阅读 · 0 评论 -
动态代理详解
jdk动态代理实例:动态代理有两个对象,目标对象和代理对象。使用JDK动态代理,目标对象必须实现一个接口。public class JdkDynamicProxyTest { interface IPerson { void say() ; } static class Person implements IPerson { @Override public void say() { System.out原创 2020-09-28 15:51:58 · 160 阅读 · 0 评论 -
MySQL的事务以及锁详解
老铁有一提问“MySQL的可重复读级别能解决幻读吗”,一听就有猫腻,实话说,之前从未思考到这个问题,很是懵逼,于是深入查看,发现了自己的细节欠缺是在太多,补上!事务基础知识:数据库原理理论事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。在关系数据库中,一个事务可以是一组SQL语句或整个程序。原创 2020-08-20 21:55:19 · 2465 阅读 · 2 评论 -
Map接口以及那些实现类
从今天开始,我的博客更新将围绕着老铁每天面试的问题开始,哈哈,直接进入昨天老铁问倒我的第二个问题:hashLinkedMap,但是顺便加上了几个常问的进行总结:hashmap:java1.7 hashMap 底层实现是数组+链表java1.8 对上面进行优化 数组+链表+红黑树2.hashmap 是怎么保存数据的。Node结构:static class Node<K,V> implements Map.Entry<K,V> { final in原创 2020-08-18 22:03:47 · 620 阅读 · 0 评论 -
懒汉单例
昨个被老铁一句问题给问蒙了,懒汉单例存在什么问题,一看挺简单的啊,校招就经常看这种的吗,当时想的是双重锁安全的那些,但老铁的回答并不是线程安全方面的问题,于是我意识到了这里肯定是有猫腻的,认真查了下资料,做了下总结:从头开始看问题:package com.roocon.thread.t5;public class Singleton2 { private Singleton2(){ } private static Singleton2 instance; p原创 2020-08-18 10:38:28 · 130 阅读 · 0 评论 -
Final关键字
发现自己对final关键字的了解很少,这次专门做个话题进行学习讲解final关键字的基本用法在Java中,final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)。下面就从这三个方面来了解一下final关键字的基本用法。1、修饰类当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。2、修饰方法p原创 2020-06-01 16:38:00 · 125 阅读 · 0 评论 -
JMM模型(内存模型)、总线锁、缓存锁
这段时间面试对JMM模型有点模糊了,重新写篇文章并整理回忆下讲JMM,模型之前。先说下基本知识:CPU内部结构划分cpu分为:控制单元、运算单元、存储单元计算机多硬件多CPU结构:计算机核心组件:CPU、内存、I/O设备,三者在处理速度上存在巨大差异,CPU速度最快>内存>I/O设备(磁盘)。为了提升计算性能,CPU从单核提升到了多核,甚至用到了超线程技术最大化提高CPU处理性能,如果后两者处理性能没有跟上,意味着整体的计算效率取决于最慢的设备。为了平衡三者之间的速度差异,最大化原创 2020-05-30 21:54:35 · 1726 阅读 · 0 评论 -
java 类生命周期详解 以及初始化和实例化的区别
java生命周期其实看了不少遍了,但每次重新看都会有新的收获,这次因为探讨spring里的一些原理,让我又重新回顾一下java生命周期的过程:java类的生命周期:一个class文件从加载到卸载的全过程,类的完整生命周期包括7个部分:加载——验证——准备——解析——初始化——使用——卸载,如下图所示其中,验证——准备——解析 称为连接阶段,除了解析外,其他阶段是顺序发生的,而解析可以与这些阶段交叉进行,因为Java支持动态绑定(晚期绑定),需要运行时才能确定具体类型;在使用阶段实例化对象...原创 2020-05-23 16:55:46 · 992 阅读 · 0 评论 -
jvm内存详解以及类加载,对象的生命周期过程
jdk1.8内存示意图:好的,说完内存结构,我们再说下文件加载与运行:JVM = 类加载器 classloader + 执行引擎 executionengine + 运行时数据区域 runtime data area首先Java源代码文件被Java编译器编译为字节码文件,然后JVM中的类加载器加载完毕之后,交由JVM执行引擎执行。在整个程序执行过程中,JVM中的运行时数据区(内存)会用来存储程序执行期间需要用到的数据和相关信息。因此,在Java中我们常常说到的内存管理就是针对这段空间进行管理..原创 2020-05-18 17:48:06 · 432 阅读 · 0 评论 -
String创建内存的分配以及方法区常量池之间的关系
最近在查重温vm内存的结构的过程中,发现了有些地方不曾知道的东西,就是常量池随着jdk版本由1.6到1.7再到1.8内存结构也随之发生了一些改变,这里我单独领出来string作为字符常量池的代表,将这个改变讲下先说下基本的知识点:String在正常的内存分配:1,String str1 = “hello”;2,String str2 = new String(“hello”);第一种方法:引用str1被存放在栈区,字符串常量"hello"被存放在常量池,引用str1指向了常量池中的"hello"(原创 2020-05-18 17:41:17 · 347 阅读 · 0 评论 -
Java锁详解
synchronized实现原理Java对象头:synchronized是悲观锁,在操作同步资源之前需要给同步资源先加锁,这把锁就是存在Java对象头里的,而Java对象头又是什么呢?我们以Hotspot虚拟机为例,Hotspot的对象头主要包括两部分数据:Mark Word(标记字段)、Klass Pointer(类型指针),数组长度(只有数组对象才有)。Mark Word:默认存储对象的HashCode,分代年龄和锁标志位信息。这些信息都是与对象自身定义无关的数据,所以Mark Word被设计原创 2020-05-17 17:36:41 · 1901 阅读 · 0 评论 -
Object类的那些方法
最近由于作为一个面试官,发现很多底层源码都给忘了,也发现了很多自己的不足,重新来探究下一些基本的类以及其方法,这次就先看看基本的Object类吧public class Object { 1、private static native void registerNatives(); @HotSpotIntrinsicCandidate public Object() { } @HotSpotIntrinsicCandidate 2、public fina原创 2020-05-15 23:03:01 · 122 阅读 · 0 评论