基础
文章平均质量分 83
Dylanioucn
写一首关于世界的诗,以编程的方式~
展开
-
synchronized与lock在原理、用法、是否阻塞、是否可响应中断、是否有超时机制、是否公平、是否支持并发读、可重入等方面的对比分析
synchronized与lock在原理、用法、是否阻塞、是否可响应中断、是否有超时机制、是否公平、是否支持并发取、可重入等方面的对比分析原创 2022-04-04 11:49:12 · 1801 阅读 · 2 评论 -
【编程进阶知识】 解锁HashMap的隐藏陷阱:深入探讨hashCode与equals方法的重要性
一、⭐⭐⭐何为内存泄漏????????????内存泄漏,指的是该对象在Java应用程序中的使命已经完结,该做的事情都已经做完了,对Java应用程序来说,已经没有继续存在的价值和意义了,可以被GC回收了。可偏偏GC无法对这个对象做回收处理。因为,该对象被错误的禁锢在了某个不知名不易被察觉的地方。随着时间的流逝,这种因各种原因导致的内存泄漏而存在的无效对象会越来愈多,占用的内存就越大,就有可能会导致Java应用程序申请不到足够的内存空间,引发内存溢出。二、⭐⭐⭐Object中的hashCode和equal原创 2021-04-26 00:12:20 · 2555 阅读 · 1 评论 -
【编程基础知识】掌握Java序列化与反序列化的艺术:深入理解与实践指南
一、⭐⭐⭐什么是序列化和反序列化????????????序列化:通过IO字节流的方式,将jvm内存中的Java对象转换为另外一种格式持久存储下来(记录到文件里、存储到数据库里、上传到网络,本文采用的是记录到文件里);反序列化:通过IO字节流的方式,将被持久化的特定格式的Java对象反序列化还原出来。二、⭐⭐⭐序列化和反序列化的使用要点????????????1. 序列哈反序列化要先实现 Serializable 接口;2. transient不参与序列化 ;3. static修饰的属性不参与序列原创 2021-04-24 18:29:45 · 2075 阅读 · 1 评论 -
线程交替执行的几种方法(递加求余判断/环形链表步进/LockSupport/synchronized/ReentrantLock/CountDownLatch/循环屏障/信号量)
线程交替执行的几种方法(累加求余判断/环形链表步进/LockSupport/synchronized关键字/ReentrantLock可重入锁/CountDownLatch倒计时门闩/CyclicBarrier循环屏障/Semaphore信号量)原创 2021-04-11 22:58:29 · 916 阅读 · 2 评论 -
【编程基础知识】一个`static`引发的奇遇:实例变量与静态变量的奥秘
零、前情提要????????????实例变量(也称成员变量),在类的实例对象被创建时,会先按照实例变量的先后顺序被赋初始默认值,然后再按照实例赋值语句先后的顺序进行实例变量的赋值操作,最后执行构造方法。静态变量(也称类变量),在类初始化的时候,会先按照静态变量的先后顺序被赋初始默认值,然后再按照静态赋值语句先后的顺序进行静态变量的赋值操作。这里还搞不大清楚没关系,让我们来演示推敲一番:一、⭐⭐⭐实例变量版本演示代码????????????class InstanceObj{ public st原创 2021-04-07 18:08:42 · 129 阅读 · 1 评论 -
【编程进阶知识】Java单例模式深度解析:饿汉式与懒汉式实现技巧
一、概述:单例模式:某个类在整个系统种只能有一个实例对象可被获取和使用的代码模式,提供一个全局唯一的类的实例对象给外部调用,例如:代表jvm运行环境的Runtime类。要点如下:1、保证类只有唯一一个实例对象:则要求存储该实例对象的是一个静态变量;2、保证只能在该类的内部创建实例对象,其他地方不允许创建:则要求该类的构造器私有化;3、保证外部能访问获取到这个唯一的实例对象:1)直接暴露public2)提供静态变量的get方法。4、根据创建对象时机的不同,分饿汉式和懒汉式:1)饿汉式:还没等原创 2021-03-25 22:37:34 · 210 阅读 · 1 评论 -
【算法每日一练及解题思路】有n级台阶,一次只能上1级或2级,共有多少种走法?
编程题:有n步台阶,一次只能上1步或2步,共有多少种走法?1.递归 recursion 自己调自己,注意方法出口,频繁入栈出栈比较耗时,可能会导致栈溢出2.迭代 iteration 比较高效推导过程:n=1 [1] f(1)=1n=2 [1,1] [2] f(2)=2n=3 [1,1,1] [1,2] [2,1] f(3)=3n=4 [1,1,1,1] [1,1,2] [1,2,1] [2,1,1] [2,2] f(4)=5n=5 [1,1,1,1,1] [1,1,1,2] [1,1,2,1原创 2021-03-25 22:28:29 · 163 阅读 · 1 评论 -
让星星⭐月亮告诉你,(示例实战)enum枚举类九大特性详解
枚举类:1、Java枚举是一个特殊的类,一般表示一组常量,比如一年的四个季节,一年的12个月份,一星期的7天,方向有东西南北等;2、Java枚举类用enum关键字来定义,各个常量使用逗号,来分割;3、每个枚举都是通过Class在内部实现的,且所有的枚举值都是public static final的。比如:enum Color{RED,GREEN,BLUE}以上枚举转化为在类内部实现:class Color{public static final Color RED = new Color(原创 2021-03-25 22:25:14 · 129 阅读 · 1 评论 -
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
1、方法参数的传递机制①形参是基本数据类型:传递数据值②形参是引用数据类型:✦传递地址值;✦特殊类型:String、包装类对象的不可变性。2、String、包装类的对象的不可变性示例代码如下,执行结果应该是:jvm.Person@15db974200hjysetNameclass Person{ String name; Person(){ System.out.println(this); } public void setName(){ this.name = "原创 2021-03-25 22:22:53 · 140 阅读 · 1 评论 -
【编程基础知识】揭秘Java中的变量作用域:代码演示成员变量和局部变量的区别
1、就近原则:变量的作用域在离它最近的{}范围内2、变量的分类:✦成员变量:类变量(作用域在整个类)、实例变量(作用域仅限该实例对象),✦局部变量:作用域仅限方法内3、非静态代码块的执行:每次创建实例对象都会执行4、方法的调用规则:调用一次执行一次示例代码如下:执行结果应该是:i=2,j=1,s=5i=1,j=1,s=5public class MemberAndLocalVariables { static int s; int i,j; { int i = 1; i++;原创 2021-03-25 22:18:09 · 109 阅读 · 1 评论 -
(加深理解)类初始化及实例对象初始化顺序
1、类初始化过程①一个类要创建实例需要先加载并初始化该类 ✦main方法所在类需要先加载和初始化②一个子类要初始化需要先初始化父类③一个类初始化就是执行<cinit>()方法 ✦<cinit>()方法由静态类变量显示赋值代码和静态代码组成 ✦静态类变量显示赋值代码和静态代码从上到下顺序执行 ✦<cinit>()方法只执行一次 ✦静态代码块只有在被第一次调用的时候才执行,且只执行一次2、实例初始化过程①实例初始化就是执行&l...原创 2021-03-25 22:14:41 · 447 阅读 · 1 评论 -
【编程基础知识】(局部变量表、操作数栈)当我们在执行i=i++及i++时,底层到底在执行什么?
遇到一个比较有意思的题目,看上去很简单,实际运行起来却不是那么回事了。会发现i=i++和i++两者运行结果居然不一样!主要是没理解清楚java方法执行时,局部变量和操作数栈的分配运行机制,这就分享给大家分析过程:public class AutoIncrement { public static void main(String[] args) { int i = 0; i++;//相当于i=i+1; /* 步骤说明: 1、将局部变量i的值0 load到操作数栈 局部变量 i原创 2021-03-25 22:10:52 · 170 阅读 · 0 评论 -
让星星⭐月亮告诉你,Postman入门使用教程(概述、下载、使用)
Postman使用入门教程What is Postman?How to use Postman?download Postmaninstall Postmanuse Postman for exampleOther about Postman(欢迎小伙伴补充~)What is Postman?Postman【邮递员的英文单词,负责将信件送到目的地】是一个完成类似消息投递的工具:将拼装的请求报文发送到指定的路径(即URL,也即对应的后台服务器),对调试接口十分有帮助。大体分三步:①选择请求类型及填充URL原创 2020-10-15 23:10:34 · 1369 阅读 · 0 评论 -
让星星⭐月亮告诉你,计算机组成(CPU、内存、存储设备、输入设备、输出设备、通信设备)
什么是计算机?计算机是存储和处理数据的电子设备。包括硬件(可见的物理部分)和软件(不可见的指令)两部分。指令控制硬件完成特定的任务。了解计算机硬件知识,能更好地理解程序指令是如何对计算机及其组成部分产生作用的。计算机由中央处理器(CPU)、内存(主存)、存储设备(磁盘(CD、光盘、闪存))、输入设备(键盘、鼠标)、输出设备(显示器、打印机)、通信设备(调制解调器、网卡)组成。这些组件通过一个被称为总线的子系统连接在一起。总线相当于一条连接各组件的管道,数据和电信号通过总线在各组件之间穿梭往来。在个人原创 2020-08-04 23:27:26 · 3372 阅读 · 0 评论 -
让星星⭐月亮告诉你,Java之ThreadLocal
package unittest.jdk8newfeature;class Message{String info;public String getInfo() {return info;}public void setInfo(String info) {this.info = info;}}class Channel{private final static ThreadLocal THREADLOCAL = new ThreadLocal();public static vo翻译 2020-07-28 21:24:26 · 155 阅读 · 0 评论 -
让星星⭐月亮告诉你,自定义定时器和Java自带原生定时器
一. 定时器概述何为定时器?①就像可以设置闹钟的时钟一样。当我们往时钟里添加一个闹钟时,可以设置闹钟的首次执行时间、执行间隔时间、备注、是否启动等属性。②一个时钟可以设置多个不同的闹钟,每个闹钟可以有各自的首次执行时间、执行间隔时间、备注、是否启动等属性。③当闹钟响起后,如果我们不手动关闭该闹钟,那么它将会按照设定的执行间隔时间,一直持续执行下去,除非时钟电量耗尽。就如同一个可以设置闹钟的时钟一样,定时器有如下特性:①往定时器添加一个任务(就如同时钟上的闹钟)时,可以设置任务的首次执行时间、执原创 2020-07-01 10:21:32 · 285 阅读 · 0 评论 -
让星星⭐月亮告诉你,打印完全格式的日期格式 包含 年月日时分秒毫秒
/*** 获取完全格式的日期格式* @return 格式如 2020-06-30 15:15:15:015*/public static String getFullDateTime(){StringBuffer sb = new StringBuffer(30);Calendar nowtime = Calendar.getInstance();int _year = nowtime.get(Calendar.YEAR);//获取年数int _month = nowtime.get(Cal原创 2020-06-30 15:43:18 · 806 阅读 · 0 评论 -
静态代理、JDK动态代理及Cglib动态代理各自存在的缺点及代码示例
1.静态代理:基本描述:静态代理代理的是某一个接口的实例对象,以接口的形式对外展示。当然如果不需要以接口的形式对外展示,直接代理对象即可。缺点:只能代理某一种类型,要想代理其他类型,需要修改代码。package unittest.proxy;interface StaticInterface{ void method();}class Target implements StaticInterface{ @Override public void method() { System原创 2020-06-29 22:20:56 · 769 阅读 · 0 评论 -
让星星⭐月亮告诉你,HashMap中红黑树TreeNode的split方法源码解读
PS:由于文档是我在本地编写好之后再复制过来的,有些文本格式没能完整的体现,故提供下述图片,供大家阅览,以便有更好的阅读体验:HashMap中红黑树TreeNode的split方法源码解读分析HashMap$TreeNode(既是树又是链表)的split方法的源码,会发现主要分两部分操作:数据从旧数组转移到新数组上来時,旧数组上的数据会根据(e.hash & oldCap) 是否等于0,重新rehash计算其在新数组上的索引位置,分成2类:① 等于0时,则将该树链表头节点放到新数组时原创 2020-06-20 15:04:30 · 1337 阅读 · 2 评论 -
让星星⭐月亮告诉你,HashMap之往红黑树添加元素-putTreeVal方法源码解读
PS:由于文档是我在本地编写好之后再复制过来的,有些文本格式没能完整的体现,故提供下述图片,供大家阅览,以便有更好的阅读体验:HashMap之往红黑树添加元素-putTreeVal方法源码解读当要put的元素所在数组索引位置已存在元素,且是红黑树类型时,就会调用putTreeVal方法添加元素到红黑树上,具体操作步骤如下:从根节点开始,到左右子树,层层递进,遍历红黑树,找到用于存放元素的合适位置;将元素放入指定位置,并修改链表/红黑树相关节点的前prev后next父parent子(left/r原创 2020-06-18 00:45:51 · 820 阅读 · 0 评论 -
HashMap之链表转红黑树(树化 )-treefyBin方法源码解读(所有涉及到的方法均有详细解读,欢迎指正)
PS:由于文档是我在本地编写好之后再赋值过来的,有些文本格式没能完整的体现,故提供下述图片,供大家阅览,以便有更好的阅读体验:HashMap之链表转红黑树(树化 )-treefyBin方法方法概述:先将链表节点转为树节点,再将都是红黑树节点的链表转为红黑树分析HashMap的put方法的源码时发现,当HashMap中某个链表上存储的元素个数达到TREEIFY_THRESHOLD(树化阈值)=8个时,会调用treeifyBin方法尝试将该链表转换成红黑树。(PS:为什么说是尝试,而不是原创 2020-06-17 10:32:47 · 2683 阅读 · 6 评论 -
从底层数据结构和CPU缓存两方面剖析LinkedList的查询效率为什么比ArrayList低
虽然前面有写到LinkedList与ArrayList的增删改查效率的全面比较,但回想一下还是有必要对这两者的查询效率做一个单独的比较,也能进一步加深理解。这次分底层数据结构和CPU缓存两方面展开它们分别对查询效率的阐述。一、底层数据结构对查询效率的影响1.ArrayList底层数据结构ArrayList底层数据结构是动态数组,创建数组时会给它分配一整段连续的物理内存空间,只要知道数组首地址和数组存储的元素类型,就可以根据指定索引值直接推导得出该索引位置对应的内存地址,进而就可以直接访问得到到该内存地原创 2020-06-05 14:05:06 · 623 阅读 · 0 评论