
Java 中的 LinkedList
LinkedList 在开发中并不常用,在大多数场景下,我们会采用 ArrayList。本篇将从多个维度解读 LinkedList 与 ArrayList 存在的差异。 底层结构 LinkedList 与 ArrayList 底层结构不同:...
LinkedList 在开发中并不常用,在大多数场景下,我们会采用 ArrayList。本篇将从多个维度解读 LinkedList 与 ArrayList 存在的差异。 底层结构 LinkedList 与 ArrayList 底层结构不同:...
在 Java 中,Set 和 List 可以循环遍历,因为其拥有可迭代能力,主要还是 Iterator 的功劳。 初识 首先看一下二者如何定义: fail-fast 一旦发现遍历的同时有其他人修改,则立即抛出异常 fail-safe 当发现...
Java 中,ArrayList 是 List 最经典的实现,由于 ArrayList 底层是数组,掌握其扩容机制十分必要。 下面的讨论,基于 JAVA8,不同的JDK版本,某些规则会有差异。 构造器容量 我们一般在一定一个 ArrayLi...
二分查找是一种高效的查找方法。其主要思路是:对已经排序的数据,每次取二分之一处的元素与目标元素比较,如果相等就返回目标位置,否则继续下一轮查找。 二分思想 二分查找文字描述: 排好序的数组 arr 定义左边界 left、右边界 right,...
快速排序思想 每一轮遍历选择一个基准点(pivot)进行分区。 小于基准点的元素进入一个分区,大于基准点的元素进入另一个分区。 当分区完成时,基准点的位置就是排序后该元素应该处于的位置。 在每个子分区中重复以上过程,直到分区中元素少于等于 ...
插入排序思想 将数组分为两个部分,排序部分和未排序部分。 每一轮遍历从未排序部分取出第一个元素,插入到排序部分的对应位置。 重复以上过程,直到整个数组有序。 代码实现 为了能更好地展示冒泡排序的主要思想,我将数据准备工作定义在 main()...
选择排序是一种经典的排序算法。 选择排序思想 将数组分为两个子集,前一个子集是排序的,后一个子集是未排序的。 每一轮遍历从未排序的子集中选择最小的元素放入排序子集的末端。 重复以上过程,直到整个数组有序。 经典实现 为了能更好地展示冒泡排序...
冒泡排序是最经典的排序算法之一,其主要思路是两两比较相邻位置的元素,并交换其位置,直到结束。 排序存在两种场景:升序和降序,这里仅讨论升序的情况。 冒泡思想 冒泡排序文字描述: 依次比较数组中响铃两个元素的大小,若前一个大于后一个,则交换两...
Java 中有多种常量池,常量池可以实现数据共享,节省内存开销,避免频繁创建对象与销毁对象等诸多好处。 常量池分类 一般,Java 中的常量池被分为以下几类: class 字节码常量池:保存字面量(就是一些字符串和被final修饰的变量)和...
垃圾收集器 (GC)负责 Java 中的内存管理。因此,程序员不需要显式地处理内存分配和释放。 在 Java 中,JVM 一开始就预留了一定的内存。有时,实际使用的内存明显少于保留量。在这种情况下,我们更愿意将多余的内存返回给操作系统。 这...