自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(90)
  • 收藏
  • 关注

原创 一文搞懂Spring执行流程

要想搞清楚Spring的执行逻辑我们必须明白在Spring的IOC容器中执行的12步都在干什么。@Override //容器刷新的十二大步。模板模式public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { StartupStep contextRefresh = this.applicationStartup.start("sp

2022-04-06 11:11:10 2973

原创 一句话说明所有常见设计模式及其在源码中的体现

一、创建型模式1、单例模式保证一个对象,所有获取到该类型的对象都是一个。如 Spring 框架的单例模式。2、原型模式克隆出多个对象,获取该类型的对象通过克隆创建。如 Spring 框架的原型模式。3、工厂方法模式简单工厂模式:通过 if-else 来创建对象。工厂方法模式:通过特定方法来创建对象。如线程池可通过线程池工厂 Executors 的各种方法来创建各种类型的线程池。4、抽象工厂模式通过工厂模式创建工厂,通过创建出的工厂创建对象。5、建造者模式通过 XxxBuilder

2022-04-04 19:09:14 721

原创 1、并发编程的挑战

一、并发编程介绍并发编程的目的是为了让程序运行地更快或者创建线程调用阻塞方法时可以使调用者处于非阻塞状态。虽然并发编程给我们提供了一些好处,但是它也会产生我们单线程执行不会发生的问题:上下文切换死锁线程同步问题针对这些问题,我们需要理解并给出相应的解决方案。二、上下文切换问题1、问题的产生在批处理系统中不会出现上下文切换,因为任务的执行是一个一个顺序执行的,但是在如今的交互式系统中,CPU执行几十或十几毫秒后都会进行一次上下文切换,保存当前线程或进程的状态并根据CPU调度算法选择另一个线

2022-04-03 19:48:24 620

原创 排序算法集合

1、冒泡排序1、基本思想对于有n个数据的集合,我们对它遍历n次,在每次遍历中,如果第i个元素大于第i + 1个元素,我们就将这两个元素交换,以此类推,第一次遍历之后下标为n - 1的数(也就是最后一个数)就是最大的数,第k次遍历之后,从n - k 到 n - 1 的数就是最大的一组数。2、代码实现public void sort(int[] arrays) { int n = arrays.length; // 当n <= 1时,不需要排序 if (n <= 1) { retu

2021-11-29 20:04:30 327

原创 Arrays源码详解

此类包含用于操作数组的各种方法(例如排序和搜索)。 这个类还包含一个静态工厂,允许将数组视为列表。一、继承关系图一个工具类,没有继承关系二、Arrays类介绍private static final int MIN_ARRAY_SORT_GRAN = 1 << 13;最小并行排序数组,低于该长度将不会采用并行计算排序。static final class NaturalOrder implements Comparator<Object> { @Suppress

2021-11-28 10:46:32 365

原创 AtomicStampedReference源码详解

一、AtomicStampedReference原子类介绍1、问题的提出使用CAS方式会保证对原子类操作是线程安全的,它相较于传统的加锁来操作有一些优势,比如更加轻量级,速度更快;但是它同样也存在一些缺点,比如不能象同步代码块一样保证多个操作是线程安全的、当并发高时多个线程同时执行CAS不成功造成CPU利用率飙升,除了这些它还有一个比较致命的缺点:ABA问题,当两个线程都执行下面这段代码:public final boolean getAndSet(boolean newValue) { bo

2021-11-26 21:38:01 462

原创 AtomicReference源码详解

An object reference that may be updated atomically。一、继承关系图二、AtomicReference原子类介绍private static final Unsafe unsafe = Unsafe.getUnsafe();private static final long valueOffset;static { try { valueOffset = unsafe.objectFieldOffset

2021-11-26 21:03:27 118

原创 AtomicInteger源码详解

可以自动更新的int值,于诸如原子递增计数器之类的应用程序。一、继承关系图二、AtomicInteger原子类介绍1、与AtomicBoolean相似// Unsafe对象,因为这个类也是系统类加载器加载的,所以可以直接获取,否则要通过反射private static final Unsafe unsafe = Unsafe.getUnsafe();// value属性据对象地址的偏移量private static final long valueOffset;// volatile关

2021-11-26 20:34:55 202

原创 AtomicBoolean源码详解

可以自动更新的boolean值。且是原子操作。底层使用int代表boolean。一、继承关系图二、AtomicBoolean原子类介绍1、属性介绍// 创建一个Unsafe对象,这个类我之后会介绍,它与底层联系密切,可以直接操作内存private static final Unsafe unsafe = Unsafe.getUnsafe();// 存储value属性据对象地址的偏移量private static final long valueOffset;// 值属性,注意这里使用v

2021-11-26 20:19:16 313

原创 Stack源码详解

一、继承关系图二、Stack类介绍Stack是基于Vector来实现的,说明他是线程安全的。1、方法介绍public E push(E item) { addElement(item); return item;}入栈。public synchronized E pop() { E obj; int len = size(); obj = peek(); removeElementAt(len - 1); r

2021-11-26 14:11:07 109

原创 Vector源码详解

Vector类与ArrayList类有许多地方都相似,我这里只介绍与ArrayList不同的方面,其他详细见我ArrayList详解。一、继承关系图二、Vector类介绍protected int capacityIncrement;private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = o

2021-11-26 13:49:37 88

原创 TreeSet源码详解

一、继承关系图二、TreeSet类介绍1、属性// 维护着一个导航Mapprivate transient NavigableMap<E,Object> m;// 空对象,作为键值对的值private static final Object PRESENT = new Object();2、构造方法TreeSet(NavigableMap<E,Object> m) { this.m = m;}public TreeSet() { this(

2021-11-26 13:15:45 694

原创 TreeMap源码详解

一、继承关系图二、SortedMap接口介绍进一步提供其键的总排序的Map 。 映射根据其键的自然顺序进行排序,或者由通常在排序映射创建时提供的Comparator进行排序。1、方法介绍Comparator<? super K> comparator();返回一个比较器对象, 根据此比较器进行比较。SortedMap<K,V> subMap(K fromKey, K toKey);返回两个key之间的Map视图。SortedMap<K,V> head

2021-11-25 20:54:44 659

原创 LinkedHashSet源码详解

Set接口的哈希表和链表实现,具有可预测的迭代顺序。 此实现与HashSet 的不同之处在于它维护一个双向链表,贯穿其所有条目。一、继承关系图二、LinkedHashSet类介绍1、结构2、构造方法public LinkedHashSet(int initialCapacity, float loadFactor) { super(initialCapacity, loadFactor, true);}public LinkedHashSet(int initialCapacit

2021-11-24 14:42:11 321

原创 LinkedHashMap源码详解

Map接口的哈希表和链表实现,迭代顺序可预测。 此实现与HashMap 的不同之处在于它维护一个双向链表,贯穿其所有条目。一、结构图二、LinkedHashMap类介绍1、内部节点结构static class Entry<K,V> extends HashMap.Node<K,V> { Entry<K,V> before, after; Entry(int hash, K key, V value, Node<K,V> next) {

2021-11-24 14:25:50 649

原创 源码阅读复习整理

1、谈谈hashCode()方法第一,hashCode()方法是定义在Object类中的本地方法,子类如果不重写就会默认使用Object类中的hashCode()方法。在官方文档中规定了重写hashCode()方法或JVM虚拟机厂商实现hashCode()方法的规则:在程序的一次执行过程中,两次调用某一对象的hashCode()方法的返回值是相等的。两个通过调用equals()方法相等的对象,调用hashCode()方法返回值也相等。第二,在Object类中hashCode()方法底层是调用C+

2021-11-23 21:51:35 457

原创 Thread类源码详解

一、继承关系图二、Runnable接口介绍Runnable接口应该由其实例旨在由线程执行的任何类实现。 该类必须定义一个名为run的无参数方法。他是函数式接口。public abstract void run();当使用实现接口Runnable的对象创建线程时,启动线程会导致在单独执行的线程中调用对象的run方法。三、Thread类介绍是程序中执行的线程。1、属性介绍private static native void registerNatives();static { re

2021-11-23 19:12:32 928

原创 Float源码详解

一、继承关系图二、Float类介绍1、属性// 保存正无穷大的常量public static final float POSITIVE_INFINITY = 1.0f / 0.0f;// 保存负无穷大的常量public static final float NEGATIVE_INFINITY = -1.0f / 0.0f;// 保存非数字的常量public static final float NaN = 0.0f / 0.0f;// 最大正数public static fina

2021-11-22 20:25:07 457

原创 Long源码详解

Long类将原始类型long的值包装在一个对象中。一、继承关系图二、Long类介绍1、静态和非静态属性@Native public static final long MIN_VALUE = 0x8000000000000000L;@Native public static final long MAX_VALUE = 0x7fffffffffffffffL;public static final Class<Long> TYPE = (Class<Long>) C

2021-11-22 19:46:14 755

原创 从无限流和加权无限流中等概率取数据

从无限流中等概率取100个数据。一、方法一:分配随机数开辟一个存储100个数据的内存空间,当无限流中的一个数据a到来就为它分配一个随机数,若内存空间未满就存入,若空间已满但是数据a的随机数大于空间中随机数最小的数据,就把随机数最低的一个删除。依次类推,这样就保证到最后一个数据n为止,所有的数据被选中的概率都是100/n。二、方法二:蓄水池法开辟一个存储100个数据的内存空间,当无限流中第n个数据a到来时,若内存空间未满就存入,若空间已满就给a一个0-1随机数k,若k < 100/n 就随机从1

2021-11-21 20:27:33 201

原创 各种类的扩容

public Object[] toArray() { // Estimate size of array; be prepared to see more or fewer elements Object[] r = new Object[size()]; Iterator<E> it = iterator(); for (int i = 0; i < r.length; i++) { if (! it.hasNext()) // fewe

2021-11-21 18:49:39 462

原创 HashSet源码详解

一、继承关系图二、AbstractSet抽象类介绍1、结构图2、方法介绍public boolean equals(Object o) { if (o == this) return true; if (!(o instanceof Set)) return false; Collection<?> c = (Collection<?>) o; if (c.size() != size())

2021-11-21 16:16:10 802

原创 Integer源码详解

一、结构图二、Integer类介绍1、静态属性方法介绍@Native public static final int MIN_VALUE = 0x80000000;@Native public static final int MAX_VALUE = 0x7fffffff;public static final Class<Integer> TYPE = (Class<Integer>) Class.getPrimitiveClass("int");//

2021-11-21 15:38:44 1135

原创 Short源码详解

一、结构图二、Short类介绍Short类将基本类型short的值包装在一个对象中。1、结构2、静态属性方法介绍// short所能存储的最小值public static final short MIN_VALUE = -32768;// short所能存储的最大值public static final short MAX_VALUE = 32767;// 获取short类对象public static final Class<Short> TYPE =

2021-11-21 09:48:54 279

原创 Byte源码详解

一、结构图二、Number抽象类介绍。抽象类Number是平台类的超类,表示可转换为基本类型byte 、 double 、 float 、 int 、 long和short数值。 它更像是一种规范,规定了继承这个抽象类的子类可以互相转换。1、结构2、方法介绍// 将数据转换为int类型public abstract int intValue();// 将数据转换为long类型public abstract long longValue();// 将数据转换为float类型publ

2021-11-21 09:23:49 553

原创 Boolean源码详解

Boolean 类将原始类型boolean的值包装在一个对象中。包括在处理boolean时有用的其他常量和方法。一、结构图二、结构二、方法介绍1、静态变量public static final Boolean TRUE = new Boolean(true);/** * The {@code Boolean} object corresponding to the primitive * value {@code false}. */public static final Bool

2021-11-20 15:42:59 565

原创 HashMap和HashTable源码详解

一、结构二、HashMap类介绍HashMap是Map接口的基于哈希表的实现。此实现提供了所有可选的映射操作,并允许空值和空键。1、属性// 初始化容量默认是16static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16// 最大容量static final int MAXIMUM_CAPACITY = 1 << 30;// 默认的负载因子static final float DEFAULT_LO

2021-11-18 21:53:03 574

原创 AbstractMap源码详解

一、结构图二、Map接口将键映射到值的对象。 map不能包含重复的键; 每个键最多可以映射到一个值。1、方法介绍int size();返回map中键值对数量,超过Integer.MAX返回Integer.Max。boolean isEmpty();判断map是否为空(有无键值对)。boolean containsKey(Object key);判断map是否存在一个键k使得 (key==null ? k==null : key.equals(k))。boolean contain

2021-11-17 16:17:42 378

原创 LinkedList源码详解

一、结构图二、AbstractSequentialList抽象类介绍此类提供List接口的骨架实现,以最大限度地减少实现由“顺序访问”数据存储(例如链表)支持的此接口所需的工作。 对于随机访问数据(如数组),应优先使用AbstractList类。1、结构2、方法介绍public E set(int index, E element) { try { ListIterator<E> e = listIterator(index); E oldV

2021-11-16 17:42:14 808

原创 ArrayList源码详解

一、结构图二、ArrayList类介绍1、变量// 初始容积为10private static final int DEFAULT_CAPACITY = 10;// 维护一个空的数组共享实例private static final Object[] EMPTY_ELEMENTDATA = {};private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};// 缓冲数组,缓冲数组长度是ArrayList的容

2021-11-15 21:10:26 733 2

原创 AbstractList源码详解

一、结构图二、Iterable接口1、结构实现此接口的对象可以成为for-each语句的循环目标。2、方法介绍Iterator<T> iterator();返回一个迭代器对象,那么什么是迭代器呢?public interface Iterator<E> { boolean hasNext(); E next(); default void remove() { throw new UnsupportedOper

2021-11-15 10:17:55 515

原创 SringBuffer和StringBuilder源码详解

一、继承关系图CharSequence接口介绍过了,本次就不在介绍了二、Appendable接口结构图如下Appendable append(CharSequence csq) throws IOException;将指定的字符序列附加到此 Appendable。注意要保证线程安全要子类自行去实现。Appendable append(CharSequence csq, int start, int end) throws IOException;将指定字符序列从start开始,到en

2021-11-14 21:01:10 438

原创 Object源码详解

一、结构如下二、方法介绍private static native void registerNatives();static { registerNatives();}类首次加载时执行,虚拟机调用initializeSystemClass方法,即静态初始化程序,来初始化静态变量、调用静态方法等。native代表java程序调用非java代码的接口。registerNatives();这个方法将编译好的动态库加载到jvm中,简单来说就是给这些native本地方法提供实现。public

2021-11-14 18:11:01 957

原创 String源码详解

一、继承关系图二、CharSequence接口接口结构如下:简单方法介绍:length: 返回字符序列长度charAt:返回特定位置的字符subSequence:返回从start开始到end-1的子字符序列toString:返回和当前字符串序列顺序相同的字符串chars和codePoints方法是JDK8中出现的新特性Stream流API,我之后会在Stream流源码解析中去介绍它,现在只需要知道是返回一个字符int流和码点int流即可。三、Comparable<T>接

2021-11-12 21:56:57 1866

原创 线程池源码详解

我们介绍线程池以最关键的类ThreadPoolExecutor讲起。一、继承关系图二、ThreadPoolExecutor类介绍1、相关属性AtomicInteger ctl:原子整数,记录工人数量workerCount和线程池状态runStateBoolean terminate:表示线程池关闭瞬间的状态。当线程池执行stop或stopNow方法时,此时程序还没有完全终止,isTerminating()为true,否则为false;当线程关闭结束isTerminated()为true。in

2021-11-12 16:15:50 552

原创 多线程测试经典错误

问题描述今天练习多线程suspend方法想创造一个死锁,但是代码不会出现等待情况,直接就结束了代码如下: @Test public void test() { Thread thread1 = new Thread(() -> { synchronized (MyThread.class) { String name = Thread.currentThread().getName();

2021-11-11 21:33:31 575

原创 多线程之yield()方法

1. yield方法介绍官方介绍:A hint to the scheduler that the current thread is willing to yield its current use of a processor. The scheduler is free to ignore this hint.Yield is a heuristic attempt to improve relative progression between threads that would otherw

2021-11-11 19:51:31 856

原创 字符编码介绍

一、ASCII计算机的内部只认 二进制 0,1的状态,通常8个二进制代表一个字节,这是计算机最小的存储单位,一个字节可以有 2^8 = 256 个状态。 最开始,美国制定了一套具有128个状态的字符编码,这被称为ASCII码, 这128个字符还包括了大小写和一些键盘的控制符号,比如 空格 ASCII码为32 (00100000),这套ASCII 码基本适用了以英文为基础的国家计算机编码但是中国的汉字文化博大精深,ASCII码肯定满足不了,有出现了适用于中文的GBK系列编码二、GBK系列编码小于127

2021-09-19 19:40:17 78

原创 JavaSE-Java基本语法

章节练习题及面试题简答题标识符的命名规则需要注意哪几点?由26个英文字母大小写,0-9 ,_或 $ 组成数字不可以开头。不可以使用关键字和保留字,但能包含关键字和保留字。Java中严格区分大小写,长度无限制。标识符不能包含空格。基本数据类型有哪几类?包含String吗?基本数据类型数值型整数类型(byte1、short2、int4、long8)浮点类型(float4、double8)字符型(char2)布尔型(boolean编译之后用int定义,所以应该是4个字节)引用数据类

2021-09-15 11:10:57 63

原创 JavaSE-Java概述

JDK,JRE,JVM三者之间的关系,以及JDK、JRE包含的主要结构有哪些JDK = JRE + Java的开发工具(javac.exe,java.exe,javadoc.exe)JRD = JVM + Java核心类库为什么要配置path环境变量?如何配置?希望java开发工具在任何路径下都可以执行,所以配置环境变量(这里注意要配置系统变量,不要配置用户变量)JAVA_HOME = bin的上一层目录path = %JAVA_HOME%\binpath: windows操作系统执行.

2021-09-15 11:10:15 77

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除