Java
文章平均质量分 90
JAVA八股文系列
沉梦听雨.
大家好,我是沉梦听雨。一个专注于分享Java知识以及日常工作点点滴滴的程序员。我的目标是通过分享我的经验和知识,帮助更多的人理解和掌握Java编程。如果你从我的内容中获得了帮助,还请为我点个免费的赞。这对我来说意义重大,也是我持续更新内容的动力。GitHub Pages:https://cmty256.github.io/
展开
-
JVM基础入门
所谓的 JVM 虚拟机,其实它本身是一个规范,是虚构出来的一台计算机。拥有自己的操作系统,是一个跨语言平台。为什么 JVM 虚拟机能够支持多种语言运行在上面呢?最关键的原因是就是因为 class 这个东西,我们可以说任何的语言,只要你能编译成 class,符合 class 文件的规范,你就可以扔在 Java 虚拟机上去执行。注意:JVM 只和 class 文件有关,与 java 无关。Java虚拟机 - 维基百科,自由的百科全书 (wikipedia.org)Java 软件 | Oracle 中国。原创 2023-12-17 14:17:52 · 190 阅读 · 0 评论 -
【并发篇】Java内存管理知识小结
Java 内存管理栈内存(Stack Memory)栈是线程私有的,每个线程都有自己的栈。用于存储局部变量、方法参数、返回地址以及一些基本数据类型。具有快速的分配和释放,因为采用"后进先出"(LIFO)的数据结构。栈内存的大小是有限的,一般由虚拟机预先定义。堆内存(Heap Memory):用于存储对象实例和数组等动态分配的对象。Java 中的垃圾回收(Garbage Collection)发生在堆内存,回收不再使用的对象。可以通过设置参数调整堆的大小,如 -Xmx(最大堆大小)和原创 2023-12-15 12:23:22 · 95 阅读 · 0 评论 -
【并发篇】深入理解Java线程池的运作原理
线程池就是管理一系列线程的资源池。当有任务要处理时,直接从线程池中获取线程来处理,处理完之后线程并不会立即被销毁,而是等待下一个任务。在 Java 5 之后,通过Executor来启动线程比使用Thread的start方法更好,除了更易管理,效率更好(用线程池实现,节约开销)外,还有关键的一点:有助于避免 this 逃逸问题。这是因为线程池的执行过程会等待构造完成后再进行任务的执行,从而避免了 this 逃逸问题的发生。什么是 this 逃逸问题?原创 2023-12-15 12:20:01 · 230 阅读 · 0 评论 -
【并发篇】Java关键字指南:Synchronized和Volatile的使用与区别
volatile 关键字是 Java 中用于保证变量可见性和禁止指令重排序优化的一种机制。只能保证单个变量的原子性,不能保证复合操作的原子性。原创 2023-12-14 10:03:27 · 159 阅读 · 0 评论 -
【并发篇】深入理解线程死锁、乐观锁与悲观锁
线程死锁是指:两个或多个线程互相持有对方所需要的资源而互相等待的状态,导致程序无法继续执行下去,进而陷入死循环,无法完成任务。乐观锁总是假设最好的情况,认为共享资源每次被访问的时候不会出现问题,线程可以不停地执行,无需加锁也无需等待,只是在提交修改的时候去验证对应的资源是否被其它线程修改了。优点不会造成线程阻塞缺点在并发更新的情况下,可能会出现 ABA 问题,需要使用版本号或时间戳等机制来解决。ABA 问题是: 在使用 CAS 算法时可能出现的一个问题。原创 2023-12-14 09:58:38 · 108 阅读 · 0 评论 -
【并发篇】Java并发基础小结
线程是一个比进程更小的执行单位,是 CPU 调度的基本单位。一个进程在其执行的过程中可以产生多个线程。所以在进行线程切换时的开销会远远小于进程,线程也常常被称为轻量级进程。与进程不同的是同类的多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器虚拟机栈和本地方法栈。CPU 从一个线程中断执行转而执行另一个线程的过程。在多线程编程中,线程上下文切换是非常常见的操作。这个过程需要耗费一定的时间和资源,因此线程上下文切换的频繁发生会导致系统的性能下降。1、什么是上下文。原创 2023-12-13 09:42:19 · 601 阅读 · 0 评论 -
【基础篇】Java基础小结
Java 虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。字节码和不同系统的 JVM 实现是 Java 语言 “一次编译,随处可以运行” 的关键所在。JVM 并不是只有一种!只要遵守JVM设计规范就能开发出自己所需要的Java虚拟机,我们日常所用的HotSpot VM只是其中一种实现而已。JDK(Java Development Kit) 是Java开发工具包,包含了JRE。原创 2023-11-27 18:22:23 · 213 阅读 · 0 评论 -
【基础篇】Java基本数据类型
在 Java 中,除了基本数据类型和void类型以外,其它所有类型都是引用类型。void类型是一种特殊的类型,它表示没有返回值的方法或表达式的类型。在 Java 中,void类型不属于基本数据类型,也不属于引用类型,而是一种独立的类型。类类型(Class):代表类的类型。接口类型(Interface):代表接口的类型。数组类型(Array):代表数组的类型。枚举类型(Enum):代表枚举的类型。泛型类型(Generics):代表泛型类或泛型方法的类型。原创 2023-11-28 15:25:18 · 205 阅读 · 0 评论 -
【基础篇】面向对象基础小结
【深拷贝】会完全复制整个对象,会在堆上新创建一个地址(原对象的内部对象Address而【浅拷贝】只会在堆上新创建一个对象,但是内部地址还是原对象的,与原对象共用一个Address对象。【引用拷贝】不会创建一个新的对象,而只是单纯的引用堆里面的原对象。【深拷贝】会完全复制整个对象,会在堆上新创建一个地址(原对象的内部对象Address而【浅拷贝】只会在堆上新创建一个对象,但是内部地址还是原对象的,与原对象共用一个Address对象。【引用拷贝】不会创建一个新的对象,而只是单纯的引用堆里面的原对象。原创 2023-11-28 15:29:23 · 131 阅读 · 0 评论 -
【基础篇】Java常见类详解
保存字符串的数组被final修饰且为私有,并且String类没有提供修改这个字符串的方法。String类被final修饰导致其不能被继承,进而避免了子类破坏String的可能性。除此之外,String 对象的不可变是由于对 String 类型的所有改变内部存储结构的操作都会 new 出一个新的 String 对象。原创 2023-11-29 16:01:53 · 177 阅读 · 0 评论 -
【基础篇】Java异常详解
是 Java 7 引入的一个新特性,用于自动关闭实现了或者接口的资源。它可以替代传统的语句,使代码更加简洁和可读。使用语句时,需要在try关键字后面的圆括号中声明资源在这个例子中,实现了接口,因此可以在try语句中声明并自动关闭。在try语句执行完毕后,会自动关闭,无需手动调用其close()方法。如果同时声明多个资源,可以使用分号;// 读取并写入数据在try语句执行完毕后,会自动关闭和。任何实现或者的对象。在语句中,任何 catch 或 finally 块在声明的资源关闭后运行。原创 2023-11-29 16:03:15 · 351 阅读 · 0 评论 -
【基础篇】Java泛型核心知识总结
Java 泛型(Generics)是 JDK 5 中引入的一个新特性,它提供了一种类型安全的编程机制,可以在编译时检查类型错误,避免了在运行时出现类型转换异常的情况。它可以使程序员在编写代码时指定类型参数,从而使得代码更加灵活和可重用。比如这行代码就指明了该ArrayList对象只能传入Persion对象,如果传入其他类型的对象就会报错。类型参数T是一种占位符类型,用于表示实际的类型。一般在哪定义?Java 泛型可以用于类、接口和方法的定义中。三种使用方式:泛型类、泛型接口、泛型方法。原创 2023-11-30 16:56:59 · 466 阅读 · 0 评论 -
【基础篇】Java反射详解
反射(reflection)是 Java 中的一种机制,能够在程序运行时动态地获取类的信息并操作类或对象的属性、方法和构造器等。通过反射,可以在运行时获取类的信息,而不需要在编译时确定。:用于表示类的实体,可以获取类的构造器、方法和字段等信息。:用于表示类的构造器,可以获取构造器的参数类型、修饰符等信息。:用于表示类的方法,可以获取方法的参数类型、返回值类型、修饰符等信息。通过这些类和相应的方法,可以在程序运行时获取类的信息,并进行动态的操作。例如,可以通过反射获取类的构造器,然后创建类的实例;原创 2023-12-01 14:46:08 · 147 阅读 · 0 评论 -
【基础篇】Java SPI机制详解
SPI(Service Provider Interface)是一种**服务提供接口**,它是 Java 提供的一种扩展机制,可以让第三方服务提供商来扩展框架或应用程序的功能。字面意思就是:“服务提供者的接口”,我的理解是:专门提供给服务提供者或者扩展框架功能的开发者去使用的一个接口。原创 2023-12-01 14:47:52 · 132 阅读 · 0 评论 -
【基础篇】聊聊什么是IO流
*在该模型下,所有的 I/O 操作都是非阻塞的,即当一个线程在进行 I/O 操作时,它会立即返回一个特定的状态(通常是非阻塞状态,如EAGAIN或EWOULDBLOCK),表示当前没有可用的数据,而不会等待数据准备就绪。(只会发起一次 read 调用,但会阻塞)NIO(New I/O)是 Java NIO(New Input/Output)API 的简称,是 Java SE 1.4 中引入的一组新的 I/O API,用于替代 Java 标准 I/O API(java.io 包)中的一部分功能。原创 2023-12-02 10:30:34 · 151 阅读 · 0 评论 -
【集合篇】Java集合概述
- 容器是一个广泛的概念,用于表示可以容纳和管理其他对象的对象。- 集合是容器的一种特定类型,用于存储和操作一组对象。原创 2023-12-02 10:33:43 · 223 阅读 · 0 评论 -
【集合篇】List接口
迭代器是一种 Java 中的接口,用于遍历集合类(Collection)和映射类(Map)中的元素。使用迭代器可以依次访问集合中的每个元素,而不需要知道集合的内部实现方式。在迭代器设计模式中,迭代器提供了一个通用的访问方法,使得可以在不暴露集合内部实现的情况下对集合进行迭代遍历。hasNext():判断集合中是否还有下一个元素,如果有返回 true,否则返回 false。next():获取集合中的下一个元素。remove():从集合中删除上一次返回的元素。需要注意的是,原创 2023-12-05 09:54:11 · 105 阅读 · 0 评论 -
【集合篇】Set集合详解,附源码解析
compare()equals()compare()equals()综上所述,Comparable 和 Comparator 都是的接口,但是它们之间的区别主要在于实现方式、应用场景和使用方式等方面。需要根据实际情况选择合适的接口来进行对象的比较。原创 2023-12-06 11:16:33 · 127 阅读 · 0 评论 -
【集合篇】Queue集合详解
Queue是,只能从一端插入元素,另一端删除元素,实现上一般遵循规则。Queue扩展了Collection的接口,根据可以分为两类方法: 一种在操作失败后会抛出异常,另一种则会返回特殊值。QueueDeque是,在队列的两端均可以插入或删除元素。Deque扩展了QueueDeque事实上,Deque还提供有push()和pop()等其他方法,可用于模拟栈。原创 2023-12-06 11:17:39 · 92 阅读 · 0 评论 -
【集合篇】Map 集合详解
这是因为 HashMap 在计算 key 的哈希值后,需要通过哈希值和数组长度计算出该 key 在数组中的位置。具体的计算方式是(数组的长度减一的差和 key 的哈希值相与),其中n是数组的长度,hash是 key 的哈希值。这个计算方式的作用是将哈希值的高位和低位进行一次异或运算,得到 key 在数组中的位置。如果数组的长度不是 2 的幂次方,那么在计算时,得到的结果可能会存在一些哈希值无法均匀分布到数组中的位置的情况,从而导致某些位置上的链表或红黑树会变得过长,影响 HashMap 的性能。原创 2023-12-07 09:46:34 · 131 阅读 · 0 评论 -
Java 8 新特性深度解析:探索 Lambda 表达式、Stream API 和函数式编程的革新之路
速度更快代码更少(简洁,增加了新的语法Lambda 表达式强大的Stream API便于并行可以最大化减少空指针异常Optional– 因为这个类的方法为什么便于运行?Stream API可以让我们轻松地对集合进行并行处理。Lambda表达式可以让我们以一种简洁的方式定义匿名函数,这种方式可以使代码更加简洁。方式引用已经存在的方法或构造函数,可以避免我们重复编写相似的代码。原创 2023-12-09 15:29:09 · 158 阅读 · 0 评论 -
Java 新特性探索:从 JDK9 到 JDK17 的关键改进与示例代码
快速了解 Java 新特性探索:从 JDK9 到 JDK17 的关键改进与示例代码原创 2023-12-07 09:49:03 · 150 阅读 · 0 评论