Thread源码解读
线程的关键属性12345678910111213141516171819202122232425262728293031323334// 线程名称private volatile String name;// 声明线程的优先级,具有较高优先级的线程优先于具有较低优先级的线程执行。但是,线程优先级的设定并不是强制性的,也就是说,具有较低优先级的线程并不总是等待具有较高优先级的线程执行完毕后才执行。具体取决与操作系统。private int priority;// 声明线程是否时守护线程, 在Java中,线程分为用户线程和守护线程两种。用户线程是指用户通过代码创建的普通线程,而守护线程则是一种特殊的线程,主要用于在后台提供通用服务,如垃圾回收线程。private boolean daemon = false;// 声明线程是否被中断private volatile boolean interrupted;// 用于控制和管理线程的生命周期。为true,表示线程在启动之前就已经结束了;如果值为false,那么表示线程在启动之后仍然在运行。private boolean stillborn = ...
JAVA源码解读之LinkedHashMap
简介
可以看到它继承自HashMap,并实现了Map接口。LinkedHashMap与HashMap的主要区别在于,LinkedHashMap维护了一个运行于所有条目的双向链表。这个链表定义了迭代顺序,通常就是插入顺序,或者是访问顺序。 LinkedHashMap的构造函数接受一个名为accessOrder的布尔值参数,用于指定迭代顺序。如果accessOrder为false,则使用插入顺序;如果为true,则使用访问顺序。在访问顺序模式下,调用get和put方法会将相应的条目移动到双向链表的末尾。这种特性使得LinkedHashMap非常适合用来构建LRU(最近最少使用)缓存。 LinkedHashMap还提供了一个名为removeEldestEntry()的方法,它可以被覆盖以移除最老的条目。这个方法默认返回false,即不移除最老的条目。如果需要根据某种策略移除最老的条目,可以创建LinkedHashMap的子类,并覆盖这个方法。 LinkedHashMap的性能通常略低于HashMap,因为维护链表需要额外的资源。然而,LinkedHashMap的迭代性能更高,因为迭代时 ...
JAVA源码解读之HashMap
简介
整体流程如何初始化的呢?首先先过一下HashMap的大体流程。就从方法的初始化开始吧。我们有四种方式去构造HashMap,这几种方式基本是负载因子和初始容量的组合,一般我们都是构造一个默认容量和默认负载因子的HashMap;如果我们用指定初始容量的方式构造HashMap,那么程序会做一次计算上的转换,将入参容量转换为与入参最近的2的幂等数,比如指定了初始容量为17,那么计算的结果是32。
如何放入元素的?初始好后就可以往里面添加元素了。HashMap的底层是用一个Node类型的数组存放数据的,那么这个数据放在哪个地方呢?所以会有一个关键的寻址算法去确定这个事情。如果是第一次添加数据,那么还要先出发一个扩容操作,然后才能添加数据。在添加数据时可以分为以下几个情况:
找到了一个位置且这个位置没有数据,直接将这个数据的Node放进去
找到了一个位置,但这个位置有数据,具体又分为一下几个情况
新值与旧值的key和value值相等,不新增数据直接返回
找到了一个位置,但这个位置上是一棵树,将元素放入的树种
找到了一个位置,但这个位置上是一个链表,就遍历这个链表,如果遍历到了和要添加数据的 ...
JAVA源码解读之LinkedList
简介LinkedList是一个双端队列,它对内部元素的新增或删除操作,时间复杂度为O(1),但是访问时时间复杂度为O(N),内部的写操作是否高效,所以如果你需要做一些频繁写但是又少量查询到操作,那么就到了LinkedList的发挥时间。
重点属性1234567891011121314151617181920212223transient int size = 0;/** * Pointer to first node. */transient Node<E> first;/** * Pointer to last node. */transient Node<E> last;// Node的数据结构private static class Node<E> { E item; Node<E> next; Node<E> prev; Node(Node<E> prev, E element, Node<E> next) { this.item = ...
JAVA源码解释之ArrayList
简介由于ArrayList类插入有序以及高性能的元素访问特性,使得它成为了我们最常用的一个集合类,我们先看下它的类图。可以看到它实现了以下几个接口
List接口,意味着它是JAVA结合框架的一部分
RandomAccess接口,说明ArrayList支持快速的随机访问,它内部任意位置的元素访问都是O(1)复杂度
Cloneable接口,表示ArrayList是可以被克隆的
java.io.Serializable接口,说明ArrayList是可以被序列化和反序列化的
重点属性123456// 初始容量private static final int DEFAULT_CAPACITY = 10;// 用来存放数据的数组transient Object[] elementData;// 数组内数据到数量private int size;
构造函数12345678910111213141516171819202122232425262728293031// 第一种方式,创建一个空集合public ArrayList() { this.elementData = ...
JAVA源码解析之Object
简介众所周知, JAVA是作为一门面向对象的语言去设计的。所有的JAVA对象中都会有一些方法,比如hashCode(),wait()等等,这些方法都是因为JAVA中的对象有一个统一的祖先类:Object,而今天我们就要解读一下这个祖先类。
常用方法getClass()简介首先看下这个方法的源码:
12@IntrinsicCandidatepublic final native Class<?> getClass();
这个方法主要用来获取运行时对象的类信息,返回值为一个Class类型的对象,通过这个对象我们可以获取到与该类相关的各种元数据,比如类名、报名、方法以及属性等等,这使得它在反射编程中非常有用。
用例123456789public static void main(String[] args) { Animal animal1 = new Monkey(); Monkey animal2 = new Monkey(); Animal animal3 = new Pig(); System.out.pr ...