有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步, 认准 https://blog.zysicyj.top
1. 什么是 ArrayBlockingQueue 和 LinkedBlockingQueue?
ArrayBlockingQueue:是一个基于数组实现的有界阻塞队列,它按照先进先出(FIFO)的原则对元素进行排序。
LinkedBlockingQueue:是一个基于链表实现的可选有界或无界阻塞队列,它也按照先进先出(FIFO)的原则对元素进行排序。
2. 为什么需要 ArrayBlockingQueue 和 LinkedBlockingQueue? 在多线程编程中,我们经常需要使用队列来实现线程间的数据共享。而阻塞队列是一种特殊的队列,当队列为空时,从队列中获取元素的操作会被阻塞;当队列满时,往队列中添加元素的操作会被阻塞。这样可以有效地控制线程之间的协作和同步。
ArrayBlockingQueue 和 LinkedBlockingQueue 都是 Java 并发包提供的线程安全的阻塞队列实现,它们提供了不同的特性和适用场景。
3. Array ...
有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步, 认准 https://blog.zysicyj.top
1. 什么是 ArrayList 和 Array(数组)?ArrayList 是 Java 中的一个类,它实现了 List 接口,并且可以动态地调整大小。它内部使用数组来存储元素,并提供了一系列方法来操作这些元素。
Array(数组) 是一种数据结构,用于存储相同类型的多个元素。它在内存中分配一块连续的空间来存储元素,通过索引访问每个元素。
2. 为什么需要 ArrayList 和 Array(数组)?
ArrayList:由于 ArrayList 可以动态调整大小,因此非常适合在运行时添加、删除或修改元素的情况下使用。它还提供了一组方便的方法来处理集合数据。
Array(数组):数组具有固定长度,适用于已知元素数量且不会改变的情况。它们在内存上的布局更加紧凑,对于直接访问元素而言速度更快。
3. ArrayList 和 Array(数组)的区别 大小调整
ArrayList:ArrayList 可以根据需要自动增长或缩小其容量。当元素数量超过当前容 ...
有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步, 认准 https://blog.zysicyj.top
1. 什么是 ArrayList 和 Vector?ArrayList和 Vector 都是 Java 中的集合类,用于存储和操作一组对象。它们都实现了 List 接口,并且底层使用数组来保存数据。
2. 为什么需要 ArrayList 和 Vector?在开发过程中,我们经常需要处理一组对象,例如存储用户列表、商品列表等。而数组的长度是固定的,无法动态扩展或缩小,因此不适合用来存储可变数量的对象。ArrayList 和 Vector 提供了动态数组的功能,可以根据需要自动调整大小。
3. ArrayList 和 Vector 的实现原理?ArrayList
ArrayList 内部使用一个 Object 类型的数组来保存元素。
当添加新元素时,如果当前数组已满,则会创建一个更大的数组,并将旧数组中的元素复制到新数组中。
当删除元素时,数组中的元素会向前移动填补被删除元素的位置。
ArrayList 支持随机访问,通过索引快速获取指定位置的元素。
Ve ...
有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步, 认准 https://blog.zysicyj.top
1. 什么是 Vector 和 Stack?Vector是 Java 中的一个动态数组,它实现了 List 接口,并且可以自动扩容。Vector 允许在任意位置插入、删除和访问元素。
Stack是 Vector 的子类,它实现了栈的数据结构。栈是一种后进先出(LIFO)的数据结构,只能在栈顶进行插入和删除操作。
2. 为什么需要 Vector 和 Stack?
Vector:由于 Vector 是动态数组,它可以根据需要自动调整大小,因此非常适合存储和操作可变数量的元素。
Stack:栈是一种常见的数据结构,在很多场景下都有用处。例如,当我们需要按照特定的顺序处理元素时,可以使用栈来保存中间结果。
3. Vector 和 Stack 的实现原理?Vector内部使用一个 Object 类型的数组来存储元素,当数组空间不足时,会创建一个更大的数组并将所有元素复制到新数组中。这个过程称为扩容。默认情况下,每次扩容会使数组的大小增加一倍。
Stack继承自 ...
有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步, 认准 https://blog.zysicyj.top
ArrayList 是 Java 中的一个动态数组,可以存储任意类型的对象。在 ArrayList 中是可以添加 null 值的。
下面是一个示例代码:
12345678910111213import java.util.ArrayList;public class Main { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add(null); list.add("Hello"); list.add(null); System.out.println(list); // 输出:[null, Hello, null] }}
...
有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步, 认准 https://blog.zysicyj.top
1. ArrayList 是什么?ArrayList 是 Java 中的一个动态数组,它实现了 List 接口。与普通数组相比,ArrayList 具有自动扩容和缩容的功能,可以根据需要动态调整大小。
2. 为什么需要 ArrayList?在开发过程中,我们经常需要处理一组数据,并且可能需要频繁地进行插入、删除操作。使用普通数组时,由于其长度固定,当需要插入或删除元素时,就需要手动移动其他元素来保持连续性,这样会导致效率低下。而ArrayList 提供了方便的方法来处理这些操作,使得代码更加简洁高效。
3. ArrayList 插入和删除元素的时间复杂度
在 ArrayList 的末尾插入元素:O(1)
在 ArrayList 的中间或开头插入元素:O(n)
删除指定位置的元素:O(n)
3.1 在 ArrayList 的末尾插入元素 当我们向 ArrayList 的末尾插入元素时,只需将新元素添加到内部数组的最后一个位置即可,不需要移动其他元素。因 ...
有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步, 认准 https://blog.zysicyj.top
LinkedList 是一种链表数据结构,它的插入和删除操作在某些情况下具有较好的性能。下面我将详细解释 LinkedList 插入和删除元素的时间复杂度。
1. 什么是 LinkedList?LinkedList 是一种双向链表数据结构,它由一个个节点组成,每个节点包含了存储的元素以及指向前一个节点和后一个节点的引用。相比于数组,LinkedList的特点是可以动态地添加、删除元素,并且不需要连续的内存空间。
2. 为什么需要 LinkedList?LinkedList 在某些场景下具有优势:
需要频繁进行插入和删除操作:由于 LinkedList 的节点之间通过引用连接,插入和删除操作只需要修改节点的引用,而不需要移动其他元素。
不需要随机访问元素:LinkedList 没有像数组那样的索引,所以如果需要根据索引快速访问元素,则使用数组更合适。
3. LinkedList 插入和删除元素的时间复杂度
插入元素:在 LinkedList 中插入元素 ...
有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步, 认准 https://blog.zysicyj.top
LinkedList 是一种基于链表的数据结构,它的内部实现是通过链表节点的引用来连接元素。由于链表的特性,它的访问时间复杂度是 O(n),而不是像数组一样可以通过索引直接访问元素,时间复杂度为 O(1)。RandomAccess 接口是一个标记接口,用于表示实现了该接口的集合类可以通过随机访问元素的方式来提高访问效率。由于 LinkedList 的访问方式不支持随机访问,因此它不能实现 RandomAccess 接口。如果需要快速随机访问元素,应该使用基于数组的数据结构,例如 ArrayList。
if (typeof lightGallery !== 'undefined') {
var options = {selector: '.gallery-item'};
lightGallery(document.getElementsByClassName('.article-gallery')[0], options) ...
有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步, 认准 https://blog.zysicyj.top
1. 什么是 Unsafe?Unsafe 是 Java 中的一个类,它提供了一些底层操作的方法,可以绕过 Java 的安全检查机制直接操作内存和对象。它是在 sun.misc包下的一个非常特殊的类,主要用于支持 JDK 内部的实现。
2. 为什么需要 Unsafe?Java 是一门相对安全的语言,它提供了很多安全机制来保护开发者免受潜在的危险。然而,在某些情况下,我们可能需要绕过这些安全机制,直接进行一些底层的操作,比如修改对象的字段值、创建实例等。这时就可以使用Unsafe 类来完成这些操作。
Unsafe 类的存在主要是为了支持 JDK 内部的实现,比如 CAS(Compare and Swap)操作、原子性操作等。同时,它也被广泛应用于一些高性能框架和库中,比如Netty、Hadoop 等。
3. Unsafe 的实现原理?Unsafe 类通过本地方法来实现其功能,它调用了 JVM 提供的底层函数来完成一些不安全的操作。由于 Unsafe 类的方法 ...
有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步, 认准 https://blog.zysicyj.top
| 特性 | JDK 9+ 类加载器 | JDK 8 及以前的类加载器 |
|
|
—|
—–|| 模块系统 | 引入了模块系统(Java Platform Module System)| 没有模块系统 || 命名空间隔离 | 使用模块系统实现了命名空间隔离,不同模块的类无法直接互相访问 | 没有明确的命名空间隔离,所有类都在同一个全局命名空间中 || 直接字节码处理 | 引入了 JEP 238 (Multi-Release JAR Files) 以及 JEP 261 (Module System) | 不支持直接字节码处理 || 默认类加载器变更 | 采用了平台类加载器进行默认加载,将 Bootstrap 类加载器委派给平台类加载器 | 使用扩展类加载器和应用程序类加载器作为默认加载器 || 全量类加载器执行顺序变更 | 利用模块系统与类加载器实现了双亲委派的全量类加载器执行顺序变更 | 按照双亲委派模型执行全量类加载器 || 拓展类加载器 ...