![](https://img-blog.csdnimg.cn/20200624104652705.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java
Java学习笔记
Forlogen
无论世事如何,你都要成为一个更优秀的人。
展开
-
2020 - [Java基础 +多线程 + 虚拟机] + [计网 + 操作系统] + [MySQL] + [Redis] + [RocketMQ] + [Spring]常见面试题与解析
文章目录@[toc]Java基础1. Java中使用字节码的好处?2. Java和C++的区别:3. 字符常量和字符串常量的区别?11. BIO、NIO和AIO有什么区别?12. HashMap和HashTable的区别?important13. 重写和重载的不同?14. 线程的创建方式有哪些?note15. Java中的fail-fast和fast-safe机制什么意思?16. HashMap是如何得到key在哈希桶数组中的位置?17. HashMap扩容操作是怎么执行的?18. throw和throws原创 2020-09-30 09:20:22 · 753 阅读 · 0 评论 -
synchronized实现原理和底层优化解读
文章目录1. 线程安全问题2. 概念2.1 基本语法2.2 锁对象3. Monitor3.1 对象内存布局3.2 对象头3.3 monitor4 重量级锁原理5. 偏向锁原理6. 轻量级锁原理7. 锁膨胀8. 自旋优化9. 锁粗化、锁消除1. 线程安全问题当多个线程对同一个共享变量执行操作时,就可能会出现线程安全问题。例如,下面的代码对共享变量count执行操作,其中线程t1执行自增,线程t2执行自减:/** * @Author dyliang * @Date 2020/8/18 23:03原创 2020-08-26 10:40:18 · 263 阅读 · 0 评论 -
通过线程八锁问题融会贯通synchronized关键字的使用
文章目录1. 一锁2. 二锁3. 三锁4. 四锁5. 五锁6. 六锁7. 七锁8. 八锁线程八锁凯有八门遁甲之术,你晓得线程八锁问题吗?赶紧来看一下吧~1. 一锁class Number{ public synchronized void a() { log.debug("1"); } public synchronized void b() { log.debug("2"); }}public static void m原创 2020-08-25 22:43:32 · 193 阅读 · 0 评论 -
线程安全的ConcurrentHashMap源码走读与分析
文章目录1. 引入2. ConcurrentHashMap in Jdk 1.72.1 底层结构2.2 类定义2.3 字段(属性)2.4 构造方法2.5 put2.6 get2.6 remove2.7 size2.8 rehash3. ConcurrentHashMap in Jdk 1.83.1 底层结构3.2 定义 + 字段3.2 构造方法3.3 get3.4 put3.5 size3.6 transfer4. 参考刚不动啦,后续再逐步细化理解吧,毕竟一次性理解所有的细节也不可能~1. 引入原创 2020-08-22 21:38:47 · 174 阅读 · 0 评论 -
Java线程池技术及Executor框架的原理和使用
文章目录1. 引入2. 使用2.1 创建线程池2.2 提交任务2.3 关闭线程1. 引入线程池指一个可容纳多个线程的容器,其中的线程可反复使用,节省了创建和销毁线程的开销。使用线程池的好处有:降低资源消耗:通过重复的利用已创建的线程可以降低线程创建和销毁造成的资源消耗提高响应速度:当任务达到时,任务无需自己创建线程就能立即执行提高线程的可管理性:使用线程池可以实现对于线程的统一分配、监控和调优线程池整个的执行逻辑如下:文字化表述为:线程池中刚开始没有线程,当一个任务提交给线程池后原创 2020-08-22 00:11:12 · 306 阅读 · 0 评论 -
Java原子操作类
文章目录1. 原子更新基本类型2. 原子更新数组3. 原子更新引用类型4. 原子更新字段类java.util.concurrent.atomic包提供了多类用法简单、性能高效、线程安全的原子操作类。主要包含以下四种类型:原子更新基本类型原子更新数组原子更新引用原子更新属性(字段)1. 原子更新基本类型其中原子更新基本类型主要是如下三个类:AtomicBoolean:原子更新布尔类型AtomicInteger:原子更新整型AtomicLong:原子更新长整型其中Atomi原创 2020-08-21 20:57:00 · 163 阅读 · 0 评论 -
Java线程内存模型
文章目录1. 硬件内存模型2. Java内存模型(Java Memory Model)3. 内存模型交互操作4. 三大特性4.1 原子性4.2 可见性4.3 有序性5. 参考这里熟悉Java内存模型的目的是为了后续对于多线程和并发问题的理解,以及相关源码的走读打下基础。1. 硬件内存模型操作系统和Spring Boot中的缓存及实现原理源码解读硬件层面的内存模型指的就是操作系统中的内存模型,在上面的文章中已经讲到了部分关于操作系统中CPU缓存层面的内容,下面只简要总结一下。多级内存模型或是原创 2020-08-19 21:15:00 · 180 阅读 · 0 评论 -
Java中的fail-fast和fast-safe机制
文章目录1. 引入2. fail-fast3. fail-safe1. 引入不管是在ArrayList、Hashtable还是HashMap的源码中,我们在属性字段都可以看见modCount字段的存在。它用来表示集合修改的次数,例如当执行put操作时就会将modCount加1,都是在其他常用的方法中并没有看到它的具体使用。而它却是fail-fast和fast-safe机制的一种重要参考值,下面就了解一下这两种机制,以及modCount在其中所起到的作用。并发修改:当一个或多个线程正在遍历一个集合C原创 2020-08-17 16:23:44 · 1061 阅读 · 0 评论 -
线程安全的Hashtable + synchronizedMap源码剖析
文章目录1. Hashtable1.1 字段1.2 构造方法1.3 get方法1.4 put方法1.3 rehash方法1.5 安全性1.6 实例2. synchronizedMap2.1 字段、构造方法2.2 get和put方法前面已经学习了HashMap的底层实现原理,并且从源码的角度详细的分析了其中的属性字段、构造方法、常用的get和put操作,以及扩容机制。HashMap作为一个最为常用的Map接口的实现类,一个广为人知的特点就是:线程不安全。多线程之间的运行可能会导致底层形成循环链表,或者造原创 2020-08-17 15:36:36 · 352 阅读 · 0 评论 -
Java中自定义类为什么一定要重写HashCode和equals方法?
文章目录1. 引入2. 两者都不重写3. 只重写hashCode方法4. 只重写equals方法5. 原理分析1. 引入当想要往类似HashMap的Map接口的实现类对象中存放Java中的包装类对象,例如String、Integer等时,我们可以直接存取,例如:@Testpublic void testString(){ HashMap<Integer, String> map = new HashMap<>(); map.put(10, "Kobe");原创 2020-08-14 11:21:50 · 1933 阅读 · 1 评论 -
深入浅出的理解ArrayList、LinkedList和Vector的底层实现原理
文章目录1. List接口2. ArrayList分析2.1 字段2.2 构造函数2.3 常用方法2.3.1 add2.3.2 set2.3.3 get3. LinkedList分析3.1 字段3.2 构造方法3.3 常用方法3.3.1 add3.3.2 get3.3.3 set3.3.4 remove3.4 总结4. vector1. List接口List属于单列集合,常用来替换数组使用。集合类中元素有序且可重复,每个元素都有其对应的顺序索引,可以根据指定的索引在集合中存取元素。List接口常用的实原创 2020-07-11 09:57:42 · 750 阅读 · 0 评论 -
深入浅出的理解HsahMap的实现原理及常见面试题
文章目录1. 引入2. Map接口3. 背景知识3.1 数据存储3.2 哈希算法3.3 哈希表4. HashMap实现原理4.1 JDK74.1.1 字段4.1.2 构造函数4.1.3 常用方法4.1.3.1 **put**4.1.3.2 get4.1.3.3 resize4.2 JDK84.2.1 字段4.2.2 构造函数4.2.3 常用方法4.2.3.1 put4.2.3.2 get4.2.3.3 resize5. 细节问题5.1 HashMap中存放自定义对象为什么要重写hashCode和equals原创 2020-07-10 16:38:54 · 481 阅读 · 0 评论 -
简单理解Java中的装箱和拆箱
装箱和拆箱在图形化理解Java中的形参和实参中,我们知道Java中八大基本数据类型,同样也知道了它们各自的取值范围和默认的初始值。那么既然有基本数据类型使用,为什么还要使用包装类呢?Java是一门面向对象的编程语言,而基本数据类型并不具备面向对象的特点,因此包装类的引入是为了让基本类型具有对象的特点;另一方面包装类也方便了泛型的使用。例如:如果希望向ArrayList当中存储基本数据类型,必须使用基本数据类型对应的包装类:基本数据类型默认值包装类默认值byte0Byten原创 2020-07-09 20:24:53 · 230 阅读 · 0 评论 -
从源码实现理解ThreadLocal和InheritableThreadLocal
文章目录1. 简介2. 案例3. Thread类4. ThreadLocal类4.1 set()4.2 get()4.3 remove()4.4 不支持继承性5. InheritableThreadLocal类5.1 createMap()5.2 getMap()5.3 childvalue()6. ThreadLocalMap7. 参考1. 简介线程同步除了使用锁机制外,还可以使用ThreadLocal来避免线程不安全的出现。ThreadLocal提供线程本地变量,如果创建一个ThreadLoca原创 2020-06-22 08:42:15 · 255 阅读 · 0 评论 -
Maven配置教程
文章目录1. 下载2. 环境变量配置3. 修改配置文件4. IDEA中Maven配置1. 下载首先到Apache Maven下载对应版本的Maven,这里选择的是apache-maven-3.6.3-bin.zip下载后直接解压即可。2. 环境变量配置配置Maven前请确保JDK已经安装成功!新建环境变量MAVEN_HOME,对应的变量值为解压文件所在的路径修改Path环境变量,在其中添加MAVEN_HOME最后使用mvn -version在命令行中测试是否安装成功。C:\Us原创 2020-06-20 15:38:41 · 257 阅读 · 0 评论 -
Java中的代理和代理模式
文章目录Java中的代理和代理模式1. 代理模式2. 静态代理3. 动态代理4. 源码分析5. 参考Java中的代理和代理模式1. 代理模式代理模式通过为某个对象提供一个代理来控制对于该对象的访问。代理类主要负责为委托类(真实对象)预处理消息、过滤消息、传递消息给委托类。代理类本身不负责具体的实现,而是利用委托类来完成具体的业务实现,并将执行结果进行封装处理。代理类为委托类进行消息预处理、消息的过滤等操作后,将消息传递给被代理类(委托类),之后还可以进行消息的后处理操作。代理类和委托类通常会存在关原创 2020-06-03 10:53:19 · 354 阅读 · 0 评论 -
Java内存溢出的几种情况
JVM(Java虚拟机)是一个抽象的计算模型。就如同一台真实的机器,它有自己的指令集和执行引擎,可以在运行时操控内存区域。目的是为构建在其上运行的应用程序提供一个运行环境。JVM可以解读指令代码并与底层进行交互:包括操作系统平台和执行指令并管理资源的硬件体系结构。文章目录1. 前言2. 栈内存溢出3. 堆内存溢出1. 前言JVM提供的内存管理机制和自动垃圾回收极大的解放了用户对于内存的管理,大部分情况下不会出现内存泄漏和内存溢出问题。但是基本不会出现并不等于不会出现,所以掌握Java内存模型原..原创 2020-06-01 09:37:07 · 738 阅读 · 1 评论 -
浅析Java中的Optional
Optional是Java8引入的一个用于解决空指针异常的容器,它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。文章目录1. 引入2. 创建Optional实例3. 获取Optional实例值4. 实例转换5. 判断方法6. 获取Stream流7. 完整实验代码8. 参考1. 引入引言中对于Optional做了一个简单的介绍,它的主要是提供了一个解决空指针异常的容器。可能从字面上理解Optional有点懵,下面我们首先从它要解决的问.原创 2020-05-14 19:48:54 · 927 阅读 · 0 评论 -
浅析Java中的Stream流(二)
在前一篇文章浅析Java中的Steam流中讲述了流式思想和Java中更适用于函数式编程的Stream流,以及Stream流中的一些常用方法,如forEach() 、filter() 、map()、count()、limit()、skip()、concat() 。本文中将讲述Stream中更多的方法,以及java.util.stream包下更多类型的Stream。文章目录1. 创建Stream流2. 抽取子流和组合流3. 流的约简4. 获取流中信息5. 完整实验代码1. 创建Stream流前一篇文章.原创 2020-05-14 18:08:11 · 326 阅读 · 0 评论 -
图解Java中的浅拷贝和深拷贝
在Python中的浅拷贝和深拷贝中我们探究了Python中关于浅拷贝和深拷贝的一些内容,对于不同类型数据的拷贝原理有了初步的了解。下面我们继续看一下同样是面向对象语言的Java中浅拷贝和深拷贝,并且从更深层次上进行理解。本文将通过图示的方法来剖析Java中对象拷贝(克隆)的相关内容。希望在阅读之后可以对这块内容有个较为清晰的认识,同时更好的理解JVM关于内存空间的划分。文章目录1. 引入2. 浅拷贝3. 深拷贝4. 总结5. 参考1. 引入Java中的浅拷贝和深拷贝都可以统称为对象克隆(clone.原创 2020-05-13 10:45:50 · 526 阅读 · 0 评论 -
如何使用Arrays.sort()对任意类型的数据进行排序?
前段时间看到一篇关于Arrays.sort()基本原理和使用的解读,正好之前自己也想总结一下关于Java中和排序相关的一些内容,不限于Arrays.sort()、ArrayList.sort()以及Comparator和Comparable接口。在本文中将介绍Arrays中各种重载的sort(),以及解释如何使用Arrays.sort()对任意类型的数据进行排序,这其中又涉及到Comparable接口和Comparator类的相关内容,最后在对比看一下ArrayList中的sort()。文章目录1. .原创 2020-05-12 21:07:59 · 6852 阅读 · 2 评论 -
浅析Java中的JDBC(二)PreparedStatement + 事务
1. JDBC 工具类为了方便后续有关JDBC相关的操作,我们最好将冗余的操作归纳为一个方法,从而创建有关JDBC的工具类。JDBC工具类主要包含两步操作:编写配置文件:配置文件中设置driver、url、username和password编写实现类:主要操作包含获取连接、关闭连接和SQL语句的执行1.1 配置文件driver = com.mysql.cj.jdbc.Driverurl = jdbc:mysql://localhost:3306/db_name?useUnicode=true原创 2020-05-11 08:57:55 · 1445 阅读 · 0 评论 -
浅析Java中的JDBC(一)
1. 简介JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。因此,JDBC本质上是一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,并提供数据库驱动jar包。我们可以使用这套接口编程,真正执行代码的是jar包中的实现类。使用Java开发原创 2020-05-09 18:42:03 · 372 阅读 · 0 评论 -
浅析Java中的注解
注解1. 概念注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。注解主要有如下三个作用:编写文档:通过代码里标识的元数据生成文档,如使用javadoc命令生成文档doc文档代码分析:通过代码里标识的元数据对代码进行分析,如使用反射编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查,如@Override简原创 2020-05-08 23:45:18 · 258 阅读 · 0 评论 -
初步理解Java中的反射的原理与实现
Java中的反射机制1. 静态语言和动态语言计算机编程语言有很多很多,目前来说最为常用的有C、C++、Java、Python、Go…如果按照不同的分类规则进行分类,我们可以将所有的编程语言分为不同的类别,比如:编译型语言:C、C++……,它的特点是速度快,但较复杂,开发效率低解释性语言:Java、Python……,它的特点是跨平台性好,在不同的操作系统上都可以运行相同的代码,但缺点就是执行速度慢,需要依赖于解释器来执行当然分类的结果还有很多。之所以会对编程语言进行分类,一方面是为了使用户对不原创 2020-05-08 21:31:46 · 525 阅读 · 1 评论 -
浅析Java中的Properties
Properties集合java.util.Properties集合继承了HashTable<k, v>并实现了Map<k, v>接口。Properties类表示一个持久的属性集,可保存在流中或从流中加载,它是一个唯一和IO流相结合的集合。Properties集合是一个双列集合,key和value默认都是字符串。可以使用Properties集合中的store(),把集合中的临时数据持久化写入到硬盘中存储可以使用Properties集合中的load(),把硬盘中保存的文件读取到原创 2020-05-08 21:29:52 · 273 阅读 · 0 评论 -
浅析Java中的内部类
内部类1. 概念和使用场景如果一个事物内部包含另一个事物,那么这就是一个类内部包含另一个类。因此,内部类就是定义在一个类或方法内部的类。促使我们使用内部类的原因有两个:内部类可以对同一个包中的其他类隐藏,即如果我们希望一个类只能被某一个具体的类使用,那么就可以将其定义在哪个类内部作为内部类使用。内部类方法可以访问定义这个类的作用域中的数据,包括原本私有的数据。如果一个普通类类想访问某个类...原创 2020-05-07 18:21:29 · 250 阅读 · 0 评论 -
浅析Java中的方法引用
1. 引入在具体理解Java中的方法引用之前,我们首先来回顾一下之前已经所学的一些东西,并由由这些东西来看一下方法引用出现的意义是什么,以及方法引用在程序中是如何使用的。假设我们现在定义了一个函数式接口(为了方便和后面的内容连接,这里以函数式接口为例)如下所示,它其中只有一个抽象方法,实现输出所接收的字符串参数:@FunctionalInterfacepublic interface Pr...原创 2020-05-07 15:52:47 · 356 阅读 · 1 评论 -
浅析Java中的Steam流
1. 集合遍历根据前面所学的内容可知,如果想要使用某个数据结构来存储一些类型的元素,我们可以选择数组或者Java提供的多种类型的集合,如ArrayList、HashSet和HashMap等。针对于不同的类型,遍历的方法也有多种可供选择,下面我们依次回顾一下。数组的遍历:数组的遍历可以使用传统的for循环(对比于for-each而言)或者是增强for循环,即for-each循环public...原创 2020-05-07 13:32:16 · 1333 阅读 · 0 评论 -
浅析Java中的函数式接口
函数式接口1. 定义Java中有且仅有一个抽下方法的接口称为函数式接口,它主要应用于函数式编程的场景中。Java中函数式编程具体的体现 就是Lambda表达式的使用,所以函数式接口就是可以适用于Lambda使用的接口。只有确保接口中有且仅有一个抽象方法,接口才能被称为函数式接口当然接口中可以有除抽线方法外其他的方法,如默认发方法、静态方法和私有方法等通常为保证函数式接口的正...原创 2020-05-06 15:51:42 · 611 阅读 · 0 评论 -
Java和Python中的可变参数对比
可变参数1. Java中的可变参数当方法的参数数据类型已经确定,但参数的个数不确定就可以使用可变参数。格式:定义方法时使用修饰符 返回值类型 方法名(数据类型... 变量名){ // 方法体}原理:可变参数的底层是一个数组,根据传递参数的个数不同会创建不同长度的数组来存储这些参数;传递的参数格式可以是0到多个可变参数的使用示例:import java.util.Ar...原创 2020-05-05 20:10:42 · 342 阅读 · 0 评论 -
Java中对对象采用的什么传递方式呢?
Java中对对象采用的是值传递还是引用传递呢?在理解Java中对对象采用的是值传递还是引用传递之前,我们需要明白Java中的形参和实参、值传递和引用传递的相关内容,以及Java虚拟机内存的划分。相关内容可阅读之前的博文,其中对于上述内容已经有了初步的讲解。图形化理解Java中的形参和实参那么究竟Java中对对象采用的是值传递还是引用传递呢?不管是基本数据类型还是对象,Java中的参数传递...原创 2020-05-05 15:59:29 · 831 阅读 · 0 评论 -
浅析Java中的IO流 -序列化和反序列化流 + 打印流
序列化和反序列化流1. 序列化在前面IO流的学习中,我们使用流对象读取和写入的数据类型都是数字、字符串等类型。那么如果想将对象保存到文件中,以及使用流来读取文件中保存的对象时,就需要使用Java中的序列化和反序列化机制:序列化:用一个字节序列表示一个对象,该字节序列包含该对象的数据、类型和对象中存储的属性等信息,通过序列化可以持久化的保存对象反序列化:根据文件中保存的字节序列,重构对象,...原创 2020-05-04 20:44:44 · 381 阅读 · 1 评论 -
浅析Java中的IO流 - 转换流
转换流1. 字符编码和字符集计算中的任何信息在底层都以二进制数进行表示和存储,而我们直观上看到的各种信息,如图像、文字、视频等都是二级制信息转换后的结果。我们将数据按字符存储到计算机的过程称为编码,而将计算机中的二进制信息按照某种规则解析显式出来称为解码。所谓的字符编码就是一套自然语言的字符和二进制数之间的对应规则。字符集也称编码表,它是一个系统支持的所有字符的集合,包括各国家的文字、标点符...原创 2020-05-04 18:24:35 · 214 阅读 · 0 评论 -
浅析Java中的IO流 - 字节(字符)输入(输出)缓冲流
缓冲流缓冲流是对基本的IO流的一种增强,它通过设置缓冲区来大幅的提高写入和读取数据的效率。对于字节流和字符流的子类Filexxxx来说,按照数据类型来分,它对应的缓冲流为:输入缓冲流输出缓冲流字节流BufferedInputStreamBufferedOutputStream字符流BufferedReaderBufferedWriter那么缓冲流是如何...原创 2020-05-04 11:14:10 · 297 阅读 · 0 评论 -
浅析Java中的IO流 - 字符/字节流
1. IO流Java中不同的输入和输入源都抽象表述为流(stream),通过流的方法允许程序可以使用相同的方法访问不同的输入和输出源中的数据。Java中流可以分为:输入流输出流字节流InputStreamOutputStream字符流ReaderWriter2. 字节流在具体学习字节流中的输入流和输出流之前,我们需要明白一个本质概念:一切皆为字节!...原创 2020-05-03 21:33:10 · 342 阅读 · 0 评论 -
浅析Java中的File类
File在此之前所编写的代码中,不管是使用数组或是ArrayList、HashSet、HashMap等集合存储数据,数据只保存于当时程序运行时的内存中,当关掉程序后,这些数据也就随之消失了。如果想要获取到的数据持久化保存到硬盘上,就需要使用Java 中的File类或是IO流。java.io.File类包含一系列有关文件和文件夹的相关操作,它把计算机中关于文件和文件夹的操作封装成File对象,使...原创 2020-05-02 15:50:58 · 251 阅读 · 0 评论 -
浅析Java中的String、StringBuffer和StringBuilder
StringJava中的String类用于字符串的创建以及有关字符串的一系列操作,程序中所有的双引号字符串都是String类的对象。字符串具有以下特点:字符串是不可变的字符串是可共享的字符串效果上相当于char[] 字符数组,但底层原理是byte[] 数组字符串的创建字符串的创建主要包括四种方法:直接创建和三种构造方法直接创建:这也是使用最多的一种方法构造方法:p...原创 2020-04-19 11:36:13 · 258 阅读 · 0 评论 -
浅析Java和Python中Lambda表达式
Java中的Lambda表达式1. 函数式编程强调做什么,而不是以什么形式做。函数式编程思想和面向对象编程思想的区别:面向对象:解决某个问题需找到某个类的某个方法完成函数式:只要能获取到结果,不重视得到结果的过程什么是函数式编程思维?毫无干货的带你理解什么是函数式编程2. 示例引入Lambda表达式是是Java8的新特性,通过使用它可以简化代码的编写,但是同样可能会带来...原创 2020-04-30 16:58:27 · 722 阅读 · 0 评论 -
浅析Java中的多线程
在理解Java中多线程的相关内容前,我们需要对宏观层面上操作系统中和进程相关的内容做一些了解,在知道了操作系统是如何管理进程和线程后,才能更好的理解Java中有关多线程的创建、调度和同步控制等内容。1. 操作系统四大特性并发(concurrence)并行性与并发性这两个概念是既相似又区别的两个概念。并行性是指两个或者多个事件在同一时刻发生,这是一个具有微观意义的概念,即在物理上这些事...原创 2020-04-29 22:28:45 · 373 阅读 · 0 评论