- 博客(30)
- 收藏
- 关注
原创 Codeforces 提交Java代码(自己处理输入输出)
然后可以直接在输入框中编辑代码,完成后点击底部的 Submit,然后会进入以下界面。如果编译错误或者答案错误,可以点击 Verdict 列的链接查看具体失败原因。可以提交本地文件,也可以在线提交。我们这里选择在线提交方式,点击上图中的 SUBMIT 按钮,会进入如下界面。
2024-06-02 17:49:32
350
1
原创 Java - AbstractQueuedSynchronizer
继承AQS:创建一个新的类,继承AbstractQueuedSynchronizer。实现核心方法:实现tryAcquire和tryRelease方法(用于独占模式),或实现tryAcquireShared和tryReleaseShared方法(用于共享模式)。内部类Sync:通常创建一个内部静态类Sync,扩展AQS并实现上述方法。对外方法:在外部类中,提供获取和释放的方法,内部调用AQS的方法acquire、release、acquireShared和releaseShared。
2024-05-24 21:16:40
654
原创 Java 二叉查找树(TreeMap、TreeSet)
二叉查找树(BST)是一种特殊的二叉树,每个顶点最多可以有两个子节点。这种结构遵循 BST 属性,规定给定顶点的左子树中的每个顶点的值必须小于给定顶点的值,右子树中的每个顶点的值必须大于给定顶点的值。二叉查找树支持快速搜索、插入和删除,各种操作的时间复杂度均为 logn,是一种非常常用的数据结构。
2024-04-26 16:57:21
366
1
原创 Java - List(ArrayList、LinkedList、Vector)
Java 集合 List(ArrayList、LinkedList、Vector)
2024-04-24 10:35:08
752
原创 关于零拷贝(Zero-copy)
具体来说,从操作系统角度看,在读取和写入数据的过程中,CPU 没有参与拷贝数据,所以叫零拷贝。Kafka 则使用了 sendFile。在数据读取和写入的过程中,会发生2次 DMA 拷贝,0次 CPU 拷贝,3次上下文切换,这就是所谓的零拷贝。在数据读取和写入的过程中,会发生2次 DMA 拷贝,2次 CPU 拷贝,4次上下文切换。在数据读取和写入的过程中,会发生2次 DMA 拷贝,1次 CPU 拷贝,4次上下文切换。在数据读取和写入的过程中,会发生2次 DMA 拷贝,1次 CPU 拷贝,3次上下文切换。
2024-04-09 15:28:51
344
原创 Java 网络 IO(BIO、NIO、AIO)
NIO提供的MappedByteBuffer支持支持在内存(堆外内存)中修改文件,可以减少一次数据拷贝。代码示例/*** 说明 1.MappedByteBuffer 可让文件直接在内存(堆外内存)修改,操作系统不需要拷贝一次*///获取对应的通道/*** 参数 1:FileChannel.MapMode.READ_WRITE 使用的读写模式* 参数 2:0:可以直接修改的起始位置* 参数 3:5: 是映射到内存的大小(不是索引位置),即将 1.txt 的多少个字节映射到内存。
2024-04-07 21:56:47
537
原创 多种背包问题的解法模板
给你一个可装载重量为W的背包和N个物品,每个物品有重量和价值两个属性。其中第i个物品的重量为w[i],价值为v[i],现在让你用这个背包装物品,最多能装的价值是多少?经典0/1背包的思路就是二维动态规划,定义好二维数组dp[i][j]表示从0-i个物品中选择总重量不超过j的物品的最大价值,确认边界条件,根据每一步的状态和选择找状态转移方程。解法代码。
2024-01-02 16:07:26
906
原创 用Java实现LRUCache的2种方式
自己实现双向链表节点Node,再基于Node节点实现一个双向链表DoubleList,配合HashMap可以比较简单地实现一个LRUCache。框架搭好之后,实现起来相对是比较简单的。这里把最近最少使用的元素放在链表的头部,细节上,Node是双向链表,且必须同时存储key和value。在删除最近最少使用元素时,需要使用Node的key去哈希表中删除对应的元素。
2023-11-02 15:17:10
468
原创 Java赋值语句顺序的一个特例
但是在以下代码中,会先执行等号左侧的 peek() 逻辑,再执行右侧的 pop() 逻辑。按照先右侧后左侧的惯例,这里的代码应该反过来写,即先取值计算后再出栈。但是反过来写的话,就会报错。,在使用单调栈的过程中发现一个等号赋值的特殊现象。正常来说,一般是先执行等号右侧的逻辑,执行完成后再执行等号左侧的逻辑。以下代码是可以正确执行的,猜测可能跟数组有关,具体原因不是很确定。
2023-10-18 18:53:55
759
原创 Java 生成随机数字验证码
生成指定区间的随机数,只需要用区间下限加上区间内可能存在的数字即可。例如生成[100001, 999999]范围内的数字,只需要用100000加上[1, 900000)范围内的随机数。
2023-09-05 17:38:50
136
原创 Java 之 volatile 关键字
作用volatile 能够保证可见性、有序性,不保证复合操作的原子性。在单线程中,为了提高程序执行效率,编译器和处理器可能对指令进行重排序。单线程环境下,这种优化是没有问题的,但是多线程环境下,如果两个线程之间存在数据依赖,就可能导致程序出错,volatile 可以用来协调不同线程间的变量共享。volatile 的写-读具有和锁的释放-获取相同的内存语义,所以我们有时候也会说 volatile 是轻量级的 synchronized 。具体来说,当写一个 volatile 变量时,JMM 会把该线程对
2021-03-15 17:57:49
112
1
原创 Java 之 final 关键字
目录作用1、构造不可变对象2、确保对象正确初始化实现原理重排序规则底层实现1、写 final 域的实现2、读 final 域的实现对象逸出问题JSR-133为什么要增强 final 的内存语义?作用1、构造不可变对象用于构造不可变对象, final 类型的域是不能修改的。但是如果 final 引用的对象是可变的,那么这些被引用的对象是可以修改的。2、确保对象正确初始化确保线程读取包含 final 域的对象时看到的一定是初始化完成后的 final 域。如果能够通过引用读取到对象,且对象不为空,那么一
2021-03-15 17:11:55
257
1
原创 Java系列文章目录
Java并发finalvolatilesynchronizedReentrantLockReentrantReadWriteLockCountDownLatchSemaphoreCyclicBarrier集合HashMapLinkedHashMapConcurrentHashMapIO零拷贝JVM类加载机制垃圾收集算法垃圾收集器SpringBean的生命周期AOP的底层实现,不同实现方式的区别?为什么说反射存在性能问题?Spring事务与事务传播机制循环依赖
2021-03-15 16:34:35
118
原创 关于synchronized批量重偏向和批量撤销的一个小实验
前段时间学习synchronized的时候做过一个关于批量重偏向和批量撤销的小实验,感觉挺有意思的,所以想分享一下。虽然是比较底层的东西,但是结论可以通过做实验看出来,就挺有意思。我们都知道synchronized分为偏向锁、轻量级锁和重量级锁这三种,这个实验主要是和偏向锁相关的。关于偏向锁,我们又知道,偏向锁在偏向了某一个线程之后,不会主动释放锁,只有出现竞争了才会执行偏向锁撤销。先说结论吧,开启偏向锁时,在「规定的时间」内,如果偏向锁撤销的次数达到20次,就会执行批量重偏向,如果撤销..
2020-11-20 17:22:59
455
2
原创 Spring嵌套事务机制
之前写过一篇文章,是关于Spring嵌套事务机制的,回过头来看发现有不少问题,但暂时不想删掉它,所以再写一篇文章更正一下之前的错误。这里先再次说明一下PROPAGATION_NESTED的作用,若当前存在事务则以嵌套事务方式执行,若不存在事务则创建一个新事务。考虑到动态代理的实现方式,同一个类内部不同方法之间的调用只有外部方法的代理会生效,因此这里的讨论不考虑同一个类内部方法之间互相调用的情况,只考虑不同的类之间的方法进行调用的情况。我们知道嵌套事务底层实际是利用SAVEPOINT实现的,因此外部事务回
2020-11-15 18:55:58
348
1
原创 关于HashMap的一个有趣的小问题
最近被问到了一个很有意思的问题,是关于HashMap的。之前没看到过类似的问题,感觉很有趣,所以想记录一下。问题很简单,基于一个很简单的常识,即重写equals方法必须同时重写hashCode方法。问题的内容是,假如只重写了equals方法,或者只重写了hashCode方法,分别会出现什么情况?因为比较细节,所以通过源码来分析一下。可以考虑这两个场景,①put之后用等价的key再次put,②put之后用等价的key尝试get。首先看只重写equals方法的情况。场景①会发生什么情况?场景②会发生什么情况
2020-11-15 00:19:10
76
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人