
Code
文章平均质量分 77
Dylanioucn
写一首关于世界的诗,以编程的方式~
展开
-
【二叉树前/先序DLR中序LDR后序LRD遍历及镜像翻转,so esay~】
二叉树的遍历方式,根据遍历根节点的顺序不同,分为三种:前序(先序)遍历(DLR)、中序遍历(LDR)、后序遍历(LRD);镜像反转【将二叉树的每个左右子树互换】原创 2022-04-17 21:42:16 · 1852 阅读 · 0 评论 -
逆序打印字符串的三种思路(StringBuilder.reverse()方法/从后往前倒序访问字符数组/前后交换字符数组元素)
逆序打印字符串的三种思路(StringBuilder.reverse()方法/从后往前倒序访问字符数组/前后交换字符数组元素)原创 2022-04-12 12:38:11 · 1582 阅读 · 0 评论 -
【算法每日一练及解题思路】给定一个字符串,找出其中不含重复字符的最长子串的长度V2
从左到右遍历字符串的每个字符,找到每个字符所能组成的不包含重复字符的子串,然后比较这些子串的长度,取其中最大的那一个即是所要找的不含重复字符的最长子串。原创 2022-04-09 12:56:10 · 1292 阅读 · 1 评论 -
【算法每日一练及解题思路】给定一个字符串,找出其中不含重复字符的最长子串的长度V1
给定一个字符串,找出其中不含重复字符的最长子串的长度原创 2022-04-08 16:27:43 · 1509 阅读 · 1 评论 -
Oracle Java官网关于不可变对象的解析
Oracle Java官网关于不可变对象的解析一、Immutable Objects(不可变对象)1. 原文url2. 原文翻译二、A Synchronized Class Example(一个同步类的例子)1. 原文url2.原文代码3. 原文翻译三、A Strategy for Defining Immutable Objects(定义不可变对象的策略)1.原文url2.原文翻译3.原文代码一、Immutable Objects(不可变对象)1. 原文url https://docs.oracle原创 2022-04-07 22:17:35 · 750 阅读 · 0 评论 -
不加锁交替执行线程的两种思路(递加取余判断、环形链表步进)(无锁,存在线程安全问题,在此仅作为一种思路分享)
不加锁交替执行线程的两种思路(递加取余判断、环形链表步进)原创 2022-04-02 17:37:27 · 1098 阅读 · 1 评论 -
【编程进阶知识】 解锁HashMap的隐藏陷阱:深入探讨hashCode与equals方法的重要性
一、⭐⭐⭐何为内存泄漏????????????内存泄漏,指的是该对象在Java应用程序中的使命已经完结,该做的事情都已经做完了,对Java应用程序来说,已经没有继续存在的价值和意义了,可以被GC回收了。可偏偏GC无法对这个对象做回收处理。因为,该对象被错误的禁锢在了某个不知名不易被察觉的地方。随着时间的流逝,这种因各种原因导致的内存泄漏而存在的无效对象会越来愈多,占用的内存就越大,就有可能会导致Java应用程序申请不到足够的内存空间,引发内存溢出。二、⭐⭐⭐Object中的hashCode和equal原创 2021-04-26 00:12:20 · 2604 阅读 · 1 评论 -
线程交替执行的几种方法(递加求余判断/环形链表步进/LockSupport/synchronized/ReentrantLock/CountDownLatch/循环屏障/信号量)
线程交替执行的几种方法(累加求余判断/环形链表步进/LockSupport/synchronized关键字/ReentrantLock可重入锁/CountDownLatch倒计时门闩/CyclicBarrier循环屏障/Semaphore信号量)原创 2021-04-11 22:58:29 · 980 阅读 · 2 评论 -
【编程基础知识】一个`static`引发的奇遇:实例变量与静态变量的奥秘
零、前情提要????????????实例变量(也称成员变量),在类的实例对象被创建时,会先按照实例变量的先后顺序被赋初始默认值,然后再按照实例赋值语句先后的顺序进行实例变量的赋值操作,最后执行构造方法。静态变量(也称类变量),在类初始化的时候,会先按照静态变量的先后顺序被赋初始默认值,然后再按照静态赋值语句先后的顺序进行静态变量的赋值操作。这里还搞不大清楚没关系,让我们来演示推敲一番:一、⭐⭐⭐实例变量版本演示代码????????????class InstanceObj{ public st原创 2021-04-07 18:08:42 · 142 阅读 · 1 评论 -
让星星⭐月亮告诉你,强软弱虚引用类型对象在内存足够和内存不足的情况下,面对System.gc()时,被回收情况如何?
一、⭐⭐⭐工具????????????Eclipse+JDK1.8注:测试前需配置eclipse的JVM运行参数:-Xmx10m -Xms10m(如何配置eclipse的JVM运行参数),只分配10M的内存。因为会使用创建指定大小字节数组的方式,来触发内存临界值(10M),进而观察内存足够和不足两种场景下不同引用类型的具体表现。二、⭐⭐⭐概念????????????1 强引用类型强引用类型的对象无特定类型,硬气!宁折不弯,即便在内存不足报OutOfMemmoryError(OOM)的情况下,也不肯原创 2021-04-06 19:06:28 · 464 阅读 · 2 评论 -
使用完全注解的方式进行AOP功能实现(@Aspect+@Configuration+@EnableAspectJAutoProxy+@ComponentScan)
1、简单介绍如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP,如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换.2、注解说明@Configuration//用于定义配置类,可替换xml配置文件@EnableAspectJAutoProxy(proxyTargetClass=true) //开启AspectJ 自动代理模式,如果不填proxyTargetClass=true,默认为false(代表即便你配置了@EnableAsp原创 2021-04-05 13:04:32 · 1369 阅读 · 6 评论 -
让星星月亮告诉你,通过反射创建类的实例对象,并通过Unsafe theUnsafe来修改实例对象的私有的String类型的成员属性的值
首先,了解一些Unsafe这个类,这个类可以直接进行内存级别的相关操作(如分配释放内存、修改指定内存地址的值等),这里主要介绍的是用它的theUnsafe私有成员属性来修改指定内存位置的值。流程如下:一、 获取Unsafe theUnsafe属性1、 通过反射获取Unsafe.class的theUnsafe属性(可以用它来进行内存操作,这里主要是用它来修改指定内存位置的值)2、 将属性访问权限放开因为该属性是私有属性,本来外部是无法直接访问的,如果不把属性访问权限放开,则无法获取属性,在执行f.g原创 2021-04-04 19:01:46 · 500 阅读 · 2 评论 -
【编程进阶知识】Java单例模式深度解析:饿汉式与懒汉式实现技巧
一、概述:单例模式:某个类在整个系统种只能有一个实例对象可被获取和使用的代码模式,提供一个全局唯一的类的实例对象给外部调用,例如:代表jvm运行环境的Runtime类。要点如下:1、保证类只有唯一一个实例对象:则要求存储该实例对象的是一个静态变量;2、保证只能在该类的内部创建实例对象,其他地方不允许创建:则要求该类的构造器私有化;3、保证外部能访问获取到这个唯一的实例对象:1)直接暴露public2)提供静态变量的get方法。4、根据创建对象时机的不同,分饿汉式和懒汉式:1)饿汉式:还没等原创 2021-03-25 22:37:34 · 237 阅读 · 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 · 277 阅读 · 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 · 146 阅读 · 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 · 152 阅读 · 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 · 120 阅读 · 1 评论 -
让星星⭐月亮告诉你,本地验证webservice接口demo项目(包含客户端服务端,支持请求参数为字符串返回结果为xml、请求参数为xml、请求被服务端屏蔽的接口三种场景)
1.背景:有些第三方客户可能对外提供的是webservice接口,而非Restful风格http接口。在无法连到第三方客户的环境里进行实地验证的情况下,为了尽可能地减少上线部署时的风险,最好能先在本地对接口进行充分的验证。故编写了这个可以在本地验证webservice接口的demo项目,以便在对接webservice接口时进行本地验证调试。此demo里包含***请求参数为字符串返回结果为xml***、请求参数为xml、***请求被服务端屏蔽的接口***三个案例演示。此demo包含服务端、客户端及公共工原创 2021-02-05 22:03:17 · 301 阅读 · 4 评论 -
让星星⭐月亮告诉你,openjdk8源码下载链接分享 百度网盘永久分享 可以配置到eclipse中查看源码 如sun.misc.Unsafe源码
openjdk8源码下载链接分享 百度网盘永久分享 可以配置到eclipse中查看源码 如Unsafe源码1.下载地址:百度网盘地址:https://pan.baidu.com/s/1si1lC43WqxCMKaZL66Tr9g提取码:ctp12.eclipse配置:下载后,eclipse查看openjdk源码的配置步骤如下001.选中项目后点击右键>点击Build Path>点击Configure Build Path:002.下载后,eclipse查看openjdk源码的配置原创 2021-01-29 00:26:10 · 1326 阅读 · 1 评论 -
让星星⭐月亮告诉你,Java二叉查找树的基本实现
二叉树可分为满二叉树、完全二叉树、平衡二叉树(二叉查找树)、最优二叉树(哈夫曼树),此篇代码实现的是二叉查找树(左右子树深度之差的绝对值不超过1待实现)。package unittest;import java.util.Arrays;class Person implements Comparable<Person>{ private String name; private int age; Person(String name,int age){ this.name =翻译 2020-07-29 14:27:07 · 149 阅读 · 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 · 166 阅读 · 0 评论 -
让星星⭐月亮告诉你,自定义定时器和Java自带原生定时器
一. 定时器概述何为定时器?①就像可以设置闹钟的时钟一样。当我们往时钟里添加一个闹钟时,可以设置闹钟的首次执行时间、执行间隔时间、备注、是否启动等属性。②一个时钟可以设置多个不同的闹钟,每个闹钟可以有各自的首次执行时间、执行间隔时间、备注、是否启动等属性。③当闹钟响起后,如果我们不手动关闭该闹钟,那么它将会按照设定的执行间隔时间,一直持续执行下去,除非时钟电量耗尽。就如同一个可以设置闹钟的时钟一样,定时器有如下特性:①往定时器添加一个任务(就如同时钟上的闹钟)时,可以设置任务的首次执行时间、执原创 2020-07-01 10:21:32 · 311 阅读 · 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 · 824 阅读 · 0 评论 -
让星星⭐月亮告诉你,HashMap中保证红黑树根节点一定是对应链表头节点moveRootToFront()方法源码解读
红黑树根节点若不为其对应链表的头节点,则按照下述步骤的处理,将根节点向前移动到头节点:将根节点从所在链表中删除,即链表的删除操作:修改根节点的前后节点的指向即可,即将根节点的上一节点的下一节点设置为根节点的下一节点,将根节点的下一节点的上一节点设置为根节点的上一节点。将根节点所在链表的头节点位置的值设置为根节点;将现有头节点的上一个节点设置为根节点,将根节点的下一个节点设置为现有头节点,将根节点的上一个节点设置为null.具体源码如下:/**HashMap$TreeNode的moveRootT原创 2020-06-09 23:45:42 · 467 阅读 · 0 评论 -
让星星⭐月亮告诉你,HashMap在put数据时是如何找到要存放的位置的?
初印象:初识HashMap时,知道HashMap是用来存放Key-Value这样的键值对的,也知道HashMap的底层数据结构是:数组+链表+红黑树,且数组长度为2的x次幂。疑问:那么往HashMap中添加键值对时,是什么决定了键值对的存放位置呢?即存放位置是如何计算出来的呢?相同的疑问可能还会以下面的问题描述方式提出来:其他描述方式:1.向HashMap中put数据时,数据是如何找到HashMap中Node<K,V>[] table数组的对应索引下标位置的?2.HashMap在put&原创 2020-06-03 23:26:33 · 2187 阅读 · 0 评论 -
让星星⭐月亮告诉你,HashMap的resize()即扩容方法源码解读(已重新完善,如有不足之处,欢迎指正~)
分析HashMap的resize()即扩容方法的源码,会发现主要分两部分操作:为创建新数组初始化新数组容量和新数组扩容阈值;创建新数组后,需将旧数组数据转移到新数组上来具体,详见下述的源码解析:/**HashMap的resize()方法*//** * Initializes or doubles table size. If null, allocates in * accord with initial capacity target held in field thr原创 2020-06-02 23:57:16 · 276 阅读 · 4 评论 -
让星星⭐月亮告诉你,HashMap的put方法源码解析及其中两种会触发扩容的场景(足够详尽,有问题欢迎指正~)
分析HashMap的put方法的源码后发现,HashMap的扩容方法在两个场景下会被调用:初始化HashMap的链表数组时,会被调用,用来初始化链表数组的初始容量为16,以及初始化链表数组的阈值为初始容量16*负载因子0.75=12;当put到HashMap存储的元素个数超过阈值时,会被调用,用来将链表数组的容量和阈值都扩大为原来的2倍。具体,详见下述的源码解析:/*HashMap的put方法,实际上调用的是putVal方法/public V put(K key, V value) {原创 2020-06-01 16:53:21 · 316 阅读 · 0 评论 -
让星星⭐月亮告诉你,Java冒泡排序及其时间复杂度计算
@author Dylaniou2020-05-28 21:21冒泡排序算法:第一轮冒泡排序:第一次拿数组的第1位和第2位进行比较,若第1位大于第2位,则将两者的值交换,再继续拿交换后的第1位与第3位进行比较,若第1位大于第3位,则将两者的值交换,然后再继续拿交换后的第1位与后续位进行比较,直到第1位与后续所有位置都比较完毕,最后会发现第一轮冒泡排序的最终结果是把最小值放到了第1位;第二轮冒泡排序:因为第一轮已经把最小值放到了第1位,则第二轮应该从第2位开始第一次拿数组的第2.原创 2020-05-28 23:11:18 · 1376 阅读 · 0 评论 -
让星星⭐月亮告诉你,LinkedList和ArrayList(指定位置/头尾增加删除)
代码执行结论:/*现象:LinkedList在指定位置采用add(index,data)方式增加数据时,位置越靠前耗时越少,越靠后耗时越多(而ArrayList采用add(index,data)方式的耗时跟位置关系不大);原因:虽说LinkedList底层属于链表数据结构,不需要开辟一块连续的内存地址空间,逻辑上连续即可,在新增、插入和删除操作上占优势(只需要修改节点的前后指向即可,不需要移动数据);但是因为LinkedList在插入时需要移动指针到指定节点, 才能开始插入,一旦要插入的位置比较远,原创 2020-05-08 18:08:28 · 3286 阅读 · 2 评论 -
让星星⭐月亮告诉你,Java NIO之Buffer详解 属性capacity/position/limit/mark 方法put(X)/get()/flip()/compact()/clear()
package nio;import java.nio.ByteBuffer;public class BufferTest {public static void main(String[] args) throws InterruptedException {ByteBuffer buf = ByteBuffer.allocate(9);System.out.println("初始c...原创 2020-05-08 11:02:48 · 233 阅读 · 0 评论 -
【编程进阶知识】揭秘Java多线程:并发与顺序编程的奥秘
package unittest;public class Test extends Thread{String title;Test(String title){this.title = title;}public void run(){for(int i = 0; i < 3; i++){System.out.println(this.title+ ":hello " +...原创 2020-04-21 13:25:58 · 234 阅读 · 1 评论 -
让星星⭐月亮告诉你,Java synchronized(*.class) synchronized 方法 synchronized(this)分析
结论:synchronized(SynchronizedTest.class)锁加在类上,若有多个类的实例对象,则同一时刻只能由一个类的实例对象(拥有t1的线程th1)获取到该类上的锁,其他类的实例对象(拥有t2的线程th2)需要等待synchronized void synchronizedMethod() 锁加在普通方法上,同一时刻多个实例对象访问到该方法时,每个实例对象都可以进行方法的...原创 2020-04-21 12:18:24 · 291 阅读 · 0 评论 -
让星星⭐月亮告诉你,jdk1.8 Java函数式编程示例:Lambda函数/方法引用/4种内建函数式接口(功能性-/消费型/供给型/断言型)
package unittest;import java.util.function.Consumer;import java.util.function.Function;import java.util.function.Predicate;import java.util.function.Supplier;@FunctionalInterfaceinterface IFucti...原创 2020-04-15 18:23:53 · 240 阅读 · 0 评论 -
【编程基础知识】 分析学生成绩:用Java二维数组存储与输出
通过本文,你学习了如何使用Java二维数组来存储和输出学生的成绩。这是一个非常实用的技能,无论是在学术还是工业界都有广泛的应用。如果你有任何想法或经验,欢迎在评论区分享!让我们一起探索更多的编程技巧。原创 2020-02-25 11:03:07 · 6687 阅读 · 0 评论 -
【编程基础知识】Java打印九九乘法表
package unittest;/**@author Dylaniou打印九九乘法表/public class Test {public static void main ( String[] args ){for(int i = 1;i<=9;i++){for(int j = 1;j<=i;j++){String tab = “”;if(ij<10){...原创 2020-02-24 01:14:26 · 192 阅读 · 1 评论 -
【编程基础知识】switch case可以用string(千万注意要加上break)
本文深入探讨了Java中switch语句使用字符串时的注意事项,特别是break语句的重要性。通过实际代码示例和流程图,读者将了解如何正确使用switch语句处理字符串,避免常见的编程错误。在Java 7及以后的版本中,switch语句支持字符串。这使得代码更加灵活和易于阅读。在switch语句中,如果没有break语句,程序将继续执行下一个case,这可能导致意想不到的结果。正确使用break语句在switch语句中至关重要,尤其是在处理字符串时。本文通过代码示例和流程图,帮助读者理解其重要性。原创 2020-02-23 20:35:44 · 4467 阅读 · 1 评论 -
ServerSoket/Socket聊天简单实现V3(多线程,多个客户端对一个服务器,客户端可接收可发送,服务器可接收可发送【发送后需等到再次接收到消息才能再次发送】)
package communication;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.io.InputSt...原创 2020-02-23 01:42:37 · 358 阅读 · 0 评论 -
ServerSoket/Socket聊天简单实现V2(单线程,一个客户端对一个服务器,客户端可接收可发送,服务器可接收可发送【发送后需等到再次接收到消息才能再次发送】)
package communication;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.net.Se...原创 2020-02-22 20:46:36 · 269 阅读 · 0 评论 -
ServerSoket/Socket聊天简单实现V1(单线程,一个客户端对一个服务器,客户端单向发送,服务器被动接收)
package communication;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.ServerSocket;import java.net.Socket;/**@author Dylaniou需要先启动服务器...原创 2020-02-22 20:09:18 · 486 阅读 · 0 评论 -
FileReader/FileWriter复制文件(分别按字符和字符数组复制)
package unittest;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;/** * @author Dylaniou * 读取字符数组的效率显然要比读取字符效率高很多 */public class CopyFile { public static void ...原创 2020-02-16 13:12:53 · 215 阅读 · 0 评论