- 博客(80)
- 收藏
- 关注
原创 SpringAOP的原理及仿写
AOP (Aspect Orient Programming),直译过来就是 面向切面编程。AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。面向对象编程将程序抽象成各个层次的对象,而面向切面编程是将程序抽象成各个切面。想象下面的场景,开发中在多个模块间有某段重复的代码,我们通常是怎么处理的?显然,没有人会靠“复制粘贴”吧。在传统的面向过程编程中,我们也会将这段代码,抽象成一个方法,然后在需要的地方分别调用这个方法,这样当这段代码需要修改时,我们只需要改变这个方法就可以了。然而需求总是变化的,有一
2022-06-28 18:03:34
259
原创 SpringIOC原理及仿写
IoC 是 Inversion of Control 的简写,译为“控制反转”,它不是一门技术,而是一种设计思想,是一个重要的面向对象编程法则,能够指导我们如何设计出松耦合、更优良的程序。2004年,Martin Fowler探讨了同一个问题,既然IOC是控制反转,那么到底是“哪些方面的控制被反转了呢?”,经过详细地分析和论证后,他得出了答案:“获得依赖对象的过程被反转了”。控制被反转之后,获得依赖对象的过程由自身管理变为了由IOC容器主动注入。于是,他给“控制反转”取了一个更合适的名字叫做“依赖注入(De
2022-06-24 19:35:10
362
原创 一步一步源码分析线程创建
方法2,使用 Runnable 配合 Thread把【线程】和【任务】(要执行的代码)分开也可使用lambda表达式方法3,FutureTask 配合 ThreadFutureTask 能够接收 Callable 类型的参数,用来处理有返回结果的情况例子测试*在创建线程时,Thread的构造方法init是重写的方法中间有一行是this.target=target;将Runnable的对象赋值。start0方法最后一个是重点,前面target赋值了,所以不为null可
2022-06-10 17:46:35
383
原创 并发:进程与线程
单核 cpu 下,线程实际还是 串行执行 的。操作系统中有一个组件叫做任务调度器,将 cpu 的时间片(windows下时间片最小约为 15 毫秒)分给不同的程序使用,只是由于 cpu 在线程间(时间片很短)的切换非常快,人类感觉是同时运行的。总结为一句话就是: 微观串行,宏观并行 。一般会将这种 线程轮流使用 CPU 的做法称为并发以调用方角度来讲,如果同步异步多线程可以让方法执行变为异步的(即不要巴巴干等着)比如说读取磁盘文件时,假设读取操作花费了 5 秒钟,如果没有线程调度机制,这 5
2022-06-10 15:52:22
324
原创 力扣算法—爱吃香蕉的珂珂
珂珂喜欢吃香蕉。这里有 n 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 h 小时后回来。珂珂可以决定她吃香蕉的速度 k (单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉 k 根。如果这堆香蕉少于 k 根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。珂珂喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。返回她可以在 h 小时内吃掉所有香蕉的最小速度 k(k 为整数)。输入:piles = [3,6,7,11], h = 8输出:4这个采用的二分法,先根据p
2022-06-07 11:20:39
182
原创 超赞!事务隔离级别详解
事务是逻辑上的一组操作,要么都执行,要么都不执行。事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对统一数据进行操作)。并发虽然是必须的,但可能会导致以下的问
2022-06-06 11:22:35
254
原创 cookie和session的概念和区别
在浏览某些网站时,这些网站会把一些数据存在 客户端 , 用于使用网站等跟踪用户,实现用户自定义功能.如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,关闭浏览器后消失。每次访问同源网络链接时都会发送一次cookie。Session是存放在服务器端的类似于HashTable结构(每一种web开发技术的实现可能不一样,下文直接称之为HashTable)来存放用户数据;注:当多客户端时抛弃cookie方式(因为像ios安卓一类的不会自动发送cookie) 可以改用请求头+token来进行认证..
2022-06-06 08:38:01
110
原创 RBAC权限管理的认识
RBAC基于角色的权限访问控制(Role-Based Access Control)是商业系统中最常见的权限管理技术之一。RBAC是一种思想,任何编程语言都可以实现,其成熟简单的控制思想 越来越受广大开发人员喜欢。在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。在一个组织中,角色是为了完成各种工作而创造,用户则依据它的责任和资格来被指派相应的角色,用户可以很容易地从一个角色被指派到另一个角色。角色可依新的需求和系统的合并而赋予新的权限,而权限也可根
2022-06-05 17:14:27
165
原创 力扣算法—在圆内随机生成点
给定圆的半径和圆心的位置,实现函数 randPoint ,在圆中产生均匀随机点。实现 Solution 类:Solution(double radius, double x_center, double y_center) 用圆的半径 radius 和圆心的位置 (x_center, y_center) 初始化对象randPoint() 返回圆内的一个随机点。圆周上的一点被认为在圆内。答案作为数组返回 [x, y] 。这个题是进行编写类的初始化方法和方法。初始化方法对类的属性进行赋值,randPoint
2022-06-05 09:33:34
339
原创 力扣算法——独特的电子邮件地址
每个 有效电子邮件地址 都由一个 本地名 和一个 域名 组成,以 ‘@’ 符号分隔。除小写字母之外,电子邮件地址还可以含有一个或多个 ‘.’ 或 ‘+’ 。例如,在 alice@leetcode.com中, alice 是 本地名 ,而 leetcode.com 是 域名 。如果在电子邮件地址的 本地名 部分中的某些字符之间添加句点(‘.’),则发往那里的邮件将会转发到本地名中没有点的同一地址。请注意,此规则 不适用于域名 。例如,"alice.z@leetcode.com” 和 “alicez@leet
2022-06-04 10:24:06
302
原创 基于jdk的动态代理使用
文章目录什么是(jdk)动态代理?java动态代理类jdk动态代理使用什么是(jdk)动态代理?代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。而(jdk)动态代理是在反射基础上进行的动态实现的代理。(当然还有一些基于其他的: ASM(一个短小精悍的字节码操作框架)、cglib(基于 ASM))java动态代理类Java动态代理类位于java.lang.reflect包//I
2022-05-09 19:29:51
365
原创 力扣算法——数组中重复的数据
442.数组中重复的数据给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数,并以数组形式返回。你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。示例 1:输入:nums = [4,3,2,7,8,2,3,1]输出:[2,3]示例 2:输入:nums = [1,1,2]输出:[1]示例 3:输入:nums = [1]输出:[]//没看题的遍历,
2022-05-08 18:01:46
125
原创 Spring注解开发(常用注解)
Spring原始注解Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势,注解代替xml配置文件可以简化配置,提高开发效率。Spring原始注解主要是替代的配置注意:使用注解进行开发时,需要在applicationContext.xml中配置组件扫描,作用是指定哪个包及其子包下的Bean需要进行扫描以便识别使用注解配置的类、字段和方法。<!-- 注解的组件扫描 --><context:component-scan base-package
2022-05-02 16:53:47
107
原创 Spring配置数据源(连接池)
数据源(连接池)的作用数据源(连接池)是提高程序性能如出现的事先实例化数据源,初始化部分连接资源使用连接资源时从数据源中获取使用完毕后将连接资源归还给数据源常见的数据源(连接池):DBCP、C3P0、BoneCP、Druid等数据源配置开发的步骤① 导入数据源的坐标和数据库驱动坐标② 创建数据源对象③ 设置数据源的基本连接数据④ 使用数据源获取连接资源和归还连接资源数据源的手动配置① 在pom.xml文件中导入数据源坐标和数据库驱动坐标<!-- C3P0 连接池 --&g
2022-05-02 15:37:45
225
原创 Spring配置文件基本使用
文章目录配置文件Bean标签范围配置当scope的取值为singleton时当scope的取值为prototype时配置文件Bean标签范围配置scope:指对象的作用范围,取值如下:singleton:默认值,单例prototype:多例的request:WEB项目中,spring创建一个Bean的对象,将对象存入到 request 域中session:WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中global session:WEB 项目中
2022-03-29 17:07:44
146
原创 Spring简介与快速入门
Spring简介Spring是什么Spring是分层的Java SE/EE应用full-stack(全栈)轻量级开源框架,以IoC(Inverse Of Control:反转控制)和AOP(Aspect OrientedProgramming:面向切面编程)为内核。提供了展现层SpringMVC和持久层Spring JDBCTemplate以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐成为了使用最多的Java EE企业应用开源框架。Spring的优势方
2022-03-15 23:43:42
693
原创 java基础——反射
反射机制简述Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,我们形象的称之为:反射正常运行:导入所需要的包名(import—)——》通过new实例化——》取得实例
2022-03-06 11:24:43
335
原创 力扣算法——石子游戏VI
Alice 和 Bob 轮流玩一个游戏,Alice 先手。一堆石子里总共有 n 个石子,轮到某个玩家时,他可以 移出 一个石子并得到这个石子的价值。Alice 和 Bob 对石子价值有 不一样的的评判标准 。双方都知道对方的评判标准。给你两个长度为 n 的整数数组 aliceValues 和 bobValues 。aliceValues[i] 和 bobValues[i] 分别表示 Alice 和 Bob 认为第 i 个石子的价值。所有石子都被取完后,得分较高的人为胜者。如果两个玩家得分相同,那么为平
2022-02-18 10:27:40
2462
原创 jvm垃圾回收——分代回收
新生代与老年代弱分代假说(Weak Generational Hypothesis):绝大多数对象都是朝生夕灭的。(新生代)强分代假说(Strong Generational Hypothesis):熬过越多次垃圾收集过程的对象就越难以消亡。(老年代)新生代和老年代都是堆分配的内存,新生代分为伊甸园区(Eden)和幸存者区(Survivor)。分代垃圾回收当产生新对象时,会在伊甸园(Eden)产生,当伊甸园内存不够时,会进行一次Miner GC,先进行可达性分析标记可清除的垃圾,然后把需要的.
2022-02-17 20:08:48
836
1
原创 jvm垃圾回收算法——复制算法
复制算法先复制一块相同的区域TO,然后去标记FROM区域内的可清理的垃圾。然后把FROM区域的对象复制到TO区域,这样就不会产生内存碎片了然后交换FROM区域和TO区域缺点会占用双倍的内存空间,内存开销大优点没有内存碎片...
2022-02-15 16:42:25
372
原创 jvm垃圾回收算法——标记整理算法
标记整理算法标记整理法与标记清除法首先是一样的,先判断时候被GC Root引用,再进行标记,不同的是第二步,标记整理法对对象进行了整理,使内存更紧凑,从而没有产生内存碎片。优点没有内存碎片缺点速度较慢,因为牵扯到对象地址的移动...
2022-02-15 16:35:13
218
原创 jvm垃圾回收算法——标记清除算法
标记清除算法根据可达分析,先标记没有直接或者间接被GC Root引用的内存,然后进行“清除”,这里的清除是把被标记的起始和结束地址放到一个叫空闲地址列表里,就算是清除了,下次分配内存时会到这个列表里寻找合适的地址。优点速度快,只需要记录起始与结束的地址缺点清除后不会对内存空间进行整理,会造成内存不连续,产生内存碎片,就会导致如果新对象需要的空间太大则无法存入。如这图,空白位置合在一起是可以存入的。...
2022-02-15 16:28:49
259
原创 jvm垃圾回收——判断对象可以回收:引用
四种引用强引用是最传统的“引用”的定义,是指在程序代码之中普遍存在的引用赋值,即类“Objectobj=new Object()”这种引用关系。无论任何情况下,只要强引用关系还存在,垃圾收集器就永远不会回收掉被引用的对象。软引用是用来描述一些还有用,但非必须的对象。只被软引用关联着的对象,在系统将要发生内存溢出异常前,会把这些对象列进回收范围之中进行第二次回收,如果这次回收还没有足够的内存,才会抛出内存溢出异常。在JDK 1.2版之后提供了SoftReference类来实现软引用。·弱引用也是用来描
2022-02-13 17:09:06
158
原创 jvm垃圾回收——判断对象可以回收:可达分析
基本理解Java虚拟机中的垃圾回收器采用可达性分析来探索所有存活的对象扫描堆中的对象,看是否能够沿着GC Root对象为起点的引用链找到该对象,找不到表示可以回收GC Root对象固定可作为GC Roots的对象包括以下几种:在虚拟机栈(栈帧中的本地变量表)中引用的对象,譬如各个线程被调用的方法堆栈中使用到的参数、局部变量、临时变量等。在方法区中类静态属性引用的对象,譬如Java类的引用类型静态变量。在方法区中常量引用的对象,譬如字符串常量池(String Table)里的引用。在本
2022-02-13 17:00:34
302
原创 jvm垃圾回收——判断对象可以回收:引用计数
基本理解在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。内存泄露当A引用B时B引用加1,B引用A时,A引用加1;虽然没有其他来引用他们两个,但他们两个引用计数一直是1,所以不能被回收,造成泄露。...
2022-02-13 16:11:02
145
原创 jvm内存部分——方法区
方法区特点保存在着被加载过的每一个类的信息;这些信息由类加载器在加载类的时候,从类的源文件中抽取出来;static变量信息也保存在方法区中;可以看做是将类(Class)的元数据,保存在方法区里;方法区是线程共享的;当有多个线程都用到一个类的时候,而这个类还未被加载,则应该只有一个线程去加载类,让其他线程等待;方法区的大小不必是固定的,jvm可以根据应用的需要动态调整。jvm也可以允许用户和程序指定方法区的初始大小,最小和最大限制;方法区同样存在垃圾收集,因为通过用户定义的类加载
2022-02-13 14:43:33
360
原创 jvm内存部分——堆
基本概念Heap 堆通过new关键字,创建对象都会使用堆内存它是线程共享的,堆中对象都需要考虑线程安全的问题有垃圾回收机制GC堆的内存溢出当不断产生对象,且一直在使用,就会导致无法回收,造成内存溢出。public class HeapOOM { static class OOMObject { } public static void main(String[] args) { List<OOMObject> list = new Arr
2022-02-13 11:17:57
200
转载 jvm内存结构——本地方法栈
对于一个运行中的Java程序而言,它还可能会用到一些跟本地方法相关的数据区。当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界。本地方法可以通过本地方法接口来访问虚拟机的运行时数据区,但不止如此,它还可以做任何它想做的事情。本地方法本质上时依赖于实现的,虚拟机实现的设计者们可以自由地决定使用怎样的机制来让Java程序调用本地方法。任何本地方法接口都会使用某种本地方法栈。当线程调用Java方法时,虚拟机会创建一个新的栈帧并压入Java栈。然而当它调用的是本地方法时,虚拟机会保持J
2022-02-13 10:58:42
133
原创 jvm内存部分——栈的内存溢出
栈溢出的原因栈帧过多导致内存溢出栈帧过大导致内存溢出public class JvmStacks { static int count =0; public static void main(String[] args) { method1(); } public static void method1(){ count++; method1(); }}而栈帧过大不容易实现,可以试着去调整虚拟机栈分
2022-02-13 10:33:03
419
原创 jvm内存部分——虚拟机栈
目录栈的特点虚拟机栈与栈帧虚拟机栈定义相关问题辨析栈的特点栈(stack)是一种常用的数据结构,遵从先入后出的规则虚拟机栈与栈帧当线程运行调用方法时,会给方法划分一段栈帧空间,如方法1划分一个栈帧1,然后压入栈内进行运行,运行完后出栈并释放内存。当方法1中调用了方法2时,则会划分一个栈帧2的空间压入栈并运行,方法2运行完后返回值交给方法1,栈帧2出栈释放空间,然后运行方法1。虚拟机栈定义Java Virtual Machine Stacks ——Java虚拟机栈每个线程运行所需要的
2022-02-11 11:55:54
570
原创 jvm内存部分——程序计数器
定义Program Counter Register 程序计数器(寄存器)作用 二进制字节码 jvm指令 Java 源代码0: getstatic #20 // PrintStream out = System.out;3: astore_1 //--4: aload_1 // out.println(1);5: iconst_1 //--6: invokevirtual #26 // --9.
2022-02-10 10:48:56
345
原创 jvm基本定义
jvm的定义Java Virtual Machine——Java程序的运行环境(Java二进制字节码的运行环境)优点一次编写,到处运行(正是jvm屏蔽了字节码和底层操作系统的差异,对外提供了一个一致的运行环境,实现了Java的跨平台运行)自动内存管理机制,实现垃圾回收功能(可能在现在看来没有什么,但在当初和C++等比较,这种方便的多,降低了内存泄露的概率)数组下标越界检查多态(虚方法表来实现多态)jvm jre jdk比较jvm的模块代码文件先通过Java Class加载成字节码文
2022-02-10 10:13:01
105
原创 力扣算法学习(二十)
跳跃游戏 II给你一个非负整数数组 nums ,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。假设你总是可以到达数组的最后一个位置。输入: nums = [2,3,1,1,4]输出: 2解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。 public int jump(int[] nums) { //当nums为1时落地即为
2022-01-24 01:32:56
66
原创 力扣算法学习(十九)
跳跃游戏给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。输入:nums = [2,3,1,1,4]输出:true解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。可以先设立一个dp来取的你能到达的最大下标,如果大于数组最大下标则返回true public boolean canJump(int[] nums) { //当数组为长度1时,直接
2022-01-24 00:18:15
2513
原创 力扣算法学习(十八)
删除并获得点数给你一个整数数组 nums ,你可以对它进行一些操作。每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除 所有 等于 nums[i] - 1 和 nums[i] + 1 的元素。开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。示例 1:输入:nums = [3,4,2]输出:6解释:删除 4 获得 4 个点数,因此 3 也被删除。之后,删除 2 获得 2 个点数。总共获得 6 个点数。示例 2:输入:nums =
2022-01-23 23:10:09
277
原创 力扣算法学习(十七)
打家劫舍你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。示例 2:输入:[2,7
2022-01-21 18:16:12
128
原创 力扣算法学习(十六)
使用最小花费爬楼梯给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。请你计算并返回达到楼梯顶部的最低花费。示例1:输入:cost = [10,15,20]输出:15解释:你将从下标为 1 的台阶开始。支付 15 ,向上爬两个台阶,到达楼梯顶部。总花费为 15 。输入:cost = [1,100,1,1,1,100,1,1,100,1]
2022-01-17 20:48:17
98
原创 力扣算法学习(十五)
爬楼梯假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例 1:输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1 阶 + 1 阶2 阶根据题目可知除了前两个台阶之外都可以用前两个方法之和;比如第三个台阶,你可以选择从第一个台阶2阶爬上去,或者第二个台阶1阶上去,可能有人会问为什么不能从第一个台阶1阶1阶上去;因为,你得路过第二个台阶,就会和第二阶重复:上第一阶一个方法:1阶上
2022-01-17 19:39:15
306
原创 力扣算法学习(十四)
最小路径和给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例 1:输入:grid = [[1,3,1],[1,5,1],[4,2,1]]输出:7解释:因为路径 1→3→1→1→1 的总和最小。我先是使用的递归,在25个例子卡住了,原因超时,后来在自己的编译器上测试25例子时是可以出来的public class Solution { public static void mai
2022-01-17 18:59:49
4107
原创 力扣算法学习(十三)
第 N 个泰波那契数泰波那契序列 Tn 定义如下:T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2给你整数 n,请返回第 n 个泰波那契数 Tn 的值。由题可知,当n<3时返回值已经给出了,而后来的数可以依次加法得到,若是要得到n只需要加n-3次;class Solution { public int tribonacci(int n) { if(n<3){
2022-01-16 23:44:00
4072
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人