- 博客(20)
- 收藏
- 关注
原创 Java Externalizable 序列化
序列化():指将一个Java对象转换成一个I/O流中字节序列的过程;目的是将对象存储在磁盘中或通过网络直接传输对象。反序列化:指将对象序列化后的二进制字节序列重新转换为对象的过程。序列化针对的是对象。
2024-03-07 16:22:23 459
原创 h & (n- 1) 求余数的说明
通过以上过程,可以发现相减时,(从左向右看)被减数的1在不断向后移动,最终结果一定是将1移动到与减数最高位1的后方;即使在最大余数为3时,结果的最高位1也依旧处于减数的最高位1后方(0011与0100)。总结,当n为2的幂数时,n - 1正好是最大余数;当n不是2的幂数时,例如7,它最大的余数为6(0110),最后一位不是1,不能符合上述规则(因为6本身就有一位是0)。因此,当最大余数的所有位置都是1时,我们可以通过与运算获取余数,因为这个余数一定是将某一个或某些1置为了0。n = 7时则行不通。
2024-03-04 12:26:32 300
原创 快慢指针经典应用
文章目录FastSlowPointerFastSlowPointer快慢指针概念快慢指针中的快慢指的是移动的步长,即每次向前移动速度的快慢。 例如,可以让快指针每次沿链表向前移动2,慢指针每次向前移动1次。经典应用判断单链表是否为循环链表思想: 当链表中存在环时,快指针与慢指针一定会在某一个结点处相遇,就像在操场跑步,快的人将会追上慢的人,即他们一定会相遇。public class ListNode<T> { T val; ListNode<T> next;
2022-01-26 17:48:20 709
原创 MySQL事件
文章目录MySQL事件事件事件调度器创建事件查看事件修改时间删除事件举例MySQL事件事件事件是指根据计划在未来的指定时间执行一次或多次的任务。任务开始和结束于指定的日期和时间,期间执行一次或间隔执行多次。与触发器不同,事件由事件触发,且并不依赖于特定的触发动作。事件的管理由事件调度器完成。事件由一个特殊的事件调度程序线程执行,当我们提到事件调度程序时,实际上指的是这个线程。在运行时,具有process权限的用户可以在show processlist的输出中看到事件调度程序线程及其当前状态。
2021-11-16 14:32:48 1592
原创 JDK动态代理详解
文章目录JDK动态代理准备基础解释原理解释JDK动态代理准备被代理类public class Demo implements DemoInterface{ @Override public int get(int num) { return num + 1; }}代理类import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class Dem
2021-10-19 21:49:04 409
原创 MySql连接JOIN
文章目录Mysql准备交叉连接外连接内连接联合查询全连接自然连接Mysql准备create table a( m varchar(10) not null primary key, n varchar(10) null, k varchar(10) null);create table b( k varchar(10) not null primary key, l varchar(10) null);create t
2021-10-12 15:37:58 203
原创 Eclipse创建Maven项目
创建maven项目(一)1、File – New – Maven Project2、勾选Create a simple project3、设置参数关于参数的说明,请参考参数说明group id和artifact id 统称为“坐标”, 目的是保证项目的唯一性而提出。在你的项目上传到maven时,这两个id用于定位你的jar包。group id一般分为多个段。第一段为域,第二段为公司名称,…。域又分为org、com、cn等等许多,其中org为非营利组织,com为商业组织。4、点击Fini
2021-09-15 14:19:54 2536
原创 Thread与Runable、Callable运行原理
本文仅代表个人见解,如有错误,欢迎指出,期待与各位共同进步!本文适合想要知道运行原理但又不想太深入源码的同学食用。这是本文内容的简化图:一、我们知道java提供了Thread类来启动线程,但是java真的可以启动线程吗? 答案是否定的,java并不能真正启动线程,而是通过调用本地方法来启动线程。private native void start0(),start0方法是使用其他语言实现的,功能就是启动线程。二、Thread类如何启动线程? 我们知道让一个类继承Thread类并重写,那么这个
2021-08-23 16:01:00 544
原创 java.util.concurrent.CyclicBarrier
CyclicBarrier可循环屏障,作用是使得一组线程相互等待,直到最后一个线程到达屏障后,释放所有阻塞在该屏障上的线程,用于线程同步通信。public class CyclicBarrier { private static class Generation { Generation() {} // 保护构造器 boolean broken; // 确认屏障是否被打破 } // 锁
2021-08-19 17:50:01 215
原创 CopyOnWriteArrayList类为何能保证线程安全
CopyOnWriteArrayList与ArrayList相比多出了CopyOnWrite部分,这也反映出了前者在底层所使用的原理,即写入时复制策略。 CopyOnWrite,简称COW,是一种优化策略。使用COW来实现读写分离操作,其原理是当多个线程对同一个资源的操作,分为读操作和写操作。 对于读操作来说,不需要同步,因为大家读到的都是一样的。 对于写操作来说,需要同步,因为你改我也改很有可能出现覆盖导致数据出错,因此需要保证在同一时间只有一个线程在操作。 基于此原理,CopyOnW
2021-08-18 16:42:23 1112
原创 依赖倒置原则
依赖倒置例如,向书柜放入书本,你需要对每一种书写一个put方法,就像这样public class Bookcase { ArrayList<String> books; public Bookcase(ArrayList<String> books) { this.books = books; } // 每一种书的放入方法 public void putJava(Java java) { books.add(
2021-08-18 01:26:09 83
原创 java多线程问题-虚假唤醒
虚假唤醒,个人觉得还是叫错误唤醒比较合适。这是指线程在不应当被唤醒的情况下被唤醒后没有重新进入阻塞状态的问题。例如,(经典问题)多线程实现对数字0的+1和-1操作的轮替,使得输出为1,0,1,0,1,0,…/*** num 初始化为 0* 线程A和C实现对num的+1操作* 线程B和D实现对num的-1操作*/public class Threads { public static void main(String[] args) { Number number =
2021-08-17 18:42:53 214
原创 HashMap底层tableSizeFor(int i)方法变动
HashMap底层中tableSizeFor(int i)方法作用是确保底层数组扩容时新的数组容量为2的幂次数,即2n。jdk1.8:static final int tableSizeFor(int cap) { int n = cap - 1; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >&g
2021-08-04 15:13:37 162
原创 LinkedList中addAll(Collection<? extends E> C)方法解析
本文长度还算比较长,如果你觉得过于冗长,可以你可以只看源码和图片部分。public boolean addAll(int index, Collection<? extends E> c) { checkPositionIndex(index); Object[] a = c.toArray(); int numNew = a.length; if (numNew == 0) return false;
2021-07-29 18:54:51 1139
原创 逻辑运算符操作二进制位
文章目录加法运算统计一个整数的二进制串中1的个数加法运算问题:不使用+、-、*、/来完成加法运算。解法:public int Add(int num1,int num2) { while (num2 != 0) { int temp = num1 ^ num2; int tmp = (num1 & num2) << 1; num1 = temp; num2 = tmp;
2021-07-27 14:44:57 244
原创 关于Java中ArrayList最大容量Integer.MAX_VALUE-8中的8所代表的意义
关于为何要减8这个问题,下面还是作者的解释:/*** The maximum size of array to allocate (unless necessary).* Some VMs reserve some header words in an array.* Attempts to allocate larger arrays may result in* OutOfMemoryError: Requested array size exceeds VM limit*/翻译过来就是
2021-07-22 01:48:19 1529 4
原创 移位操作判断数字的奇偶
判断结果(number & 1) == 0number为偶数(number & 1) == 1number为奇数支持这种算法的基础有:1.偶数的二进制串的最后一位为0;奇数的二进制串的最后一位为12.& :只有双方均为true时结果为true,否则为false。下面是100以内的二进制串表偶数二进制串奇数二进制串002101141003116110510181000...
2021-07-19 13:38:46 799
原创 异或(^)运算
异或(^)a^b:将a和b都用2的从大到小的幂次的和来表示,然后将两者中相同的幂次数除去,最后将a和b剩余的幂次相加得到结果。支持这种算法的基础:异或运算,相同为0,不同为1。一个二进制数可以写成多个二进制数相加的形式,将加数写成十进制后依然不会改变二进制数的大小。举例:96^2596 : 1100000 ==> 1000000+100000 ==>64+3225 : 11001 ==> 10000+1000+1 ==>16+8+196^25 = 64+
2021-07-15 19:12:52 4423 1
原创 Linux基础命令
Linux命令命令解释字典序ABCDEFGHIJKLMNOPQRSTUVWXYZip addr查看IP地址ifconfig查看IP地址ls查看当前目录下的文件(不包含隐藏文件)ls -a查看当前目录下的所有文件(包括隐藏文件)ls -l查看当前目录下文件以及文件的详细信息pwd查看当前目录...
2021-07-14 11:39:37 248
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人