
Java基础
学亮编程手记
学亮编程手记
展开
-
Java CopyOnWriteArrayList 及写时复制机制详解
CopyOnWriteArrayList是Java并发包中提供的一种线程安全的List实现,采用"写时复制"(Copy-On-Write, COW)技术来保证线程安全。其核心思想是读取操作直接访问当前数据结构,而写入操作则先复制整个数据结构,在副本上进行修改,最后替换原数据结构。这种机制特别适合读多写少的场景,因为读取操作无锁,性能极高,而写入操作通过复制保证线程安全。CopyOnWriteArrayList的优点是读取性能高、线程安全、迭代安全,缺点是内存占用大、数据一致性弱、不适合频原创 2025-05-17 22:22:51 · 328 阅读 · 0 评论 -
HTTPS 的端口可以设置为任意端口吗?
但需满足技术配置和网络环境的限制。HTTPS 可配置为任意端口,但需权衡便利性与安全性。原创 2025-05-04 13:02:36 · 432 阅读 · 0 评论 -
一次完整的HTTPS请求流程剖析
HTTPS(Hypertext Transfer Protocol Secure)是在HTTP基础上通过SSL/TLS协议实现加密、身份认证和数据完整性的安全传输协议。HTTPS通过TLS握手建立安全通道,结合非对称加密的密钥交换和对称加密的高效数据传输,实现了端到端的安全通信。其核心在于证书验证和密钥协商机制,确保传输的机密性、完整性和身份真实性。原创 2025-05-04 13:01:37 · 333 阅读 · 0 评论 -
maven基础:mvn指定settings.xml配置文件
【代码】maven基础:mvn指定settings.xml配置文件。原创 2025-03-16 10:37:03 · 364 阅读 · 0 评论 -
jdk 17下载地址
不需要登陆Oracle账户。原创 2025-02-20 09:48:33 · 563 阅读 · 0 评论 -
平衡树的特点
平衡树作为一种自平衡的数据结构,保证了在动态数据集中的高效查找、插入和删除操作。它广泛应用于数据库索引、文件系统、内存数据库、优先队列等领域,尤其适用于对性能要求较高、数据集动态变化的场景。通过不同类型的平衡树(如 AVL 树、红黑树、B 树等),可以针对不同的应用场景进行优化选择。原创 2025-01-31 16:55:28 · 651 阅读 · 0 评论 -
B 树(B-tree)和 B+ 树(B+ tree)的区别
特性B 树B+ 树数据存储数据存储在所有节点(包括内部节点和叶子节点)数据仅存储在叶子节点,内部节点只存储索引查询效率查询可能需要在多个节点中查找查询通常更高效,直接查找叶子节点范围查询范围查询效率较低范围查询非常高效,叶子节点通过链表连接存储效率较低,节点存储了数据和索引较高,内部节点仅存储索引,叶子节点存储数据插入/删除效率插入/删除时内部节点数据可能移动插入/删除时仅涉及叶子节点,效率更高简而言之,B 树适用于需要快速查找单条数据的场景,而B+ 树。原创 2025-01-31 16:46:25 · 749 阅读 · 0 评论 -
B+ 树(B+ Tree)和跳表(Skip List)的对比及区别
特性B+ 树跳表(Skip List)数据结构自平衡的多路查找树层次化的链表结构查找时间复杂度O(log N)O(log N)(平均)插入/删除复杂度O(log N)(需要保持平衡)O(log N)(通过随机化实现)内存占用相对较高相对较低实现复杂度较高,需要维护树的平衡较低,通过随机化控制层数范围查询非常高效,叶子节点链表连接支持,但效率较低适用场景数据库索引、文件系统、大规模数据查询内存数据库、动态集合、有序数据查询B+ 树。原创 2025-01-31 16:45:09 · 996 阅读 · 0 评论 -
SSTable数据结构介绍
SSTable 就像是一个有序的、不可变的书架,用于高效存储和查找大量数据。它通过将数据分成多个文件来避免频繁的修改,通过索引和 Bloom Filter 加速查找,并通过合并操作优化存储和读取性能。由于它的设计简单且高效,SSTable 被广泛应用于各种需要高效存储和查找大规模数据的场景。原创 2025-01-31 16:03:45 · 654 阅读 · 0 评论 -
跳表skiplist的实现思路及示例说明
最底层存储所有数据,而更高的层级存储部分数据,每一层都起到“跳过”不必要数据的作用。这样,你就可以先从索引表中找到大概的位置,然后跳到那个页面,从而加快查找速度。的思路就类似这个字典索引,只不过它不是一个传统的索引表,而是通过多层“索引”来加速查找过程。,每一层都是一个“索引”,帮助我们快速定位到数据的位置。通过这种方式,我们每次查找可以“跳过”很多不必要的元素,显著加速查找过程。这层的数据是“更重要”的数据,它们可以让我们更快速地找到数据范围。,15 比 13 大,但比 17 小,所以我们跳到。原创 2025-01-31 15:53:28 · 301 阅读 · 0 评论 -
跳表(SkipList)数据结构介绍
跳表(SkipList)通过多层次的索引结构实现高效的查找、插入和删除操作。它的实现简单且与平衡树相比,性能表现良好,特别适用于需要频繁更新和查找的数据场景,如数据库索引和缓存系统。由于其实现简单且具有较好的性能,跳表成为了 Redis 等分布式系统中常用的数据结构之一。原创 2025-01-31 15:50:57 · 893 阅读 · 0 评论 -
Java 中使用 Thread.sleep() 设置等待时间可能有误差么?
这种方法可以更精确地控制等待时间,但会占用 CPU(称为忙等待)。设置等待时间时,有可能会出现误差。,但在某些环境下(如高负载系统)误差可能会更大。在大多数情况下,这个误差可能是。以下代码可以用来验证。原创 2025-01-27 16:47:26 · 1219 阅读 · 0 评论 -
运行 Maven 项目中某个类的 main 方法的5种途径
最简单的方法通常是通过 IDE 直接运行main方法,因为这种方式直观且易于配置。如果需要在命令行环境中自动化运行,推荐使用插件,因为它与 Maven 的构建生命周期无缝集成,并且配置相对简单。原创 2025-01-10 15:20:51 · 730 阅读 · 0 评论 -
Java JDK 17新特性:模式匹配
在JDK 17中,模式匹配主要用于instanceof表达式。模式匹配增强了instanceof的语法和功能,使类型检查和类型转换更加简洁和高效。在传统的Java版本中,我们通常使用instanceof结合类型转换来判断对象类型并进行处理,这往往会导致冗长的代码。原创 2025-01-04 12:05:32 · 223 阅读 · 0 评论 -
Java JDK 17新特性:集合类的工厂方法
在Java8的年代,即便创建一个很小的集合,或者固定元素的集合都是比较麻烦的,为了简洁一些,有时我甚至会引入一些依赖。原创 2025-01-04 12:01:25 · 230 阅读 · 0 评论 -
Java 8 接口 default 方法的使用场景分析
在 Java 8 及以后的版本中,接口可以包含default方法。default方法允许接口提供一个默认实现,这样实现了该接口的类可以选择性地重写这些方法,或者直接继承默认行为。这种特性为 Java 的接口带来了更多的灵活性,并解决了多个接口实现时可能出现的问题。以下是default。原创 2025-01-04 11:54:48 · 330 阅读 · 0 评论 -
java代码示例:在 JDK 17 中使用增强的 switch 表达式来返回值
MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY这个私有枚举Week定义了一周中的每一天。它用于作为getByJDK17方法的参数类型,确保传入的是有效的星期几。原创 2025-01-04 11:46:26 · 504 阅读 · 0 评论 -
Java JDK 17新特性:私有接口方法
从Java8开始,允许在interface里面添加默认方法,其实当时就有些小困惑,如果一个default方法体很大怎么办,拆到另外的类去写吗?原创 2025-01-04 11:44:13 · 250 阅读 · 0 评论 -
Java JDK 17新特性:全新的switch表达式
有人可能问了,Java语言不早已支持switch了嘛,有什么好提的?讲真,这次的提升还真有必要好好地来聊一聊了。在Java12的时候就引入了switch表达式,注意这里是表达式,而不是语句,原来的switch是语句。如果不清楚两者的区别的话,最好先去了解一下。主要的差别就是就是表达式有返回值,而语句则没有。再配合模式匹配,以及yield和“->”符号的加入,全新的switch用起来爽到飞起来。原创 2025-01-04 11:33:10 · 321 阅读 · 0 评论 -
JDK 17定义和使用 Records
定义了一个名为Person的记录。创建了一个包含三个参数的私有最终构造函数,用于初始化firstNamelastName和age字段。自动生成了和getAge()访问器方法。自动生成了toString()和hashCode()方法。自动生成了方法,前提是所有组件都实现了Comparable接口。虽然记录通常不需要显式定义构造函数,但在需要时可以添加。原创 2025-01-04 11:27:20 · 599 阅读 · 0 评论 -
Java JDK 17新特性:Records简化了POJO类的编写
在Java中,POJO对象(如DO、PO、VO、DTO等)通常包含成员变量及相应的Getter和Setter方法。Lombok插件为此出现,能够在编译期间自动生成Getter、Setter、hashcode、equals和构造函数等代码,使用起来方便,但对团队有依赖要求。它通过简洁的语法定义数据类,大大简化了POJO类的编写,如下所示。虽然hashcode和equals方法仍需手动编写,但IDE能够自动生成。这一特性有效解决了模板代码问题,提升了代码整洁度和可维护性。原创 2025-01-04 11:21:41 · 270 阅读 · 0 评论 -
Java JDK 17新特性:NullPointerException增强
这一功能非常强大且实用,相信每位Java开发者都期待已久。空指针异常(NPE)一直是Java程序员的痛点,因为报错信息无法直观地指出哪个对象为空,只抛出一个NullPointerException和一堆堆栈信息,定位问题耗时且麻烦。尤其在遇到喜欢级联调用的代码时,逐行排查更是令人头疼。如果在测试环境中,可能还需通过远程调试查明空对象,费时费力。为此,阿里的编码规范甚至不允许级联调用,但这并不能彻底解决问题。Java17终于在这方面取得了突破,提供了更详细的空指针异常信息,帮助开发者迅速定位问题源头。原创 2025-01-04 11:10:03 · 229 阅读 · 0 评论 -
Java JDK 17新特性:文本块
在没有这个特性之前,编写长文本非常痛苦。虽然IDEA等集成开发工具可以自动处理,但最终效果仍然丑陋,充满拼接符号。现在,通过字符串块,我们可以轻松编写JSON、HTML、SQL等内容,效果更清爽。这个新特性值得五颗星评价,因为它让我们只需关注字符串本身,而无需关心拼接操作。原创 2025-01-04 11:06:46 · 286 阅读 · 0 评论 -
Java CyclicBarrier错误使用示例分析
为了实现交替打印的效果,可以调整线程的执行顺序。具体来说,可以让字母线程先等待,然后打印字母;而数字线程先等待,然后打印数字。这样可以确保两个线程交替执行。具体原因是在字母线程中先打印字母再等待,而在数字线程中先等待再打印数字,这会导致字母线程先打印两个字母后,数字线程才开始打印。当前代码的逻辑是两个线程交替打印字母和数字,但是由于。的使用不当,导致输出结果为。主线程等待两个子线程。原创 2024-12-10 17:46:38 · 1043 阅读 · 0 评论 -
Java代码示例:使用Semaphore、CountDownLatch和CyclicBarrier来实现两个线程交替打印字符和数字(两个线程交替打印a1b2c3d4)
下面我将分别展示如何使用Semaphore和来实现两个线程交替打印字符和数字。每种工具都有其特点,适用于不同的场景。原创 2024-12-10 17:44:52 · 321 阅读 · 0 评论 -
Java代码示例:使用wait()和notify()来实现两个线程交替打印字符和数字(两个线程交替打印a1b2c3d4)
来实现两个线程交替打印字符和数字,可以通过共享对象的监视器锁(内置锁)来协调这两个线程。下面是一个基于Java的简单示例代码,展示了如何使用。布尔变量来控制哪一个线程应该继续执行。每个线程在进入它的关键区之前都会获取这个锁,并在结束时释放它。当一个线程完成它的任务后,它会改变。这是因为这些方法依赖于对象的内部锁(也称为监视器锁),以确保线程安全。通知所有等待在同一个锁上的线程,这样另一个线程就可以从。都必须在同步上下文中被调用,即在。在这个例子中,我们使用了。方法中唤醒并继续执行。作为同步锁,并且通过。原创 2024-12-10 17:32:36 · 216 阅读 · 0 评论 -
Java代码示例:使用ReentrantLock与Condition来确保两个线程可以交替打印字符和数字(两个线程交替打印a1b2c3d4)
标志并通知其他等待的线程,这样另一个线程就可以开始打印了。两个线程都启动后,它们将按顺序交替打印出’a1b2c3d4’。在这个例子中,我们定义了两个线程:一个用于打印字母,另一个用于打印数字。来保证两个线程之间的正确同步。当一个线程完成打印后,它会改变。等来实现线程间的通信。对于这个问题,我们可以使用。来确保两个线程可以交替打印字符和数字。标志来决定当前应该打印什么,并且使用。方法或者更现代的同步工具如。在Java中,你可以使用。原创 2024-12-10 17:27:36 · 460 阅读 · 0 评论 -
ABA 问题
ABA 问题是在并发编程中出现的一种问题,通常与使用原子操作和乐观锁相关。它发生在一个线程检查某个值为A,并在之后准备使用这个值。然而,在这个过程中,另一个线程将值从A改为B,然后又改回A。第一个线程无法察觉这个变化,因为它看到的值仍然是A,但数据实际上已经被修改过。原创 2024-11-18 22:05:30 · 227 阅读 · 0 评论 -
Java代码示例:ABA 问题及其解决代码案例
来同时管理节点和版本号,确保即使值相同,版本号的变化也能被检测到。在这个解决方案中,我们使用。原创 2024-11-18 22:04:37 · 215 阅读 · 0 评论 -
开源Meteor工具:基于阿里开源的Arthas的java应用诊断工具
流星划过,照亮天空,整个世界一片光明,虫子无处可藏。原创 2024-10-31 14:55:14 · 718 阅读 · 0 评论 -
Maven pom.xml scope属性详解
在 Maven 中,scope属性用于定义依赖关系在不同生命周期阶段的行为。scope会影响依赖关系在构建过程中的哪些阶段会被下载和使用,以及是否会传递到依赖于当前项目的其他项目中。理解scope的设置对于优化构建过程和管理依赖关系非常重要。scope。原创 2024-10-30 17:09:46 · 584 阅读 · 0 评论 -
Java类的序列化版本唯一标识符serialVersionUID详解
是一个long类型的值,可以是任何long值。通常情况下,IDE 会自动生成一个默认的,但你也可以手动指定一个值。原创 2024-10-29 14:34:50 · 439 阅读 · 0 评论 -
Java CountDownLatch入门极简代码示例
【代码】Java CountDownLatch入门极简代码示例。原创 2024-09-09 13:43:37 · 169 阅读 · 0 评论 -
Java Thread.activeCount() 使用示例:该方法返回的是当前JVM中活跃线程数量的近似值
是 Java 中Thread类的一个静态方法,它用于返回当前线程组及其子组中活跃的线程估计数。这个方法返回的是一个近似值,因为线程的创建和终止是动态的,所以在调用时,线程的数量可能已经发生了变化。原创 2024-09-09 11:14:19 · 503 阅读 · 0 评论 -
Java Thread.yield() 详解及代码示例:提示当前线程让出CPU时间片
是 Java 中的一个方法,用于提示线程调度器当前线程愿意放弃当前的 CPU 使用权,允许相同优先级的其他线程获得执行的机会。这个方法是静态的,属于Thread类。原创 2024-09-09 11:05:43 · 767 阅读 · 0 评论 -
Java CountDownLatch 代码示例:比 Thread.activeCount() 和 Thread.yield() 更好的线程协调机制
这段代码是一个在 Java 程序中用于等待除了当前主线程之外的其他线程完成执行的常见模式。这里的方法返回当前线程组及其子组中活跃的线程数量,而方法是当前线程主动让出 CPU 使用权,允许相同优先级的其他线程运行。原创 2024-09-09 11:02:22 · 400 阅读 · 0 评论 -
Java ConcurrentHashMap锁分段机制详解及代码示例
Java 5.0 在包中提供了多种并发容器类来改进同步容器的性能。ConcurrentHashMap 同步容器类是Java 5 增加的一个线程安全的哈希表。对与多线程的操作,介于 HashMap 与 Hashtable 之间。内部采用“锁分段”机制替代 Hashtable 的独占锁。进而提高性能。原创 2024-09-09 10:59:58 · 1347 阅读 · 0 评论 -
Java中,主线程结束了,子线程是否可以正常运行?
如果子线程被设置为守护线程,那么当主线程结束时,如果 JVM 中,还有其他的用户线程,JVM 将等待这些用户线程结束,在这个过程中,守护线程将继续执行,直到所有用户线程结束,守护线程也会自动结束,JVM 也会退出。如果子线程是用户线程(User Thread)(即没有被设置为守护线程),用户线程则不依赖创建它的线程,那么当主线程结束时,子线程会继续运行,直到它们自然结束或被显式终止。如果子线程都是守护线程,那么当主线程结束时,没有其它的用户线程,守护线程也会自动结束,JVM 也会退出。原创 2024-08-16 14:01:47 · 746 阅读 · 0 评论 -
java调用python代码的两种方式:Runtime.exec()和Jython
要在 Java 中调用 Python 代码,你可以使用几种不同的方法。这里我将介绍两种常见的方法:使用和使用第三方库如Jython。原创 2024-08-13 17:29:28 · 1215 阅读 · 0 评论 -
Java JVM基础:一篇文章彻底搞懂GC(JVM运行时数据区、GC回收算法、垃圾回收器)
Java相较于其他编程语言更加容易学习,这其中很大一部分原因要归功于JVM的自动内存管理机制。对于从事C语言的开发者来说,他们拥有每一个对象的「所有权」,更大的权力也意味着更多的职责,C开发者需要维护每一个对象「从生到死」的过程,当对象废弃不用时必须手动释放其内存,否则就会发生内存泄漏。而对于Java开发者来说,JVM的自动内存管理机制解决了这个让人头疼的问题,不容易出现内存泄漏和内存溢出的问题了,GC让开发者更加专注于程序本身,而不用去关心内存何时分配、何时回收、以及如何回收。原创 2024-08-12 16:59:53 · 2255 阅读 · 0 评论