自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 @Transactional使用中的三类坑

我们知道事务有声明式事务和编程式事务两种,编程式事务代码侵入较高,声明式事务侵入较低,在项目中常有使用,然而,不正确的使用声明式事务,可能让代码未能按照我们的预期执行。

2024-04-15 17:31:16 632 1

原创 使用Spring AOP实现对外接口的日志自动打印

相信我们都有过这样的经历,在提供第三方对外接口时,为了防止推诿扯皮,我们会在自己接口被调用时日志打印一下第三方的调用参数,再在业务逻辑结束返回时再打印一下给第三方的返回参数,这样在后续遇到bug时,能用日志方便排(shuai)查(guo)\

2024-02-07 17:02:23 600 3

原创 Java使用ClassLoader读取外部json文件

我们有时候会遇到这样一种业务场景:某个对象是变化的,在不同项目的部署中,可能需要更改对象中的某个属性,这时如果我们将该对象写在代码里,这样不仅寻找不便,部署后也不能随便修改(修改后又要重新打包),这就需要将该对象解耦,单独抽离出来,做成一个json文件,放在resource中,这样即使项目上线后,我们也能随时改变,只需要重启即可。我们将该对象写成json格式,放在resources下的outside包中,内部是标准的json格式文件(略)。

2023-07-06 20:11:31 450

原创 阻塞队列ArrayBlockingQueue,LinkedBlockingQueue源码剖析

下一步,我们考虑阻塞的实现,队列存在两种等待条件,一种是队列空时,出队需要等待,一种是队列满时,入队需要等待,synchronized只有一个等待条件,不符合要求,因此使用ReentrantLock。这是由于使用了两把锁,若入队阻塞线程都由出队线程唤醒,那么,出队线程在出队后,又要去获得入队锁唤醒线程,那么这两把锁就相当于还是一把,因为每次操作都要同时获得两把锁。可以发现,链表结构的入队与数组结构的入队大不相同,首先,链表入队使用的是入队锁,其次,入队阻塞线程不完全由出队线程唤醒,而是可以由入队线程唤醒。

2022-09-14 14:25:32 359 1

原创 从JVM角度理解Java并发(下)

本文内容主要参考黑马JUC并发编程,《Java并发编程的艺术》,所有代码可在github我的主页下载。在第二章我们学习了锁的相关知识,认识到了Moniter,实际上,正是它保证了临界区代码的原子性(即使线程切换,它也能占据临界区的锁,不会被干扰),JMM主要体现在以下三个方面,本章我们继续介绍后续的可见性和有序性。前面学习的synchronized能有效实现原子性,可见性,以及能从逻辑上实现有序性(毕竟代码块内相当于单线程,即使无序也不会出现线程干扰),但synchronized始终是锁,有没有更轻量的方式

2022-08-10 11:43:31 281

原创 从JVM角度理解Java并发(上)

本文内容主要参考黑马JUC并发编程,《Java并发编程的艺术》,所有代码可在github我的主页下载。我们知道,操作系统把线程分为了初始、可运行、运行、终止、阻塞五种状态。在Java中,把线程分为新建、可运行、阻塞、等待、限时等待、终止六种状态,其中可运行又可分为就绪和运行两种状态,如下图所示,后续将围绕线程状态的转化介绍各种线程操作方法。有三种常见创建线程的方式,一种是重写run方法(继承),另外两种均采用接口(组合)。我们先来看看采用重写的方式:线程start以后,会自动调用线程的run方法执行

2022-07-09 16:50:50 302

原创 PyTorch学习笔记

pythorch初学

2022-06-15 02:18:10 330

原创 以实战深入理解IOC与AOP思想

文章目录一、 ioc1.ioc思想2.使用配置文件实现ioc一、 ioc1.ioc思想将对象的创建交由Spring框架进行管理,这种将传统对象的创建流程变为框架创建和管理的思想,叫做控制反转。原本创建对象的方式,是通过new由程序控制的。写一个userDao接口,用于去数据库查询用户信息public interface UserDao { void getUser();}由于项目数据库不一样,所以实现类有所区别,假设有SQL和MongoDB的实现(MongoDB略)。public

2022-05-26 15:27:36 442

原创 git学习笔记

文章目录一,git安装二,基础命令1.获取git仓库一,git安装二,基础命令1.获取git仓库有两种方法可以获取仓库:本地目录转git仓库 和 其他服务器克隆一个git仓库先来看看本地怎么创建仓库:首先进入到需要版本管理的文件夹,使用cmd命令git init该命令会初始化一个.git的子目录看看怎么从其他服务器克隆一个git仓库...

2022-05-18 00:49:24 544

原创 计算机网络基础

文章目录1.网络分层2.三次握手3.TCP与UDP的区别4.输入一个url之后发生了什么1.解析网址2. 向DNS服务器查询Web服务器的IP地址1.网络分层2.三次握手SYN:携带这个标志的包正在发起连接请求FIN:携带这个标志的包正在请求终止连接3.TCP与UDP的区别TCP基于连接,UDP不需要连接4.输入一个url之后发生了什么1.解析网址url中包含了协议、服务器名、访问的路径(URI)等。需要根据这些信息生成HTTP请求消息,包括请求行(包含方法get post, U

2021-12-09 09:37:22 1974

原创 mysql实战45讲-基础篇

文章目录1.一条查询语句是如何执行的2.一条更新语句是如何执行的1.一条查询语句是如何执行的mysql> select * from T where ID=10;上面这条语句是怎么执行的?先来看看mysql逻辑架构图,MySQL可以分为Server层和存储引擎层。执行过程:1.连接器连接连接器负责跟客户端建立连接、获取权限、维持和管理连接。连接命令通常是这样写的:mysql -h$ip -P$port -u$user -p输完命令后,需要在交互对话里输入密码。注:ip和por

2021-11-24 17:34:16 2164

原创 java面试-基础部分

文章目录1.面向对象2.JDK,JRE,JVM区别和联系3.==和equals1.面向对象什么是面向对象?与面向过程有什么不同?面向过程更注重事情的每一个步骤及顺序,面向对象更注重事情有哪些参与者(对象),及各自需要做什么。封装: 明确标识出允许外部使用的所有成员函数和数据项,内部细节对外部调用透明继承: 继承基类的方法,做出自己的改变或拓展多态: 基于对象所属类的不同,外部对同一个方法的调用,实际执行的逻辑不同。继承,方法重写,父类引用指向子类对象2.JDK,JRE,JVM区别和联系

2021-11-10 15:01:25 1142

原创 java面试-虚拟机部分

文章目录1.什么是字节码?使用字节码的好处是什么?2.java类加载器有哪些3.双亲委派模型4.GC如何判断对象可以被回收1.什么是字节码?使用字节码的好处是什么?java中的编译器和解释器:java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器。这台机器在任何平台都提供给编译程序一个共同的接口。编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在java中,这种供虚拟机理解的代码叫做字节码(.class文件),它不面向

2021-11-10 14:58:21 1066

原创 docker教程

文章目录一、安装docker二、拉取redis三、配置文件更改四、远程连接一、安装docker1.安装yum-utils包yum install -y yum-utils2.docker阿里镜像源sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo3.安装dockeryum install docker-ce docker-ce-cli conta

2021-10-15 16:05:57 315

原创 使用conda配置tensorflow环境

目录前置条件:操作步骤:1.创建虚拟环境2.激活虚拟环境3.安装tensorflow4.配置pycharm前置条件:python, anaconda操作步骤:1.创建虚拟环境conda create -n tenserflow可以看到Anaconda3/envs下多了一个文件夹2.激活虚拟环境conda activate env_name# 当然,关闭虚拟环境的操作为conda deactivate3.安装tensorflowconda install tensorflow

2021-09-22 20:04:40 4184

原创 maven超详细入门,从下载到配合新版idea使用

文章目录1.maven下载与配置2.依赖与插件3.maven操作命令4.自定义骨架5.依赖传递与统一聚合管理1.maven下载与配置环境搭建、更改maven配置源、配置本地仓库、idea全局配置maven2.依赖与插件在哪里寻找依赖、插件、怎样使用插件(以tomcat为例)3.maven操作命令clean compile pakage4.自定义骨架5.依赖传递与统一聚合管理...

2021-06-24 00:00:21 307 1

原创 力扣102_二叉树的层次遍历

题目描述:给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。算法思想:看到层次遍历,立马想到了队列,想到了层次遍历框架void bfs(TreeNode root) { LinkedList<TreeNode> queue = new LinkedList<>(); queue.add(root); while (!queue.isEmpty()) { TreeNode p= queue.re

2021-06-21 18:46:36 144 1

原创 Linux02-VirtualBox下Unbuntu系统的安装

文章目录1.创建虚拟机2.ubuntu系统安装1.创建虚拟机安装Oracle VM VirtualBox,选择针对自己当前系统的包。下载Ubuntu ISO镜像文件,这里我们使用的版本是20.04。打开VirtualBox,新建一个虚拟电脑,选择操作系统的类型和版本。给虚拟机分配内存,一般建议大于或等于1024,但是后期可调,不用一开始纠结。现在创建虚拟硬盘。选择VDI。勾取动态分配。选择虚拟机存放的位置和虚拟机能用到的极限大小,注意,这里的极限大小不是说一开始就分给虚拟机,而

2021-06-16 11:51:18 145

原创 力扣1373_二叉搜索子树的最大键值和

题目描述:给你一棵以 root 为根的 二叉树 ,请你返回 任意 二叉搜索子树的最大键值和。二叉搜索树的定义如下:任意节点的左子树中的键值都 小于 此节点的键值。任意节点的右子树中的键值都 大于 此节点的键值。任意节点的左子树和右子树都是二叉搜索树。示例:算法思想:首先,二叉树题目核心–明确当前节点要做什么!假如此时站在“1”这个节点,首先要判断它是不是一棵BST,如果它不是BST,直接就不用考虑计算键值和的事情了。怎么知道它是不是BST呢?先看它的两个孩子是不是BST,如果有

2021-06-15 14:41:43 222 2

原创 Linux01-什么是Linux?

文章目录1.诞生背景2.系统特点3.与windows的区别参考博客Linux,全称为GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,我们常说的Linux,指的是Linux内核,一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。1.诞生背景一切都得从UNIX开始说起,1990 年,UNIX 在服务器市场上尤其是大学校园中成为主流操作系统,许多校园都有 UNIX 主机,当然还包括一些研究它的计算机系的学生。这些学生都渴望能在自己的电脑上运行 UNIX 。不幸的是,UNI

2021-06-14 22:41:53 164 2

原创 力扣95_不同的二叉搜索树II

题目描述:给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。算法思想:此题和力扣96题的思想一样,都可以运用穷举的方法快速解题,同样的,我们确定一个递归函数public List<TreeNode> buildBST(int lo, int hi){};递归函数buildBST实现构造区间[lo, hi]内所有符合定义的BST。我们从根节点开始,穷举所有根节点的可能,并且递归的得到左右子树的B

2021-06-04 15:12:04 164 3

原创 力扣96_不同的二叉搜索树

题目描述:给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。算法思想:该题属于穷举类型,也就是找到所有符合BST的情况。假如n=3,首先从根节点出发,根节点有三种不同的可能,分别是1,2,3。我们现在以1为例,它的左边只有一种可能,那就是null,它的右边有两种可能,分别是2,null,3和3,2,null,我们把左右的可能性组合(相乘)在一起,就得到了1为根时有几个BST了。根为其他时计算方法也一样。在这里,左

2021-06-01 16:12:37 132

原创 力扣98_验证二叉搜索树

题目描述:给定一个二叉树,判断其是否是一个有效的二叉搜索树。示例:算法思想:一看,这道题似乎非常容易,提手就能写以下代码public boolean isValidBST(TreeNode root) { if(root == null) return true; if(root.left != null && root.left.val > root.val) return false; if(root.right != null && ro

2021-05-25 21:48:04 152

原创 力扣450_删除二叉搜索树中的节点

题目描述:给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一般来说,删除节点可分为两个步骤:首先找到需要删除的节点;如果找到了,删除它。示例:算法思想:根据递归的思想,我们很容易写出如下代码TreeNode deleteNode(TreeNode root, int key) { if (root.val == key) { // 找到啦,进行删

2021-05-25 21:18:50 139

原创 力扣538_二叉搜索树转换为累加树*

题目描述:给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。算法思想:一拿到题目,我们先思考用二叉树的什么遍历方式,首先好像很容易看出,一个节点的累加值似乎等于它的右子树累加值加上它本身,但是仔细观察不然,比如5那个节点,它的累加值就是它的父节点加上它的本身,我们又没有父节点的指针,所以似乎不可行。二叉搜索树的特性不免让我们想到中序遍历,如果这棵树用中序遍历会从小

2021-05-20 20:07:00 137

原创 力扣230_二叉搜索树中第k小的元素

题目描述:给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。示例:算法思想:借助二叉搜索树得天独厚的优势–典型的中序遍历思想我们知道中序遍历可以从小到大的打印二叉搜索树traverse(root.left);print(root.val);traverse(root.right);借助这样的思想,我们可以用一个rank变量做排名,和打印一样,从小到大,当排到k时,返回输出即可。代码实现:class Soluti

2021-05-19 17:04:10 187

原创 Linux(Ubuntu)环境下构建JDK12编译环境(超详细!)

文章目录一、前期准备1.安装OpenJDK122.下载前置工具3.下载编译jdk12的jdk11二、进行编译1.编译前配置2.开始编译三、使用自己编译的JDK1.进行全局配置2.验证是否生效注意:编译jdk很吃配置!!!所以一定要把虚拟机配置调高进行,我的虚拟机运行内存是8G,分配空间50G(后序编译文件占20G左右)一、前期准备1.安装OpenJDK12官网地址:https://hg.openjdk.java.net/jdk/jdk12/点击左侧栏browse,下载zip文件解压到文件夹准

2021-05-19 15:56:48 1004 1

原创 力扣652_寻找重复的子树

题目描述:给定一棵二叉树,返回所有重复的子树。对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。两棵树重复是指它们具有相同的结构以及相同的结点值。需要以列表的形式返回上述重复子树的根结点。算法思想:所有的二叉树问题,都逃不过那三个遍历,首先思考我们的问题属于三者中的哪一种。首先,对于某一个节点,它应该做什么?假如我现在站在这个2节点上,想知道以自己为根的子树是不是重复的,该不该加入重复列表中。那么我要知道两个问题:以我为根的子树长啥样其他节点为根的子树长啥样怎么知道自

2021-05-18 23:12:17 187 3

原创 力扣105_从前序与中序遍历序列构造二叉树

题目描述:根据一棵树的前序遍历与中序遍历构造二叉树。(假设树中没有重复元素)例如,给出前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树:算法思想:前序遍历是“根左右”,中序遍历是“左根右”,我们先举例看一下内部关系m代表根节点,l代表根节点的左子树,r代表根节点的右子树。不难发现,根节点的左子树和根节点的右子树它们分别又是同样的处理流程,也就是说,可以使用同样的函数递归处理。先给出代码:public

2021-05-14 11:41:40 192

原创 力扣654_最大二叉树

题目描述:给定一个不含重复元素的整数数组 nums 。一个以此数组直接递归构建的 最大二叉树 定义如下:1.二叉树的根是数组 nums 中的最大元素。2.左子树是通过数组中 最大值左边部分 递归构造出的最大二叉树。3.右子树是通过数组中 最大值右边部分 递归构造出的最大二叉树。返回有给定数组 nums 构建的 最大二叉树 。示例:输入nums = [3,2,1,6,0,5] 返回如下图所示的树算法思想:题目已经明确给出了思路–运用递归,对于构造二叉树的问题,根节点要做的就是把想办法把自己构

2021-05-11 21:34:45 154

原创 力扣114_二叉树展开为链表

题目描述:给你二叉树的根结点 root ,请你将它展开为一个单链表:展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。算法思想:这道题的函数是 void flatten(TreeNode root) ,我们尝试给出函数定义:给 flatten 函数输入一个节点 root,那么以 root 为根的二叉树就会被拉平为一条链表。具体流程如下:将 root 的左子树和右子树拉平

2021-05-07 20:00:00 175

原创 力扣116_填充每个节点的下一个右侧节点指针

题目描述:给定一个 完全二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:struct Node { int val; Node *left; Node *right; Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置为 NULL。示例:算法思想:有了前面翻转二叉树的经验,这里我们很容易通过观察发现,可以

2021-04-27 17:53:07 175

原创 力扣226_翻转二叉树

题目描述:翻转一棵二叉树。示例:输入:输出:算法思想:一看到树的算法问题,就应该立马从树的遍历框架入手/* 二叉树遍历框架 */void traverse(TreeNode root) { // 前序遍历 traverse(root.left) // 中序遍历 traverse(root.right) // 后序遍历}我们需要先搞清楚当前 root 节点该做什么,然后根据函数定义递归(选择前序、中序还是后序)调用子节点。对于这道题,我们可以

2021-04-27 17:30:34 144

原创 力扣234_回文链表

题目描述:请判断一个链表是否为回文链表。示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true算法思想:方法一:双指针法我们知道,判断一个数组的回文是非常简单的,只需要一头一尾两个指针,边走边检查即可,但是链表怎么办呢?直接暴力,把链表存入数组,用数组的方法判断。class Solution { public boolean isPalindrome(ListNode head) { //辅助数组部

2021-04-22 14:58:26 176

原创 力扣25_K个一组翻转链表

题目描述:给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。示例:算法思想:方法一:递归就按示例这样,对链表调用reverseKGroup(head, 2),即以2个节点为一组反转链表,假设前两个节点已经反转,如图所示后面的这些节点也是一条链表,而且规模(长度)比原来这条链表小,这就叫子问题。我们可以直接递归调用reverseKGroup(head, 2),

2021-04-19 23:03:28 205

原创 教师资格证报名网页打不开,解决新版IE浏览器无法打开教师资格证页面问题(不需要添加兼容性站点!)

新版IE浏览器报考教资会出现以下的问题这里让大家添加兼容性站点,但是根本找不到兼容性站点的添加位置其实有一种方法可以不用添加第一步:打开“设置”里面的“默认浏览器”,将下图的图标点亮,重启浏览器第二步:回到刚才的站点,在更多工具里面选择“在IE模式下重新加载”第三步:关闭页面 重新加载即可...

2021-04-14 15:27:56 38428 13

原创 力扣92_反转链表II

题目描述:给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回反转后的链表 。示例:算法思想:在上一篇文章 反转链表I 中,我们学会了反转一个完整的链表,在做本题之前,先思考一个容易一点的问题,如何反转一个链表的前N个节点?如图所示:有没有发现与上一篇文章的区别,就在1这个节点上,上一篇文章是把这个节点指向了null,而这里是把1这个节点指向了4,也就是说,如果我们像上一篇

2021-04-09 14:24:43 151

原创 力扣503_下一个更大元素II

题目描述给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。示例:输入: [1,2,1]输出: [2,-1,2]解释: 第一个 1 的下一个更大的数是 2;数字 2 找不到下一个更大的数;第二个 1 的下一个最大的数需要循环搜索,结果也是 2。算法思想和力扣496类似,同样运用到单调栈,这道题的难点在

2021-03-29 21:48:37 109

原创 力扣496_下一个更大元素I

题目描述:给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。输入: nums1 = [4,1,2], nums2 = [1,3,4,2].输出: [-1,3,-1]解释:对于 num1 中的数字 4 ,你无法在第二个数组中找到下一个更大的数字,因此输出 -1 。对于 num1 中的数字 1 ,第二个数组中数字1右边的下一个较大数字是 3 。对于 num1 中的数字 2 ,

2021-03-25 15:14:56 155

原创 【实践】以wireShark分析与QQ软件的三次握手

wireShark抓取的TCP页面如下:三次握手以及后续文件传输如下图所示:

2021-03-24 18:16:55 123

空空如也

空空如也

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

TA关注的人

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