![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java随笔
文章平均质量分 65
Java随笔
itbird01
细节决定成败,专注决定高度
展开
-
关于重构的原则和思想总结
永远不要忘记「两顶帽子」重构与开发是两顶帽子,要时常交换进行,不可以同时戴上。原创 2023-04-12 14:51:37 · 1136 阅读 · 112 评论 -
有学生问我,重构是什么?我应该如何回答?
重构到底是什么?只是代码的推倒重新编码?还是有规则、有方法可寻?当然,结论肯定是有的,本文,我们通过一个简单的实例,来理解一下重构。原创 2023-04-11 10:38:21 · 639 阅读 · 63 评论 -
【创作赢红包】字节面试遇到的算法题目(LRU缓存机制自我实现题目)
最近在字节的面试过程中,遇到了这样一道算法题目,其实很简单,就是我们经常用到的缓存机制-LRU(最近最少使用),今天有空,总结一下这次的这道面试题目。原创 2023-04-01 13:54:03 · 358 阅读 · 12 评论 -
日常编程中和日期相关的代码和bug
本文主要是Java中和日期时间相隔的几个常用代码函数代码,做了总结,希望在日常编码中,可以帮到大家。闰年平年的判断、延迟执行、定时执行原创 2023-02-24 17:23:52 · 2808 阅读 · 90 评论 -
【字节面试】Fail-fast知识点相关知识点
什么是Fail-fast机制?Hashmap是否拥有Fail-fast机制?ConcurrentModificationException异常原因和解决方法是什么?哪些你常用的数据结构是Fail-fast的,哪些不是?举例说明一下Enumeration与Iterator的异同?原创 2023-02-22 09:20:35 · 3569 阅读 · 143 评论 -
Java异常分类&常见使用场景
今天在自己实现RxJava框架时,发现一些参数异常、流关闭异常等,Rxjava框架是会抛出相应的异常的,所以自己编写实现这块源码的时候,渐渐的也需要使用到这些知识,这里对这块做一下回顾总结。原创 2023-01-11 16:38:45 · 1040 阅读 · 24 评论 -
《趣学算法-动态规划-0-1背包问题》阅读笔记
简单总结一下,最优子结构,状态转移方程,重叠子问题就是动态规划的三要素,这其中定义子问题的状态与写出状态转移方程是解决动态规划最为关键的步骤,状态转移方程如果定义好了,解决动态规划就基本不是问题了。动态规划是一种多阶段决策最优解模型,一般用来求最值问题,多数情况下它可以采用自下而上的递推方式来得出每个子问题的最优解(即最优子结构),进而自然而然地得出依赖子问题的原问题的最优解。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。第 i 件物品的体积是v[i] ,价值是w[i]。原创 2022-10-24 09:47:12 · 146 阅读 · 0 评论 -
HTTP Status 405 - HTTP method GET is not supported by this URL
今天调试已有的工程的时候,访问接口,出现405错误,这里记录一下。原创 2022-10-24 00:45:00 · 891 阅读 · 0 评论 -
【Java面试】枚举从使用到原理
枚举使用enum这个关键字来定义,Size包括三个值,分别表示小、中、大,值一般是大写的字母,多个值之间以逗号分隔。枚举类型可以定义为一个单独的文件,也可以定义在其他类内部。上面讲了枚举的定义、基本使用以及原理,接下来,我们梳理一下枚举在实际开发环境中的一些使用场景。需求栗子背景:客户端与服务端通信,服务端会返回各种错误码与错误状态信息,而这些错误码和错误状态,往往是一一对应的,不管是在客户端还是在服务端,你如何去实现呢?原创 2022-10-12 17:55:29 · 524 阅读 · 0 评论 -
《图解 HTTP 》阅读笔记(三)
好了,文章写到这里,《图解HTTP》一书的主要内容,以及我们开文所提出的一些问题,都已经总结完成,各位请对照思维导图,在自己的思维宫殿中,找寻一下这些问题的答案。原创 2022-10-11 15:56:24 · 1399 阅读 · 0 评论 -
FutureTask原理解析-java多线程(实现并行计算)
FutureTask既然要做到运行完成之前,一旦调用get就会阻塞当前线程,那么必然内部肯定维护了状态。我们看一下状态定义源码《Java并发编程的艺术》一本书中,根据FutureTask.run()方法的执行的时机,把FutureTask的运行状态分为三个阶段未启动:FutureTask.run()方法还没有被执行之前,FutureTask处于未启动状态已启动:FutureTask.run()方法执行之后,处于已启动状态。原创 2022-09-29 17:06:27 · 843 阅读 · 0 评论 -
遍历List移除元素的若干种方法
众所周知,List在for、while正常遍历过程中,如果remove元素,容易出现ConcurrentModificationException 异常,根本原因的话,之前已经讲过,各位有兴趣可以移步阅读,本文主要整理遍历List过程中安全移除元素的三种方法。原创 2022-09-20 19:24:20 · 3848 阅读 · 0 评论 -
Okhttp3结合Retrofit2 实现缓存
Retrofit本身并没有缓存。OkHttp是由Square发布的一个HTTP client,它支持高速缓存服务器响应的语义。如果服务器的响应具有Cache-Control头,例如,它将被缓存,以便随后的请求可以从高速缓存中的获得之前的资源。因此,设备处于断网情况下,Retrofit与Okhttp配合可以实现缓存。Okhttp缓存设计和浏览器设计一样,是用来提升用户体验以及降低浏览器负荷的。项目实际开发过程中,我们使用到的无非两种情景:1.无论是否有网,一定时间段内都是先读缓存,不同的接口根据自己的实时性可原创 2022-06-02 16:19:27 · 893 阅读 · 0 评论 -
【Rxandroid】Rxandroid源码解读
目录1.AndroidSchedulers类的源码2.RxAndroidPlugins类的源码3.RxAndroidSechedulersHook类的源码4.LooperScheduler类的源码5.HandlerScheduler类的源码6.BuildConfig类的源码7.MainThreadSubscription类的源码总结将Rxandroid(1.2.1)引入我们的项目工程之后,可以看到Rxandroid的包结构Rxandroid的包结构从包结构中,我们了解到相比于Rxjava多了如下几个类:从源原创 2022-06-02 16:17:46 · 369 阅读 · 0 评论 -
【Java并发】由守护线程引发的一系列思考
今天看书的时候,看到一个名词,守护线程,迫不及待的想要了解一下,有了以下一系列的思考和总结。1.什么是守护线程?首先看一下,Java官方对于守护线程的注释是怎么样的?守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程。按照官方这样的说法的话,JVM GC不就是一个天生的守护线程吗?只要一个程序启动之后,独立与控制终端,可以独立运行,而且一直在后台等待周期性的触发GC,回收内存。问题随之而来主线程.原创 2022-05-02 04:30:00 · 473 阅读 · 0 评论 -
【Java并发】如何实现非阻塞式生产者消费者?
1.问题描述实现Java非阻塞式生产者消费者,用来解决,生产和消费对于资源访问不同步和造成资源冗余的问题2.实现思想针对于同一资源,生产者生产前会前检测资源是否大于0,如果大于0,则生产者线程释放资源锁,进入waiting阶段,如果小于0,则生产者线程持有锁,并且生产资源,生产一定资源之后,通知消费者。消费者线程,去消费之前,会检测资源是否大于0,如果小于0,则阻塞等待,并且通知生产者生产资源,如果大于0,则消费资源,消费完成,唤醒生产者,生产资源。这样就实现了每次生产者生产都是生产一定的资源,原创 2022-05-01 04:00:00 · 312 阅读 · 0 评论 -
【Java面试】Runnable和Thread比较
在线程使用过程中,我们肯定会用到Runnable与Thread,前者的实现方式是实现其接口即可,后者的实现方式是继承其类。两者实现方式带来最明显的区别就是,由于Java不允许多继承,因此实现了Runnable接口可以再继承其他类,但是Thread明显不可以。1.Runnable和Thread比较如上所述,Runnable相比Thread存在明显的优点,同时也是两者最大的区别。这点就不再做阐述,这里对于网络很多文章中存在的明显的错误文字总结进行一下论证:Runnable可以实现多个相同的程序代码的线.原创 2022-04-29 14:06:25 · 703 阅读 · 0 评论 -
注解和反射(二)【反射的基础知识和架构】
注解与反射,反射的基础知识和架构原创 2022-04-18 17:12:07 · 130 阅读 · 0 评论 -
注解和反射(一)【注解的基础知识和架构】
Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。用到“注释”这个词来描述,不太准备,容易让人误解为,类似于函数注释、属性注释说明一样的功能。和Javadoc不同的是,Java 标注可以通过反射获取标注内容。可以在编译时、运行时、类加载不同时期转换为相应java代码,或者进行字节码文件的修改。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容 。 当然它也支持自定义 Java 标注。1.架构我们先来自己看一下java注解的整体简单架构从.原创 2022-04-18 17:10:57 · 1662 阅读 · 0 评论 -
Java Annotation认知(包括框架图、详细介绍、示例说明) (转)
Java Annotation是JDK5.0引入的一种注释机制。 网上很多关于Java Annotation的文章,看得人眼花缭乱。Java Annotation本来很简单的,结果说的人没说清楚;弄的看的人更加迷糊。 我按照自己的思路,对Annotation进行了整理。理解 Annotation 的关键,是理解Annotation的语法和用法,对这些内容,我都进行了详细说明;理解Annota...转载 2022-04-06 19:09:00 · 594 阅读 · 0 评论 -
两个线程按顺序打印1~100的几种实现
两个线程按顺序打印1~100的几种实现方法1.atomicIntegerImpl2.volatileLockImpl3.reentrantLockImpl4.synchronizedImplimport java.util.concurrent.atomic.AtomicInteger;import java.util.concurrent.locks.ReentrantLock;class Solution { // synchronizedImpl使用的变量 static Objec原创 2022-04-04 00:45:00 · 1108 阅读 · 0 评论 -
【Java并发】ReadWriteLock读写锁的使用
说到Java并发编程,很多开发第一个想到同时也是经常常用的肯定是Synchronized,但是小编这里提出一个问题,Synchronized存在明显的一个性能问题就是读与读之间互斥,简言之就是,我们编程想要实现的最好效果是,可以做到读和读互不影响,读和写互斥,写和写互斥,提高读写的效率,如何实现呢?Java并发包中ReadWriteLock是一个接口,主要有两个方法,如下:public interface ReadWriteLock { /** * Returns the lock.原创 2022-04-03 00:45:00 · 651 阅读 · 0 评论 -
【Java并发】父类能调用子类的方法吗?
文章开始前,我们先抛出一个链式问题:Java中父类能调用子类的方法吗?如果不可以,原因?如果可以,如何做?每种实现方式,在实际项目被允许吗?不被允许的原因有哪些?如果在实际项目中,的确有这样的特殊业务场景,应如何“正确的” - “变相”的去实现?#1.Java中父类能调用子类的方法吗?答案:能1.1 实现方式描述(1)在父类中直接new子类相关对象或者通过构造函数传入子类对象,然后调用其方法(2)将子类相关方法声明为static,在父类中调用子类的static方法(3)在父类中通过.原创 2022-03-26 10:16:07 · 9376 阅读 · 17 评论 -
Java读写资源文件类Properties
Java中读写资源文件最重要的类是Properties1.资源文件要求如下:properties文件是一个文本文件properties文件的语法有两种,一种是注释,一种属性配置。注 释:前面加上#号属性配置:以“键=值”的方式书写一个属性的配置信息。properties文件的一个属性配置信息值可以换行,但键不可以换行。值换行用“\”表示。properties的属性配置键值前后的空格在解析时候会被忽略。properties文件可以只有键而没有值。也可以仅有键和等号原创 2022-03-25 11:35:33 · 256 阅读 · 0 评论 -
System.gc()与Runtime.gc()的区别
(1) GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。(2) 对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是”可达的”,哪些对象是”不可达的”。当原创 2022-03-25 11:34:56 · 414 阅读 · 0 评论 -
【Java面试】List知识点总结
1.ArrayList与LinkedList区别ArrayListLinkedList数据结构Object数组双向链表线程安全否否add时间复杂度O(n)O(1)delete时间复杂度O(n)O(1)get时间复杂度O(1)O(n)快速访问支持不支持存储空间默认空余一些空间保存数据&前后指针RandomAccess首先抛出一个问题,让我们带着问题,去了解真相。1.数据结构是否有随机访问功能,是如何实现的原创 2022-03-25 11:34:19 · 709 阅读 · 0 评论 -
No enclosing instance of type Main is accessible. Must qualify the allocation with an enclosing i...
最近在刷AC,在编译时出现:No enclosing instance of type Main is accessible. Must qualify the allocation with an enclosing instance of type Main (e.g. x.new A() where x is an instance of Main).根据提示,没有可访问的内部类的实例,必须分配一个合适的内部类的实例(如x.new A(),x必须是内部类的实例。看着这句提示,我。。。我已原创 2022-03-25 11:33:58 · 3148 阅读 · 0 评论 -
【HashMap】由tableSizeFor想到的一个算法
最近在看hashmap的源码,看到一个很有意思的函数,tableSizeFor,不禁想问,这个函数到底做了什么? static final int tableSizeFor(int var0) { int var1 = var0 - 1; var1 |= var1 >>> 1; var1 |= var1 >>> 2; var1 |= var1 >>> 4; var.原创 2022-03-25 11:33:43 · 125 阅读 · 0 评论 -
【Java面试】如何高效记忆Java的各种运算符
最近在闲暇之余,突然想到垒实一下自己的Java基础,但是在查看各类JDK源码的时候,发现运算符使用特别频繁,可是自己看了一遍又一遍,总是忘记,突然想到,如何高效记忆Java的各种运算符,才可以达到不忘记的效果。1.容易记忆的,我们先过一遍Java算术运算符关系运算符逻辑运算符2.不容易记忆的,我们采用相对记忆法位运算符这里是重点, 针对于各种位运算符,我们如果采取死记硬背,这显然是不牢靠的。& 相对于 &&:我们知道&&是指同时成立才可以,.原创 2022-03-25 11:33:25 · 221 阅读 · 0 评论 -
【Java面试】对象如何进入老年代
正常我们创建一个对象,都会直接进入新生代的Eden区,那一个对象有哪几种方法可以进入老年代呢?对象进入老年代,有三种情况:1.占用内存较大的对象,直接进入老年代,这个“大”由参数-XX:PretenureSizeThreshold来决定,超过这个参数设置的值就直接进入老年代,例如很长的字符串、很大的数组。2.正常创建一个对象,对象内存布局,包含三部分信息(对象头、实例数据、对齐数据),对象头中存储的就是两部分信息,一部分是对象的运行时数据(GC年龄、锁信息等),一部分是类型指针,GC年龄在对象初始.原创 2022-03-25 11:33:09 · 1154 阅读 · 0 评论 -
【Java面试】什么是JVM内存分配担保机制?
JVM内存分配担保机制,如果想要理解透彻,需要先知道,Java GC是什么时候发生的?Java GC When Happend?Java 虚拟机一般采用的是分代回收策略,即把对象分为两代,新生代和老年代,新生代又分为Eden区和两个Survivor区,比例为8:1:1。1)新建的对象(除了大数据对象)会首先分配在Eden区,如果Eden区空间不够时,就会发生一次Minor GC2)当新生代的对象进入老年代时,如果老年代的空间不够时,就会发生一次Full GC,大对象一般会直接进入老年代,为了防止.原创 2022-03-25 11:32:49 · 923 阅读 · 0 评论 -
【Java多线程】写一个死锁的例子
如果让你写一个死锁的例子,怎么写呢?其实死锁的原理很简单,就是某个线程一直占有共享资源不释放,导致其他线程无法获取到资源,而一直无法执行1.实例代码最简单的一个例子:class Solution { static Object lock1 = new Object(); static Object lock2 = new Object(); public static void main(String[] args) { new Thread(new Runnable() { .原创 2022-03-25 11:32:27 · 972 阅读 · 0 评论 -
【Java面试】Java 内存溢出 栈溢出的原因与排查方法
1、 内存溢出的原因是什么?内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,造成的内存溢出。如果出现这种现象可行代码排查:一)是否App中的类中和引用变量过多使用了Static修饰 如public staitc Student s;在类中的属性中使用 static修饰的最好只用基本类型或字符串。如public static int i = 0; //public static String str;二)是否App中使用了大量的递归或无限递归(递归中用到了大量的建新的对象)三)是否Ap原创 2022-03-27 00:30:00 · 6200 阅读 · 0 评论 -
【Java面试】由守护线程引发的一系列思考
今天看书的时候,看到一个名词,守护线程,迫不及待的想要了解一下,有了以下一系列的思考和总结。1.什么是守护线程?首先看一下,Java官方对于守护线程的注释是怎么样的?守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程。按照官方这样的说法的话,JVM GC不就是一个天生的守护线程吗?只要一个程序启动之后,独立与控制终端,可以独立运行,而且一直在后台等待周期性的触发GC,回收内存。问题随之而来主线程.原创 2022-03-24 15:17:30 · 1090 阅读 · 0 评论 -
【Java面试】优先级反转
1.什么是优先级反转高优先级的任务被低优先级的任务阻塞,但是中优先级的任务却可以获取到CPU资源&并且执行举个实际例子:假定一个进程中有三个线程Thread1(高)、Thread2(中)和Thread3(低),考虑下图的执行情况。T0时刻,Thread3运行,并获得同步资源SYNCH1;T1时刻,Thread2开始运行,由于优先级高于Thread3,Thread3被抢占(未释放同步资源SYNCH1),Thread2被调度执行;T2时刻,Thread1抢占Thread2;T3时刻,原创 2022-03-27 00:30:00 · 420 阅读 · 0 评论 -
【Java面试】确保线程顺序执行的实现方法
1.Thread.join()我们来看看在 Java 7 Concurrency Cookbook 中相关的描述(很清楚地说明了 join() 的作用):Waiting for the finalization of a threadIn some situations, we will have to wait for the finalization of a thread. For example, we may have a program that will begin initializ原创 2022-03-25 00:15:00 · 754 阅读 · 1 评论 -
【Java面试】如何实现非阻塞式生产者消费者?
1.问题描述实现Java非阻塞式生产者消费者,用来解决,生产和消费对于资源访问不同步和造成资源冗余的问题2.实现思想针对于同一资源,生产者生产前会前检测资源是否大于0,如果大于0,则生产者线程释放资源锁,进入waiting阶段,如果小于0,则生产者线程持有锁,并且生产资源,生产一定资源之后,通知消费者。消费者线程,去消费之前,会检测资源是否大于0,如果小于0,则阻塞等待,并且通知生产者生产资源,如果大于0,则消费资源,消费完成,唤醒生产者,生产资源。这样就实现了每次生产者生产都是生产一定的资源,原创 2022-03-26 19:00:00 · 372 阅读 · 0 评论 -
Synchronized与Lock对比分析
Synchronized与Lock对比分析1.Lock是接口,Synchronized是关键字2.Synchronized可以锁对象、锁方法、锁代码块,Lock只能锁代码块3.Synchronized锁不需要主动释放,Lock需要在finally中主动释放4.Synchronized的锁可重入、不可中断、非公平,而Lock锁可重入、可判断、可公平(两者皆可)5.Synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁...原创 2022-03-29 00:45:00 · 260 阅读 · 0 评论 -
JVM的GC ROOTS有哪些?
JVM垃圾回收是根据可达性分析算法来判断堆里面的对象是否有用。可达性分析算法是从GC ROOTS扫描对象引用链,来筛选出有用的对象,扫面完成后,回收掉无用的对象。JVM的GC ROOTS有哪几个地方呢?a. java虚拟机栈中的引用的对象。b.方法区中的类静态属性引用的对象。 (一般指被static修饰的对象,加载类的时候就加载到内存中。)c.方法区中的常量引用的对象。d.本地方法栈中的JNI(native方法)引用的对象...原创 2022-03-28 00:30:00 · 791 阅读 · 0 评论 -
并发之原子性、可见性、有序性
1.概念原子性:指一个操作或者一系列操作,不可中断,即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。可见性:指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。有序性:我们正常new 一个对象时,实际上在内存区域中是一系列指令操作,有内存分配、内存初始化、内存赋值初始化,这些指令如果按照正常顺序执行,即为有序性,但是我们也知道Java虚拟机为了提高运行效率,是允许指令重排的。2.不同的Java关键字到底满足了哪些特性?sy原创 2022-03-27 00:45:00 · 185 阅读 · 0 评论