From 11adcc341ef51ef398f0bb7155f4a329347db4f3 Mon Sep 17 00:00:00 2001 From: kn5886348135 <56352848+kn5886348135@users.noreply.github.com> Date: Wed, 23 Nov 2022 11:02:09 +0800 Subject: [PATCH] =?UTF-8?q?=E9=93=BE=E8=A1=A8=E5=92=8CSpringBean=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- algorithm/{位运算.md => 1、位运算.md} | 68 ++-- algorithm/{算法.md => 2、算法.md} | 188 +++++----- .../{数据结构.md => 3、数据结构.md} | 0 ...间复杂度.md => 4、时间复杂度.md} | 0 algorithm/5、单链表.md | 56 +++ algorithm/单链表.md | 326 ------------------ framework-source-code/Spring启动流程.md | 63 ++++ .../spring/BeanFactory相关类图.png | Bin 0 -> 28916 bytes 8 files changed, 247 insertions(+), 454 deletions(-) rename algorithm/{位运算.md => 1、位运算.md} (96%) rename algorithm/{算法.md => 2、算法.md} (95%) rename algorithm/{数据结构.md => 3、数据结构.md} (100%) rename algorithm/{时间复杂度.md => 4、时间复杂度.md} (100%) create mode 100644 algorithm/5、单链表.md delete mode 100644 algorithm/单链表.md create mode 100644 framework-source-code/Spring启动流程.md create mode 100644 framework-source-code/spring/BeanFactory相关类图.png diff --git a/algorithm/位运算.md b/algorithm/1、位运算.md similarity index 96% rename from algorithm/位运算.md rename to algorithm/1、位运算.md index 6220d80..99502c3 100644 --- a/algorithm/位运算.md +++ b/algorithm/1、位运算.md @@ -1,34 +1,34 @@ -一个数的相反数为取反加1. -取反的结果和原来的数相加结果为2^32^-1,再加1则进位为0。 - -2^32^-1二进制为 - -```shell -11111111 11111111 11111111 11111111 -``` - -```shell -# 例如 int a = 1024;二进制为 -00000000 00000000 00001000 00000000 -# 取反后 -11111111 11111111 11110111 11111111 -# 相加为 -11111111 11111111 11111111 11111111 -a+~a+1=0;则-a=~a+1; -``` - -```Java -# 打印int类型二进制字符串方法 -private static void printCompleteBinaryStr(int num){ - for (int i = 31; i >= 0; i--) { - System.out.print((num & (1 << i)) == 0 ? "0" : "1"); - if (i < 31 && (i + 1) % 8 == 0) { - System.out.print(" "); - } - } - System.out.println(); -} -``` - -Integer.MIN_VALUE取反加一后仍然为Integer.MIN_VALUE,这不是bug。 -Integer.MAX_VALUE加1后溢出为Integer.MIN_VALUE,Integer.MIN_VALUE减一则溢出为Integer.MAX_VALUE。 +一个数的相反数为取反加1. +取反的结果和原来的数相加结果为2^32^-1,再加1则进位为0。 + +2^32^-1二进制为 + +```shell +11111111 11111111 11111111 11111111 +``` + +```shell +# 例如 int a = 1024;二进制为 +00000000 00000000 00001000 00000000 +# 取反后 +11111111 11111111 11110111 11111111 +# 相加为 +11111111 11111111 11111111 11111111 +a+~a+1=0;则-a=~a+1; +``` + +```Java +# 打印int类型二进制字符串方法 +private static void printCompleteBinaryStr(int num){ + for (int i = 31; i >= 0; i--) { + System.out.print((num & (1 << i)) == 0 ? "0" : "1"); + if (i < 31 && (i + 1) % 8 == 0) { + System.out.print(" "); + } + } + System.out.println(); +} +``` + +Integer.MIN_VALUE取反加一后仍然为Integer.MIN_VALUE,这不是bug。 +Integer.MAX_VALUE加1后溢出为Integer.MIN_VALUE,Integer.MIN_VALUE减一则溢出为Integer.MAX_VALUE。 diff --git a/algorithm/算法.md b/algorithm/2、算法.md similarity index 95% rename from algorithm/算法.md rename to algorithm/2、算法.md index 19be663..3cd53e2 100644 --- a/algorithm/算法.md +++ b/algorithm/2、算法.md @@ -1,94 +1,94 @@ -# 算法的5个特点 - -1.有穷性 -2.确定性(确定的执行流程或者确定的尝试流程) -3.可行性 -4.输入 -5.输出 - -# 选择排序 - -双层循环,内层循环完成后获取最小值,内层循环每次将最小值放到i位置。 -0-i之间认为是有序,i-n之间是原始数据,从i-n之间选择最小的元素放到index为i的地方。 - -不稳定的排序 - -```Java -private static void selectionSort(int[] arr) { - if (arr == null || arr.length < 2) { - return; - } - - int length = arr.length; - int tmp; - for (int i = 0; i < length; i++) { - int index = i; - for (int j = i; j < length; j++) { - // 小于号避免位置交换 - index = arr[j] < arr[index] ? j : index; - } - if (index == i) { - continue; - } - tmp = arr[i]; - arr[i] = arr[index]; - arr[index] = tmp; - } -} -``` - -# 冒泡排序 - -双层循环,内层循环两两交换,内层循环完成后将最大值冒泡到最右边。 -外层循环index从大到小,内层循环index从小到大。 - -稳定排序 - -```Java -private static void bubbleSort(int[] arr){ - int length = arr.length; - if (arr == null || length < 2) { - return; - } - - int tmp; - for (int i = length - 1; i >= 0; i--) { - for (int j = 0; j < i; j++) { - if (arr[j + 1] < arr[j]) { - tmp = arr[j]; - arr[j] = arr[j + 1]; - arr[j + 1] = tmp; - } - } - } -} -``` - -# 插入排序 - -每次获取原始数据最前面的那个元素交换到左侧已经有序的数组。 -双层循环,外层循环每次递增并获取i,内层循环使用i挨个和0-1的数据比较并交换。如果i比i-1大或者内层循环到了最左侧则终止循环。 - -稳定排序 - -```Java -private static void insertSort(int[] arr){ - int length = arr.length; - if (arr == null || length < 2) { - return; - } - int tmp; - for (int i = 0; i < length; i++) { - for (int j = i; j > 0; j--) { - if (arr[j - 1] > arr[j]) { - tmp = arr[j - 1]; - arr[j - 1] = arr[j]; - arr[j] = tmp; - } else { - break; - } - - } - } -} -``` +# 算法的5个特点 + +1.有穷性 +2.确定性(确定的执行流程或者确定的尝试流程) +3.可行性 +4.输入 +5.输出 + +# 选择排序 + +双层循环,内层循环完成后获取最小值,内层循环每次将最小值放到i位置。 +0-i之间认为是有序,i-n之间是原始数据,从i-n之间选择最小的元素放到index为i的地方。 + +不稳定的排序 + +```Java +private static void selectionSort(int[] arr) { + if (arr == null || arr.length < 2) { + return; + } + + int length = arr.length; + int tmp; + for (int i = 0; i < length; i++) { + int index = i; + for (int j = i; j < length; j++) { + // 小于号避免位置交换 + index = arr[j] < arr[index] ? j : index; + } + if (index == i) { + continue; + } + tmp = arr[i]; + arr[i] = arr[index]; + arr[index] = tmp; + } +} +``` + +# 冒泡排序 + +双层循环,内层循环两两交换,内层循环完成后将最大值冒泡到最右边。 +外层循环index从大到小,内层循环index从小到大。 + +稳定排序 + +```Java +private static void bubbleSort(int[] arr){ + int length = arr.length; + if (arr == null || length < 2) { + return; + } + + int tmp; + for (int i = length - 1; i >= 0; i--) { + for (int j = 0; j < i; j++) { + if (arr[j + 1] < arr[j]) { + tmp = arr[j]; + arr[j] = arr[j + 1]; + arr[j + 1] = tmp; + } + } + } +} +``` + +# 插入排序 + +每次获取原始数据最前面的那个元素交换到左侧已经有序的数组。 +双层循环,外层循环每次递增并获取i,内层循环使用i挨个和0-1的数据比较并交换。如果i比i-1大或者内层循环到了最左侧则终止循环。 + +稳定排序 + +```Java +private static void insertSort(int[] arr){ + int length = arr.length; + if (arr == null || length < 2) { + return; + } + int tmp; + for (int i = 0; i < length; i++) { + for (int j = i; j > 0; j--) { + if (arr[j - 1] > arr[j]) { + tmp = arr[j - 1]; + arr[j - 1] = arr[j]; + arr[j] = tmp; + } else { + break; + } + + } + } +} +``` diff --git a/algorithm/数据结构.md b/algorithm/3、数据结构.md similarity index 100% rename from algorithm/数据结构.md rename to algorithm/3、数据结构.md diff --git a/algorithm/时间复杂度.md b/algorithm/4、时间复杂度.md similarity index 100% rename from algorithm/时间复杂度.md rename to algorithm/4、时间复杂度.md diff --git a/algorithm/5、单链表.md b/algorithm/5、单链表.md new file mode 100644 index 0000000..27e6b40 --- /dev/null +++ b/algorithm/5、单链表.md @@ -0,0 +1,56 @@ +#### 单链表反转 + +使用while循环,保存next节点,设置当前节点的next,保存pre,移动head,最后返回pre + +```Java +private static Node reverseLinkedList(Node head) { + Node pre = null; + Node next = null; + while (head != null) { + next = head.getNext(); + head.setNext(pre); + pre = head; + head = next; + } + return pre; +} +``` + +#### 双链表反转 + +使用while循环,保存next节点,设置当前节点的last和pre,保存pre,移动head,最后返回pre + +```Java +private static Node reverDoubleLinkedList(Node head) { + Node pre = null; + Node next = null; + while (head != null) { + next = head.getLast(); + head.setLast(pre); + head.setPre(next); + pre = head; + head = next; + } + return pre; +} +``` + +单链表实现队列和栈 + +### 使用双链表实现双端队列 + +单链表和双链表的新增、删除,主要注意处理好前驱和后继指针,必要的时候添加中间变量保存。双链表注意处理头尾重合、为空的边界条件。 + +#### K个节点的组内逆序调整 LeetCode25 + +#### 两个链表相加 LeetCode2、LeetCode445 + +根据链表长度分三段处理,第一段处理短链表,第二段处理长链表多出的部分,第三段处理长链表最后的进位 + +#### 合并两个有序链表 LeetCode21 + +### 位图 + +位图的功能 +位图的好处 +位图的用法 diff --git a/algorithm/单链表.md b/algorithm/单链表.md deleted file mode 100644 index a9c1840..0000000 --- a/algorithm/单链表.md +++ /dev/null @@ -1,326 +0,0 @@ -单链表反转 -使用while循环,保存next节点,设置当前节点的next,保存pre,移动head,最后返回pre - -```Java -private static Node reverseLinkedList(Node head) { - Node pre = null; - Node next = null; - while (head != null) { - next = head.getNext(); - head.setNext(pre); - pre = head; - head = next; - } - return pre; -} -``` - -双链表反转 -使用while循环,保存next节点,设置当前节点的last和pre,保存pre,移动head,最后返回pre - -```Java -private static Node reverDoubleLinkedList(Node head) { - Node pre = null; - Node next = null; - while (head != null) { - next = head.getLast(); - head.setLast(pre); - head.setPre(next); - pre = head; - head = next; - } - return pre; -} -``` - -单链表实现队列和栈 - -```Java -public class CustomQueue { - - private Node head; - private Node tail; - private int size; - - public boolean isEmpty(){ - return size == 0; - } - - public void offer(V value) { - Node node = new Node<>(value); - if (tail == null) { - head = node; - tail = node; - } else { - tail.setNext(node); - tail = node; - } - size++; - } - - public V poll(){ - if (head == null) { - return null; - } - V ans = head.getValue(); - head = head.getNext(); - size--; - return ans; - } - - public V peek() { - if (head == null) { - return null; - } - return head.getValue(); - } - - private class Node { - private V value; - private Node next; - - public V getValue() { - return value; - } - - public void setValue(V value) { - this.value = value; - } - - public Node getNext() { - return next; - } - - public void setNext(Node next) { - this.next = next; - } - - public Node(V value) { - this.value = value; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Node node = (Node) o; - return value.equals(node.value) && - next.equals(node.next); - } - - @Override - public int hashCode() { - return Objects.hash(value, next); - } - } -} -``` - -```Java -public class CustomStack { - private Node head; - private int size; - - public boolean isEmpty(){ - return size == 0; - } - - public void push(V value){ - Node node = new Node<>(value); - if (head == null) { - head = node; - } else { - node.setNext(head); - head = node; - } - size++; - } - - public V pop(){ - if (head == null) { - return null; - } - V ans = null; - ans = head.getValue(); - head.setNext(head.getNext()); - size--; - return ans; - } - - public V peek() { - return head == null ? null : head.getValue(); - } - - - class Node{ - private V value; - private Node next; - - public V getValue() { - return value; - } - - public void setValue(V value) { - this.value = value; - } - - public Node getNext() { - return next; - } - - public void setNext(Node next) { - this.next = next; - } - - public Node(V value) { - this.value = value; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Node node = (Node) o; - return Objects.equals(value, node.value) && - Objects.equals(next, node.next); - } - - @Override - public int hashCode() { - return Objects.hash(value, next); - } - } -} -``` - -### 使用双链表实现双端队列 - -```Java -public class CustomDeque { - private Node head; - private Node tail; - private int size; - - public boolean isEmpty() { - return size == 0; - } - - public void pushHead(V value){ - Node node = new Node<>(value); - if (head == null) { - head = node; - tail = node; - } else { - node.setLast(head); - head.setPre(node); - head = node; - } - size++; - } - - public void pushTail(V value){ - Node node = new Node<>(value); - if (head == null) { - head = node; - tail = node; - } else { - tail.setLast(node); - node.setPre(tail); - tail = node; - } - size++; - } - - public V pollHead(){ - if (head == null) { - return null; - } - V ans = head.getValue(); - if (head.equals(tail)) { - head = null; - tail = null; - } else { - head = head.getLast(); - head.setPre(null); - } - size--; - return ans; - } - - public V pollTail(){ - if (tail == null) { - return null; - } - V ans = tail.getValue(); - if (head.equals(tail)) { - head = null; - tail = null; - } else { - tail = tail.getPre(); - tail.setLast(null); - } - size--; - return ans; - } - - public V peekHead(){ - return head == null ? null : head.getValue(); - } - - public V peekTail(){ - return tail == null ? null : tail.getValue(); - } - - class Node{ - private V value; - private Node last; - private Node pre; - - public Node(V value) { - this.value = value; - } - - public V getValue() { - return value; - } - - public void setValue(V value) { - this.value = value; - } - - public Node getLast() { - return last; - } - - public void setLast(Node last) { - this.last = last; - } - - public Node getPre() { - return pre; - } - - public void setPre(Node pre) { - this.pre = pre; - } - - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Node node = (Node) o; - return Objects.equals(value, node.value); - } - - @Override - public int hashCode() { - return Objects.hash(value); - } - } -} -``` - -单链表和双链表的新增、删除,主要注意处理好前驱和后继指针,必要的时候添加中间变量保存。双链表注意处理头尾重合、为空的边界条件。 - -K个节点的组内逆序调整 diff --git a/framework-source-code/Spring启动流程.md b/framework-source-code/Spring启动流程.md new file mode 100644 index 0000000..9965e21 --- /dev/null +++ b/framework-source-code/Spring启动流程.md @@ -0,0 +1,63 @@ +## Spring启动流程 + +### prepareRefresh() + +记录时间、active标记、获取environment(系统环境变量和System.setProperty()设置的)、初始化监听器和事件集合。 + +### obtainFreshBeanFactory() + +关闭以前的BeanFactory,创建一个新的BeanFactory供上下文生命周期的各阶段使用。 +父beanDefinition、bean可覆盖、循环引用, +loadBeanDefinitions()通过inputStream读取并解析xml文档,拿到beanDefinition。 + +### prepareBeanFactory() + +准备BeanFactory,设置ClassLoader、SPEL解析器、propertyEditor、BeanPostProcessor(ApplicationContextAwareProcessor)、ignoreDependencyInterface(各种Aware接口)、registerResolvableDependency、BeanPostProcessor(ApplicationListenerDetector)、environment单例。 + +### postProcessBeanFactory(beanFactory) + +继承ClassPathXmlApplicationContext的子类可以修改beanFactory,用于实现一些自定义的功能。 + +### invokeBeanFactoryPostProcessors(beanFactory) + +BeanDefinitionRegistryPostProcessors和BeanFactoryPostProcessors按照实现PriorityOrdered、Ordered接口、没有实现这两个接口的PostProcessors处理执行顺序,@Order注解在这里是不考虑的。 + +// Register bean processors that intercept bean creation. + +### registerBeanPostProcessors(beanFactory) + +BeanPostProcessor按照实现PriorityOrdered、Ordered接口、没有实现这两个接口的PostProcessors处理执行顺序,@Order注解在这里是不考虑的。 +BeanPostProcessorChecker用来记录日志。 + +### initMessageSource() + +初始化MessageSource,MessageSource是格式化字符串的? + +### initApplicationEventMulticaster() + +初始化应用事件监听器,SimpleApplicationEventMulticaster通过线程池往各种监听器添加事件。 + +### onRefresh() + +由子类实现,比如Spring Boot创建web server。 + +### registerListeners() + +注册所有实现了ApplicationListener接口的监听器,并发布早起应用事件。 + +### finishBeanFactoryInitialization(beanFactory) + +实例化所有非懒加载的单例。 +ConversionService(转换系统的一个入口,可用于常见的日期格式转换?)、添加EmbeddedValueResolver、BeanFactory方式获取LoadTimeWeaverAware、置空temporary ClassLoader、冻结配置、预实例化单例。 +preInstantiateSingletons() +遍历beanNames,触发所有非懒加载bean实例化。 +遍历beanNames,触发所有适用 bean 的初始化后回调。 +getBean(beanName) -> doGetBean -> getSingleton(三级缓存) -> createBean -> doCreateBean -> 代理和反射创建bean(三级缓存) -> populateBean -> initializeBean + +### finishRefresh() + +清理资源缓存、初始化LifecycleProcessor、发布最终事件 + +### resetCommonCaches() + +### contextRefresh.end() diff --git a/framework-source-code/spring/BeanFactory相关类图.png b/framework-source-code/spring/BeanFactory相关类图.png new file mode 100644 index 0000000000000000000000000000000000000000..a903a2b1362340547c53f378f002efb1b53eb067 GIT binary patch literal 28916 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 literal 0 HcmV?d00001