JAVA
LaztyCat
啥也不会啊
展开
-
Spring之面向切面(AOP)
1. 如果没有Spring框架,我们需要在每个service的方法中都添加记录日志的方法,如下:public List<User> findUserList() { System.out.println("execute method findUserList"); return this.userDao.findUserList();}2.有了Spring框架,通过@Aspect注解 定义了切面,这个切面中定义了拦截所有service中的方法,并记录日志; 可以.原创 2022-02-28 11:19:08 · 406 阅读 · 0 评论 -
Spring之控制反转(IOC)
1. 如果没有Spring框架,我们需要自己创建User/Dao/Service等,如下:UserDaoImpl userDao = new UserDaoImpl();UserSericeImpl userService = new UserServiceImpl();userService.setUserDao(userDao);List<User> userList = userService.findUserList();2. 有了Spring框架,可以将原有Bean的创原创 2022-02-28 11:03:54 · 305 阅读 · 0 评论 -
分布式唯一ID
package cn.itcast.Demo21.algorithm;// 雪花算法生成的id采用long整型存储,即64位=12位序列号+10位机器标志号+41位时间戳+1位符号位public class SnowFlake { // 采用时间戳占用位数 private final static long START_STAMP = 1645581043000L; // 序列号占用的位数 private final static long SEQUENCE_BIT =.原创 2022-02-23 16:50:30 · 41 阅读 · 0 评论 -
JAVA之日期处理
package cn.itcast.Demo20.日期处理;/** * JAVA8所有日期和时间API都是不可变的并且线程安全的,而现有的Date和 Calendar API中的java.uil.Date和SimpleDateFormat是非线程安全的 */import java.time.*;import java.time.format.DateTimeFormatter;import java.time.temporal.ChronoUnit;import java.util.Dat.原创 2021-10-11 11:06:50 · 257 阅读 · 0 评论 -
Spring之数据库连接JDBC
1. 第一种方式:使用spring自带的DriverManagerDataSource<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.原创 2021-09-25 13:16:37 · 480 阅读 · 0 评论 -
Spring之默认标签的解析
private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) { // 对import标签的处理 if (delegate.nodeNameEquals(ele, IMPORT_ELEMENT)) { importBeanDefinitionResource(ele); } // 对alias标签的处理 else if (delegate.nodeN.原创 2021-09-22 17:42:06 · 187 阅读 · 0 评论 -
Intellij IDEA 调试技巧
Step 系列按钮日常调试的过程中为了为了找到程序的 bug,通常需要单步调试,一步一步跟踪程序执行的流程,根据变量的值,找到最终原因。IDEA 中提供一系列 Step 功能按钮用于单步调试,可以在 Run 菜单栏找到全部 Step 功能。另外在调试窗口也可以找到,不过这里只会显示一部分常用按钮。调试过程中,使用频率最高的可能就是 Setp Over。Setp Over 可以单步调试代码,但是当碰到方法执行时,不会进入方法内,直接调用了方法,然后到下一行。如果需要进入方法内,原创 2021-09-12 10:30:21 · 396 阅读 · 0 评论 -
Spring源码之资源文件处理相关类
1. InputStreamSource 意义:封装任何能返回InputStream的类,比如File、Classpath下的资源和ByteArray等 源码:public interface InputStreamSource { /** * Return an {@link InputStream} for the content of an underlying resource. * <p>It is expected that ea...原创 2021-09-08 19:08:18 · 84 阅读 · 0 评论 -
Spring源码之核心类XmlBeanDefinitionReader
1. 意义 XmlBeanFactory对DefaultListableBeanFactory类进行了扩展,XmlBeanFactory使用了自定义的XML读取器XmlBeanDefinitionReader对资源文件进行了读取和注册2. 结构层次图原创 2021-09-07 10:32:34 · 49 阅读 · 0 评论 -
Spring源码之核心类DefaultListableBeanFactory
1. 意义 该类是整个bean加载的核心部分,是spring注册及加载bean的默认实现2. 层次结构图原创 2021-09-06 20:42:44 · 45 阅读 · 0 评论 -
Spring源码调试环境搭建
1. spring源代码下载地址:https://github.com/spring-projects/spring-framework, 本文所用版本5.2.x2. 安装Gradle:Gradle下载地址: https://services.gradle.org/distributions/注意:需要下载的gradle版本,这个需要和jdk和gradle插件的版本对应起来安装中遇到的问题(一):之前编译5.2.x版本的源码,遇到错误,...原创 2021-09-05 10:15:58 · 838 阅读 · 0 评论 -
数据结构之向量实现
import java.util.Arrays;import java.util.RandomAccess;import jdk.internal.util.ArraysSupport;/** * @Classname Vector继承自AbstractList,实现了Stack类 * @note:Vector是线程安全的,ArrayList不是线程安全的 * @note:Vector底层是一个可以增长的数组组成的,通过capacity和capacityIncrement来尽量少的占用空间.原创 2021-09-04 16:47:10 · 129 阅读 · 0 评论 -
数据结构之栈的实现
import java.util.EmptyStackException;/** * @Classname Stack:栈是一种线性数据结构,遵从LIFO(后进先出)的操作顺序,所有操作都是在顶部进行 */public class Stack<E> extends Vector<E> {/** * Stack的构造函数:跟Vector 一样,它是数组实现的栈 */ public Stack() {};// 构造函数/** * Stack的入栈:Vector的a.原创 2021-09-04 16:45:44 · 66 阅读 · 0 评论 -
集合类源码之迭代器ListIterator
/** * @Classname ListIterator:Iterator的一个重要子接口,增加了6个方法 * @see:为需要双向遍历数据时准备的,在后续ArrayList和LinkedList分析时会用到 * @see:在遍历时修改List的元素 * @see:在遍历时获取迭代器当前游标所在位置,注意长度为N的集合会有N+1个游标的位置,第一个元素位置为0,第一个游标位置为-1,在第一个元素前 * @date 2021年7月5日 下午3:00:14 * @Version 1.0 */.原创 2021-09-04 16:44:13 · 106 阅读 · 0 评论 -
集合类源码之LinkedList(八)
import java.util.AbstractSequentialList;import java.util.NoSuchElementException;import jdk.jfr.internal.PrivateAccess;/** * @Classname LinkedList:采用链表方式实现的队列,因此所有操作都在Node节点上,每个Node节点首尾相连,存有数据和前后指针 * @note:LinkeList实现了List和Deque接口,因此能够像使用ArrayList一样.原创 2021-09-04 16:41:10 · 52 阅读 · 0 评论 -
集合类源码之Deque(七)
/** * @Classname Deque:双端队列,继承Queue,直接实现的有LinkedList\ArrayDeque\ConcurrentLinkedDeque * @note:Deque定义了分别在头部、尾部进行插入、删除、获取元素 * @note:实现类LinkedList:大小可变的链表双端队列,允许元素为null * @note:实现类ArrayDeque:大小可变的数组双端队列,不允许为null * @note:实现类LinkedBlockingDeque用于并发场景,如果队.原创 2021-09-04 16:39:32 · 84 阅读 · 0 评论 -
集合类源码之Queue(六)
/** * @Classname Queue:继承子Collection接口,实现类包括Deque、LinkedList、PriorityQueue、BlockingQueue * @note:Queue用来存放“等待处理元素”的集合,所以常运用于缓冲、并发访问、阻塞队列、多线程等领域 * @note:Queue除了继承Collection接口的一些方法,Queue还添加了额外的添加、删除、查询等操作,均提供了两种形式, * 一种操作失败时直接返回异常,另一种则返回一个特殊的值 * @no.原创 2021-09-04 16:37:11 · 49 阅读 · 0 评论 -
IDEA+Gradle
导语:IDEA拥有大量的JAVA开发者拥护,相比于开源的eclipse,IDEA拥有更简洁直观的界面,拥有更强大的自动补全功能,号称能“一路敲回车完成编码”。如果把IDEA和eclipse比作手机系统,IDEA就好比IOS,美观、强大、人性化、傻瓜化,官方就帮你解决了大部分问题与操作。eclipse更像android,自由、开放、高度可定制,通过一系列的插件也可以达到IDEA同样的、甚至更个性化的体验,但是操作不免让人感觉复杂、上手难。Gradle作为build工具的新星,受到谷歌的大力拥护,直接原创 2021-09-04 09:35:04 · 848 阅读 · 0 评论 -
集合类源代码之迭代器Iterable
import java.util.Objects;import java.util.Spliterators;import java.util.function.Consumer;/** * @Classname Iterable:所有集合类实现了Collection接口,而Collection继承了Iterable接口 */public interface Iterable<T> { /** * @note:为什么集合类一定要实现Iterable接口,但并不直接实现I..原创 2021-09-03 19:50:29 · 83 阅读 · 0 评论 -
集合类源码之迭代器Iterator
import java.util.Objects;import java.util.function.Consumer;/** * @Classname Iterator:Iterator是foreach遍历的主体 * @note:Iterator是一个集合上的迭代器,用来替代Enumeration进行遍历和迭代 * @note:Iterator和Iterable的区别和联系?集合实现类都会重写Iterable接口的Iterator()方法,返回适合自己的迭代器 * @date 2021年7.原创 2021-09-03 19:28:38 · 50 阅读 · 0 评论 -
集合类源码之ArrayList(五)
import java.util.Arrays;import java.util.Objects;import jdk.internal.util.ArraysSupport;import jdk.nashorn.api.tree.ForInLoopTree;import sun.jvm.hotspot.utilities.GrowableArray;import sun.security.util.Length;/** * @Classname ArrayList:是Java集合框架中.原创 2021-09-03 16:49:33 · 126 阅读 · 0 评论 -
集合类源码之List(三)
import java.util.Objects;import java.util.function.UnaryOperator;/** * @Classname List:是Collection三大直接子接口之一,其他两大子接口包括Set和Queue接口 * @see:List针对线性表结构的,提供了对位置以及子表的操作,其数据可以为空,也可以重复,可以为null * @note:List的实现类主要包括ArrayList\LinkedList\Vector。其中ArrayList作为默认选.原创 2021-09-03 16:45:14 · 51 阅读 · 0 评论 -
集合类源码之AbstractList(四)
/** * @Classname AbstractList:AbstractList抽象类继承自AbstractCollection, * AbstractCollection抽象类要求子类实现iterator()和size() * @note:AbstractList抽象类实现了iterator()方法,但没有实现size()方法,还提供了抽象方法get(), * 因此子类ArrayList必须要实现get()和size(),子类想要修改元素得重写add()\set()\remove(..原创 2021-09-03 16:38:51 · 80 阅读 · 0 评论 -
集合类源码之AbstractCollection(二)
import java.util.Arrays;import jdk.internal.util.ArraysSupport;/** * @Classname AbstractCollection:实现了一些方法,也定义了几个抽象方法留给子类实现,因此是个抽象类 * @note:Collection接口的定义和继承的Iterable都可以在这个抽象类中实现,可以减少实现类需要实现的方法 * @note:如果要实现一个不可修改的集合,只需要重写iterator和size接口 * @note:如.原创 2021-09-03 16:16:48 · 77 阅读 · 0 评论 -
数据结构之二叉查找树的实现
1. 代码实现/*** @Classname BinaryTree* @author 10292356* @date 2021年8月30日 下午3:03:30* @Version 1.0*/public class BinaryTree<Key extends Comparable<Key>,Value> { private Node root; // 根节点 private int num; ...原创 2021-08-30 18:31:50 · 55 阅读 · 0 评论 -
集合类源码之Collection接口(一)
import java.util.Objects;import java.util.function.Predicate;import java.util.stream.StreamSupport;/*** @Classname Collection:定义了一组对象和它的子类需要实现的15个方法* @author 10292356* @date 2021年7月5日 下午8:48:46* @Version 1.0*/public interface Collection<E...原创 2021-08-29 17:19:54 · 41 阅读 · 0 评论 -
集合类源码之框架
复杂框架:简单框架:原创 2021-08-29 17:12:24 · 41 阅读 · 0 评论 -
设计模式之观察者模式
/** * @Classname Observer:观察者模式的接口 */public interface Observer { void update(Observable o,Object arg); // 当目标对象发生变化时,观察者得到通知进行相应的工作}/** * @Classname Observable:抽象目标类,定义了观察者模式,只要实现它们的子类就可以编写观察者模式实例 */public class Obse.原创 2021-08-29 16:45:48 · 43 阅读 · 0 评论 -
并发编程之Lock接口源码
public interface Lock { void lock(); // 获取该对象锁,在获取之前就会一直阻塞 void lockInterruptibly() throws InterruptedException; boolean tryLock(); // 试图获取一个锁,申请失败返回false,但该线程可以去做其他事儿 boolean tryLock(long time, TimeUnit unit) throws InterruptedException; .原创 2021-08-29 16:40:36 · 41 阅读 · 0 评论 -
并发编程之Condition接口源码
public interface Condition { void await() throws InterruptedException; // 将该线程放到条件的等待集中 void awaitUninterruptibly(); long awaitNanos(long manosTimeout) throws InterruptedException; boolean await(long time, TimeUnit unit) throws InterruptedException; .原创 2021-08-29 16:38:52 · 36 阅读 · 0 评论 -
JVM内存模型之本地方法栈和堆
1. 本地方法栈定义 一些带有native关键字的方法就是需要JAVA去调用本地的C或C++方法,因为Java有时候没法直接和操作系统底层交互,所以需要用到本地方法栈,服务于带native关键字的方法2. 堆的定义 Heap 堆:通过关键字创建的对象都会被放在堆内存3. 堆的特点 (1)它是线程共享的,堆内存中的对象需要考虑线程安全问题 (2)有垃圾回收机制 (3)堆内存溢出:java.lang.OutofMe...原创 2021-08-21 23:09:56 · 184 阅读 · 0 评论 -
JVM内存模型之虚拟机栈
1. 虚拟机栈 虚拟机栈定义:线程运行所需要的内存空间 虚拟机栈帧定义:每个方法运行时所需的内存空间,方法中包括成员变量和局部变量等 — 每个栈由多个栈帧组成,对应着每次调用方法时所用的内存 — 每个线程只能由有一个活动栈帧,对应着当前正在执行的方法2. DEMO演示 由于每个栈帧保存一个方法,所以采用方法递归调用的Debug演示:public class helloworld { private s...原创 2021-08-21 22:32:30 · 90 阅读 · 0 评论 -
JVM内存模型之程序计数器
1. JVM内存逻辑模型 成员变量保存在方法区中,对象保存在堆中,方法在JVM栈、程序计数器和本地方法栈中运行2. DEMO演示 源代码:public class helloworld { private static int b = 10; public static void main(String[] args) { int a = 10; char ch = 'a'; ...原创 2021-08-20 10:24:05 · 124 阅读 · 0 评论