![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java复习
文章平均质量分 92
打架不行的二哈
点点关注,点个赞,会让作者元气满满的哦
展开
-
Java类加载基础
我们知道,我们从写java代码开始,到代码执行的时候,中间一共经历四个阶段:新建.java文件 并写代码,这称为编辑期。将.java文件编译为.class文件,这称为编译期。将.class文件加载到内存 并 生成.class类,这称为加载期。通过.class类去创建对象、执行代码,这称为运行期。其中,除了第一个阶段我们能直接干预,剩余三个阶段,都是jvm自己执行的(当然也有黑科技可以人工干预)。1、类加载时机引起类加载的场景使用new创建对象时读取或设置类的静态变量时(编译期常量除外原创 2021-10-09 10:52:52 · 116 阅读 · 0 评论 -
Java双亲委派机制
1、什么是双亲委派?虚拟机在加载类的过程中需要使用类加载器进行加载,而在Java中,类加载器有很多,那么当JVM想要加载一个.class文件的时候,到底应该由哪个类加载器加载呢?这就不得不提到"双亲委派机制"。首先,我们需要知道的是,Java语言系统中支持以下4种类加载器:Bootstrap ClassLoader 启动类加载器Extention ClassLoader 标准扩展类加载器Application ClassLoader 应用类加载器User ClassLoader 用户自定义类加原创 2021-09-09 15:39:53 · 595 阅读 · 0 评论 -
加密算法
一、对称加密算法概念又称私钥加密、共享密钥加密。需要对加密和解密使用相同密钥的加密算法。由于其速度快,对称性加密通常在消息发送方需要加密大量数据时使用。对称性加密也称为密钥加密。优点性能高缺点密钥泄露风险高,因为大家共享一个密钥,假如一方泄露这个密码,就没有安全可言。比如:在前后端调用的过程中使用此种算法,如果前端js中存放密钥,那么就会被窃取,app端也有可能反编译获取。常用算法1、DESDES是一种典型的分组密码—一种将固定长度的明文通过一系列复杂的操作变成同样长度的密文的算法。对D原创 2020-09-16 15:00:17 · 181 阅读 · 0 评论 -
Java每日面试题5
一、CountDownLatch和CyclicBarrier的区别1、CountDownLatch用于主线程等待其他子线程任务都执行完毕后再执行,CyclicBarrier用于一组线程相互等待大家都到达某个状态后再同时执行。public class CountdownLatchExample { public static void main(String[] args) throws InterruptedException { final int totalThread = 10; Cou原创 2020-08-07 13:57:16 · 118 阅读 · 0 评论 -
Java线程池详解
为什么需要线程池在实际使用中,线程是很占用系统资源的,如果对线程管理不善,很容易导致系统问题。因此,在大多数并发框架中都会使用线程池来管理线程,使用线程池管理线程主要有如下好处:1、使用线程池可以重复利用已有的线程继续执行任务,避免线程在创建和销毁时造成的消耗。2、由于没有线程创建和销毁时的消耗,可以提高系统响应速度。3、通过线程可以对线程进行合理的管理,根据系统的承受能力调整可运行线程数量的大小等。工作原理线程池执行所提交的任务过程:先判断线程池中核心线程池所有的线程是否都在执行任务原创 2020-07-29 16:16:52 · 146 阅读 · 0 评论 -
RocketMQ组成架构
主要有四大核心组成部分:NameServer、Broker、Producer以及Consumer四部分。NameServer:主要负责对于源数据的管理,包括了对于Topic和路由信息的管理。NameServer是一个功能齐全的服务器,其角色类似Dubbo中的Zookeeper,但NameServer与Zookeeper相比更轻量。主要是因为每个NameServer节点互相之间是独立的,没有任何信息交互。NameServer压力不会太大,平时主要开销是在维持心跳和提供Topic-Broker的关转载 2020-07-21 17:40:50 · 1321 阅读 · 0 评论 -
Java每日面试题4
一、Java 中能创建volatile 数组吗?能, Java 中可以创建volatile 类型数组,不过只是一个指向数组的引用,而不是整个数组。我的意思是,如果改变引用指向的数组,将会受到volatile 的保护,但是如果多个线程同时改变数组的元素, volatile 标示符就不能起到之前的保护作用了。二、volatile 能使得一个非原子操作变成原子操作吗?一个典型的例子是在类中有一个long 类型的成员变量。如果你知道该成员变量会被多个线程访问,如计数器、价格等,你最好是将其设置为volati原创 2020-07-17 20:09:59 · 147 阅读 · 0 评论 -
Java每日面试题3
一、请说出与线程同步以及线程调度相关的方法。wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁;sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要处理InterruptedException 异常;notify():唤醒一个处于等待状态的线程,当然在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM 确定唤醒哪个线程,而且与优先级无关;notityAll():唤醒所有处于等待状态的线程,该方法并不是将对象的锁给所有线程,而是让原创 2020-07-16 17:50:36 · 145 阅读 · 0 评论 -
Java每日面试题2
一、抽象类(abstract class)和接口(interface)有什么异同?抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用。一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现, 否则该类仍然需要被声明为抽象类。接口比抽象类更加抽象,因为抽象类中可以定义构造器,可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法。抽象类中的成员可以private、默认、protected、public 的,而接口中的成员全都是public 的。抽象类原创 2020-07-15 19:59:41 · 182 阅读 · 0 评论 -
并发三大问题与volatile关键字,CAS操作
序言先来看如下这个简单的Java类,该类中并没有使用任何的同步。final class SetCheck { private int a = 0; private long b = 0; void set() { a = 1; b = -1; } boolean check() { return ((b == 0) || (b == -1 && a == 1)); }}如果是在一个串行执行的语言中,执行SetCheck类中的check方法永远不会返回原创 2020-07-15 19:29:25 · 284 阅读 · 0 评论 -
并发基础与Java多线程
一、多线程的优点资源利用率更好程序设计在某些情况下更简单程序响应更快1、资源利用率更好案例方式1 从磁盘读取一个文件需要5秒,处理一个文件需要2秒。处理两个文件则需要14秒1 5秒读取文件A2 2秒处理文件A3 5秒读取文件B4 2秒处理文件B5 ---------------------6 总共需要14秒方式2 从磁盘中读取文件的时候,大部分的CPU非常的空闲。它可以做一些别的事情。通过改变操作的顺序,就能够更好的使用CPU资源。看下面的顺序:1原创 2020-07-14 13:44:47 · 79 阅读 · 0 评论 -
Java每日面试题1
一、面向对象的特征有哪些方面?抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口。继承:继承是从已有类得到原创 2020-07-14 11:26:27 · 131 阅读 · 0 评论 -
Iterator,fail-fast机制与比较器
Iteratorjava.util.Iterator各个集合的Iterator的实现fail-fast机制fail-fast示例fail-fast产生原因fail-fast解决办法Comparable 和 ComparatorComparableComparatorJava8中使用lambda实现比较器原创 2020-07-13 20:28:27 · 180 阅读 · 0 评论 -
深入理解LinkedHashMap和LRU缓存
LinkedHashMap 概述HashMap 是 Java Collection Framework 的重要成员,也是Map族中我们最为常用的一种。不过遗憾的是,HashMap是无序的,也就是说,迭代HashMap所得到的元素顺序并不是它们最初放置到HashMap的顺序。HashMap的这一缺点往往会造成诸多不便,因为在有些场景中,我们确需要用到一个可以保持插入顺序的Map。庆幸的是,JDK为我们解决了这个问题,它为HashMap提供了一个子类 —— LinkedHashMap。虽然LinkedHas原创 2020-07-13 16:19:19 · 339 阅读 · 0 评论 -
JVM垃圾回收基本原理和算法
JVM GC基本原理与GC算法Java的内存分配与回收全部由JVM垃圾回收进程自动完成。与C语言不同,Java开发者不需要自己编写代码实现垃圾回收。这是Java深受大家欢迎的众多特性之一,能够帮助程序员更好地编写Java程序。一、Java关键术语JavaAPI:一系列帮助开发者创建Java应用程序的封装好的库。Java 开发工具包 (JDK):一系列工具帮助开发者创建Java应用程序。JDK包含工具编译、运行、打包、分发和监视Java应用程序。Java 虚拟机(JVM):JVM是一个抽象的计算机原创 2020-07-09 19:30:25 · 201 阅读 · 0 评论 -
Java设计模式3:行为型模式(策略,观察者等)
行为型模式行为型模式关注的是各个类之间的相互作用,将职责划分清楚,使得我们的代码更加地清晰。策略模式策略模式太常用了,所以把它放到最前面进行介绍。它比较简单,我就不废话,直接用代码说事吧。下面设计的场景是,我们需要画一个图形,可选的策略就是用红色笔来画,还是绿色笔来画,或者蓝色笔来画。首先,先定义一个策略接口:public interface Strategy { public void draw(int radius, int x, int y);}然后我们定义具体的几个策略:p原创 2020-07-07 19:01:04 · 120 阅读 · 0 评论 -
JUC的核心类AQS详解
AQS 结构先来看看 AQS 有哪些属性,搞清楚这些基本就知道 AQS 是什么套路了,毕竟可以猜嘛!// 头结点,你直接把它当做 当前持有锁的线程 可能是最好理解的private transient volatile Node head;// 阻塞的尾节点,每个新的节点进来,都插入到最后,也就形成了一个链表private transient volatile Node tail;// 这个是最重要的,代表当前锁的状态,0代表没有被占用,大于 0 代表有线程持有当前锁// 这个值可以大于 1原创 2020-07-06 20:10:32 · 426 阅读 · 1 评论 -
Java设计模式2:结构型模式(代理模式,适配器模式等)
结构型模式结构型模式旨在通过改变代码结构来达到解耦的目的,使得我们的代码容易维护和扩展。代理模式第一个要介绍的代理模式是最常使用的模式之一了,用一个代理来隐藏具体实现类的实现细节,通常还用于在真实的实现的前后添加一部分逻辑。既然说是代理,那就要对客户端隐藏真实实现,由代理来负责客户端的所有请求。当然,代理只是个代理,它不会完成实际的业务逻辑,而是一层皮而已,但是对于客户端来说,它必须表现得就是客户端需要的真实实现。public interface FoodService { Food ma原创 2020-07-06 19:41:26 · 227 阅读 · 1 评论 -
Java设计模式1:创建型模式(工厂,单例等)
创建型模式创建型模式的作用就是创建对象,说到创建一个对象,最熟悉的就是 new 一个对象,然后 set 相关属性。但是,在很多场景下,我们需要给客户端提供更加友好的创建对象的方式,尤其是那种我们定义了类,但是需要提供给其他开发者用的时候。简单工厂模式和名字一样简单,非常简单,直接上代码吧:public class FoodFactory { public static Food makeFood(String name) { if (name.equals("noodle"原创 2020-07-06 19:02:54 · 145 阅读 · 0 评论 -
Java中的锁 Lock和synchronized
Java中的锁 Lock和synchronized一、Java中的锁机制及Lock类锁的释放-获取建立的happens before 关系锁释放和获取的内存语义锁内存语义的实现二、concurrent包的实现三、synchronized实现原理1、实现原理2、Java对象头3、Monitor4、锁优化5、自旋锁6、适应自旋锁7、锁消除8、锁粗化9、轻量级锁10、偏向锁11、重量级锁一、Java中的锁机制及Lock类锁的释放-获取建立的happens before 关系锁是java并发编程中最重要的同步原创 2020-07-02 20:23:46 · 373 阅读 · 0 评论 -
Queue和LinkedList
Queue和LinkedListLinkedList概述源码分析定义属性构造方法增加方法移除方法查找方法QueueDeQueueArrayDeque (底层使用循环数组实现双向队列)创建add操作remove操作PriorityQueue(底层用数组实现堆的结构)add 添加方法poll,出队方法remove,删除队列元素LinkedList概述LinkedList与ArrayList一样实现List接口,只是ArrayList是List接口的大小可变数组的实现,LinkedList是List接口链表原创 2020-06-20 22:00:32 · 772 阅读 · 0 评论 -
ArrayList,Vector与Stack使用方法和实现原理
ArrayList,Vector与Stack使用方法和实现原理ArrayListArrayList概述ArrayList的继承关系底层数据结构增删改查modCount初始容量和扩容方式线程安全VectorVector简介增删改查初始容量和扩容线程安全StackStack三个集合类之间的区别ArrayListArrayList概述ArrayList是实现List接口的动态数组,所谓动态就是它的大小是可变的。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提原创 2020-06-18 18:32:55 · 295 阅读 · 0 评论 -
Java反射机制
反射什么是反射?反射的主要用途反射的基础:关于Class类Java为什么需要反射?反射要解决什么问题?反射的基本运用判断是否为某个类的实例创建实例获取方法获取构造器信息获取类的成员变量(字段)信息调用方法利用反射创建数组Java反射常见面试题什么是反射?哪里用到反射机制?什么叫对象序列化,什么是反序列化,实现对象序列化需要做哪些工作?反射机制的优缺点?动态代理是什么?有哪些应用?怎么实现动态代理?Java反射机制的作用如何使用Java的反射?什么是反射?反射(Reflection)是Java 程序开发语原创 2020-06-12 22:03:02 · 202 阅读 · 0 评论 -
Java内存模型
Java内存模型目的内存间交互操作内存模型三大特性原子性可见性有序性目的Java内存模型试图屏蔽各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致性的内存访问效果。主内存:存放所有的变量各个线程都有自己的工作内存,工作内存存储在高速缓存或寄存器中,保存了该线程使用的变量的主内存副本拷贝。线程只能直接操作工作内存中的变量,不同线程之间的变量值需要通过主内存来完成。内存间交互操作定义了8个操作来完成主内存和工作内存的交互。read: 主内存数据—>工作内存原创 2020-06-12 21:40:40 · 90 阅读 · 0 评论 -
抽象类与接口
抽象类与接口抽象类介绍为什么使用抽象类接口介绍接口与类异同接口特性抽象类与接口异同接口的使用接口最佳实践:设计模式中的工厂模式接口与抽象类的本质区别基本语法区别设计思想区别如何回答面试题:接口和抽象类的区别?抽象类介绍什么是抽象?百度给出的解释是:从具体事物抽出、概括出它们共同的方面、本质属性与关系等,而将个别的、非本质的方面、属性与关系舍弃,这种思维过程,称为抽象。这句话概括了抽象的概念,而在Java中,你可以只给出方法的定义不去实现方法的具体事物,由子类去根据具体需求来具体实现。这种只给出方法转载 2020-06-08 10:56:07 · 196 阅读 · 0 评论 -
final关键词特性
1、final使用(1)final变量final变量有成员变量或者是本地变量(方法内的局部变量),在类成员中final经常和static一起使用,作为类常量使用。其中类常量必须在声明时初始化,final成员常量可以在构造函数初始化。public class Main { public static final int i; //报错,必须初始化 因为常量在常量池中就存在了,调用时不需要类的初始化,所以必须在声明时初始化 public static final int j; Ma原创 2020-06-08 10:25:17 · 289 阅读 · 0 评论