Spring高级45讲【第三章】:AOP
代理增强方式aspectj编译器增强先看一组例子:
pom.xml文件中增加插件:
123456789101112131415161718192021222324<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>aspectj-maven-plugin</artifactId> <version>1.14.0</version> <configuration> <complianceLevel>1.8</complianceLevel> <source>8</source> <target>8</target> <showWeaveInfo>true</showWeaveInfo> <verbose>true</verbo ...
Spring高级45讲【第二章】:IOC
容器接口以SpringBoot的启动类为例:
123456@SpringBootApplicationpublic class A01{ public static void main(String[] args) { SpringApplication.run(A01.class, args); }}
容器启动的run()方法是有返回值的:
1ConfigurableApplicationContext context = SpringApplication.run(A01.class, args);
在 IDEA 中使用快捷键Ctrl +Alt +U查看 ConfigurableApplicationContext 类的类图:
ConfigurableApplicationContext接口继承了ApplicationContext接口,而
ApplicationContext 接口又间接地继承了BeanFactory 接口,除此之外还继承了其他很多接口,相当于对BeanFactory 进行了拓展。
到底什么是 ...
Spring高级45讲【第一章】:导学
参考视频:黑马程序员Spring视频教程,深度讲解spring5底层原理
源码仓库:spring-test
学习Spring的必须性?
Spring是整个Java体系最核心的框架,没有之一
面试必备(spring的核心原理、springmvc的执行流程、springboot的自动装配…)
技术、思想提升(设计模式、高新技术发展…)
阅读源码的错误姿势?
对Spring功能还不了解,还不会用呢,却要强读。不要轻易装B,轻则耗费心神,重则挫败放弃。先会用,再研究。
没有目的,一上来就debug,看到哪分析到哪。没有目的的debug,会让你迷失在源码当中,翻一百遍也是枉然。明确要研究的问题,带着问题看代码。
不分主次,分析一个问题时,引入另一个陌生问题。抓住重点,逐个击破。
只讲源码功能,不做单元测试。眼过千遍,不如手过一遍
如何学习Spring?
了解要研究的组件(类)基本使用
用单元测试研究组件的特性
试着自己实现类似功能(选讲)
最后再深入阅读该组件的源码(避免讲)
需要具备的前置知识?
Spring的基础知识
想探究Spring原理的好奇心
学习Spring有什么收获 ...
并查集的介绍
并查集定义
并查集是一种树型的数据结构,用于处理一些不相交集合(disjoint sets)的合并及查询问题。
并查集通常包含两种操作
查找(Find):查询两个元素是否在同一个集合中
合并(Union):把两个不相交的集合合并为一个集合
并查集思想请看以下示例:116. 省份数量
有n个城市,其中一些彼此相连,另一些没有相连。如果城市a与城市b直接相连,且城市b与城市c直接相连,那么城市a与城市c间接相连。
省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。
给出一个n x n的矩阵isConnected,其中isConnected[i][j] = 1表示第i个城市和第j个城市直接相连,而isConnected[i][j] = 0表示二者不直接相连。
给出任意的两个城市i和j,判断是否为同一省份。
并查集的思想就是将每个城市看作一个节点,如果节点之间有联系,那么就选择一个节点为其父节点,例如:
若节点0和1有关联,那么随机选择0作为1的父节点:
若1和2有关联,那么就找到1的根节点0,即0与2有关联,随机选择0作为父节点:
同理,3与4有关联,我们选择4为父节 ...
小于n的最大数
题目描述数组nums中给定可以使用的1~9的数,返回由数组nums中的元素组成的小于n的最大数。
示例 1:
12输入:nums = {1, 2, 9, 4},n = 2533输出:2499
示例 2:
12输入:nums = {1, 2, 5, 4},n = 2543输出:2542
示例 3:
12输入:nums = {1, 2, 5, 4},n = 2541输出:2525
示例 4:
12输入:nums = {1, 2, 9, 4},n = 2111输出:1999
示例 5:
12输入:nums = {5, 9},n = 5555输出:999
示例 6:
12输入:nums = {5, 9},n = 3输出:-1
我的解法思路
对每一位先尝试使用相同数字
如果没有相同数字,判断是否存在比当前数字更小的数字,如果有,则选择更小数字中的最大数,剩余的数字用最大数字
如果没有,向前查找前一个数字有没有更小的数字
直到回溯到第一个数字,就用位数更少但全部都是最 ...
懂车帝二面复盘
时间:2023年04月10日 17:00
场景数据推送到内存中,如何做到不产生并发问题。
请看以下示例:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889public class Main { public static void main(String[] args) throws InterruptedException { Test test = new Test(); Thread readThread = new Thread(new Runnable1(test)); readThread.start(); Thread writeThread = new Thread(new Runnable2(test) ...
Java中i=i++问题
猜猜以下代码的输出:
1234567891011public class Test { public static void main(String[] args) { int i = 0; for (int j = 0; j < 100; j++) { i = i++; } System.out.println("result = " + i); }}
输出为:
1result = 0
刚开始还以为是答案错误,在idea中运行了一下发现,还真是这样。
按照一般的思路,i = i ++ 应该分为两步:
i = i
i ++
结果应该为:
1result = 100
上网查了一下:
i = i ++ 的步骤其实分为三步:
把变量i的值取出来,放在一个临时变量里(记作temp);
把变量i的值进行自加操作;
把临时变量temp的值作为自增运算前i的值使用;
经过以上三步操 ...
排序算法
算法概述排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。
常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括:
各算法对比:
冒泡排序算法思想冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢”浮”到数列的顶端。
算法步骤
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,数组末尾会形成有序区
针对无序区域元素重复以上的步骤,最多重复数组长度-1次
代码实现12345678910111213141516/** * 原始实现 * * @param array */public static void sort1(int[] array) ...
二叉树的遍历
二叉树(binary tree)是树的一种特殊形式。二叉,顾名思义,这种树的每个节点最多有2个孩子节点。注意,这里是最多有2个,也可能只有1个,或者没有孩子节点。
代码定义:
123456789101112/** * 二叉树 */private static class TreeNode { int data; TreeNode leftChild; TreeNode rightChild; public TreeNode(int data) { this.data = data; }}
深度优先遍历递归遍历前序遍历二叉树的前序遍历,输出顺序是根节点、左子树、右子树。
12345678910111213/** * 前序遍历 * * @param root */public static void preOrderTraversal(TreeNode root) { if (root == null) { return; } System.o ...
二叉查找树
二叉查找树定义二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。是数据结构中的一类。在一般情况下,查询效率比链表结构要高。
一棵空树,或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
(4)没有键值相等的结点。
二叉查找树的中序遍历按照升序进行排序。
定义节点类:
123456789101112/** * 结点类 */private class Node { int data; Node right; Node left; Node(int data) { this.data = data; }}
查找123456789101112131415161718192021/** * 查找结点 * * @param data * @return */public Node search(in ...