学习笔记
文章平均质量分 73
可持续化发展
勤学如春起之苗,不见其增,日有所长;辍学如磨刀之石,不见其损,日有所亏。
展开
-
日常小记,待转语雀
记录日常遇见的链接笔记原创 2022-06-24 17:15:24 · 260 阅读 · 0 评论 -
java函数式编程
reduce 阶段的重构还差一小步就差不多结束了。我们要在最后调用toString 方法,将整个步骤串成一个方法链。这很简单,只需要排列好reduce 代码,准备好将其转换为Collector API 就行了(如例5-23 所示)。例5-23 使用reduce 操作,将工作代理给StringCombiner 对象String result = artists.stream() .map(Artist::getName) .reduce(new...原创 2022-05-26 15:41:08 · 261 阅读 · 0 评论 -
《Java 8函数式编程》读书笔记
Lambda 表达式Lambda表达式样例例2-3 编写Lambda 表达式的不同形式Runnable noArguments = () -> System.out.println("Hello World");ActionListener oneArgument = event -> System.out.println("button clicked");Runnable multiStatement = () -> { System.ou...原创 2022-05-26 14:55:47 · 324 阅读 · 0 评论 -
本人亲自整理的极客时间设计模式之美下部的硬核笔记(残缺版)最近加班太多,搞不了太多,只能尽量了xd们
设计模式之美(下)这位猿,三连,再走吧!以下内容是为了让搜索引擎,检测到这篇文章。要阅读体验,请点击上面的连接“点击我”,去我的语雀看。对了,我看到语雀那里有投诉的功能,请读者不要去点。程序员不要为难程序员。你去点了,就再也无法看到我的笔记了。创造型设计模式创建型模式主要解决对象的创建问题,封装复杂的创建过程,解耦对象的创建代码和使用代码。其中,单例模式用来创建全局唯一的对象。工厂模式用来创建不同但是相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象。原创 2022-03-30 22:43:56 · 1321 阅读 · 2 评论 -
上传文件的漏洞复现与修复
本文只说一些我遇到过的上传文件的漏洞。工具:我装了kali,使用 burpsuite;Linux环境下的VirtualBox要配一下,burpsuite的 proxy-->options自己去哔哩哔哩找一下资料了解一下burpsuite的使用。漏洞一:直接上传jsp、php、jspx、exe等这种在黑名单的文件。上传成功后,可以使用冰蝎等webshell工具去getshell...原创 2021-10-21 20:18:23 · 6925 阅读 · 0 评论 -
记录一位博客园的大佬;Java 枚举类的用法
Java枚举类型的用法https://www.cnblogs.com/qlqwjy/p/9065264.html转载 2021-10-20 19:44:49 · 110 阅读 · 0 评论 -
本人亲自整理的极客时间设计模式之美的硬核笔记
由于笔记内容过多,我把它放到语雀上了。点击我原创 2021-10-20 14:08:55 · 4026 阅读 · 2 评论 -
File 与 MultipartFile 相互转换;计算文件夹的最深层数;递归删除某个文件夹;File对象转为InputStream
MultipartFile对象 转换为 File 对象/** * @Author: zcm * @DateTime: 2021/10/12 下午3:15 * @Params: [org.springframework.web.multipart.MultipartFile] * @Return java.io.File * @Description: 将 MultipartFile对象 转换为 File 对象 */ public ..原创 2021-10-13 10:45:30 · 440 阅读 · 0 评论 -
Cause: java.sql.SQLException: Unknown initial character set index ‘255‘ received from server.
org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: java.sql.SQLException: Unknown initial character set index '255' received from server. Initial client character set can be forced via the 'characterEncoding' property.原创 2021-09-14 10:47:50 · 791 阅读 · 0 评论 -
原型模式,浅拷贝,深拷贝
原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。在 Java 中,Object 的 clone() 方法就属于原型模式,不妨简单的理解为:原型模式就是用来克隆对象的。Java 的赋值只是引用传递,而不是值传递。这样赋值之后,yourMilkTea 仍然指向的周杰伦的奶茶,并不会多一份一样的奶茶。Java 中有一个语法糖,让我们并不需要手写 clone 方法。这个语法糖就是 Cloneable 接口,我们只要让需要拷贝的类实现此接口即可。值得注意的是,Java 自带.原创 2021-09-02 08:07:26 · 117 阅读 · 0 评论 -
Condition条件队列核心源码分析,AQS的独占模式的应用
注:图片作者为小刘老师。哔哩哔哩搜索:小刘讲源码。/**AQS的内部类Node 主要关注这几个属性*/static final class Node { static final int CONDITION = -2; volatile int waitStatus; volatile Thread thread; Node nextWaiter;}public class ReentrantLock implements Lock, java.io.S.原创 2021-09-01 09:05:03 · 289 阅读 · 0 评论 -
ReentrantLock核心源码分析,AQS独占模式,可重入锁
看前须知 由于笔记比较多,看的时候,建议把代码copy到VS code 或者IDEA 中查看(为了可以点击方法进行跳转,方便阅读)。主要看方法上面的注释。本篇文章的图片来源于小刘老师的源码培训班。哔哩哔哩搜素:小刘讲源码。本篇文章仅用于作者本人复习源码知识点。我的笔记public class ReentrantLock implements Lock, java.io.Serializable { //默认使用非公平锁 public ReentrantLock()...原创 2021-08-27 17:32:01 · 177 阅读 · 0 评论 -
MySQL笔记(二)SQL经典实例(上)
小明写这篇文章的目的是为了记录阅读《SQL经典实例》(安东尼-莫利纳罗著,刘春辉译)中的收获。这本书里面有MySQL、Oracle、Postgresql的语法实例。但本人目前用的是MySQL,所以,只摘录了MySQL的相关内容。我的文章只会收录我觉得有用的东西。对于一些特别基础的知识点和百度能解决的工具类知识点,我会略过或简单提一下。由于篇幅太长了,分为上下两部。表的结构和数据检索记录1、实际开发中,不推荐select *,为了可读性,请指明se.原创 2021-06-01 10:35:31 · 489 阅读 · 0 评论 -
MySQL笔记(三)SQL经典实例(下)
元数据查询原创 2021-06-04 18:10:29 · 398 阅读 · 2 评论 -
MySQL笔记(一)基础篇
小铭今天来到了湖北省图书馆,决定系统地补一下MySQL。写这篇文章是为了记录一下,看书过程中的收获。MySQL从入门到精通原创 2021-05-28 09:41:28 · 804 阅读 · 2 评论 -
ThreadPoolExecutor核心源码分析
看前须知关于线程回收的情况:在线程池running状态下, 非核心线程,在指定的空闲时间内,如果获取不到任务,就会被回收,走退出逻辑。 核心线程,如果 allowCoreThreadTimeOut = true,在空闲时间keepAliveTime内,获取不到任务,也会被回收。 核心线程,如果allowCoreThreadTimeOut = false,即使空闲,也不会回收。 如果调用了shutdown()方法,会中断所有空闲线程,去回收它们。如果调用了shu.原创 2021-08-20 22:33:59 · 473 阅读 · 0 评论 -
数据结构--堆
目录堆的定义堆的分类堆的插入堆的删除用数组来表示完全二叉树创建堆插入元素获取堆顶元素删除元素获取堆的长度最小堆最大堆堆排序堆的定义堆是一种特别的二叉树,满足以下条件的二叉树,可以称之为堆:完全二叉树; 每一个节点的值都必须大于等于或者小于等于其孩子节点的值。堆 具有以下的特点:可以在 O(logN) 的时间复杂度内向 堆 中插入元素;可以在 O(logN) 的时间复杂度内向 堆 中删除元素;可以在 O(1)的...转载 2021-08-18 09:33:20 · 327 阅读 · 0 评论 -
FutureTask核心源码分析
看前须知public interface Executor { void execute(Runnable command);}public interface RunnableFuture<V> extends Runnable, Future<V> { /** * Sets this Future to the result of its computation * unless it has been cancelled.原创 2021-08-17 18:20:40 · 217 阅读 · 0 评论 -
ConcurrentHashMap核心源码分析(二)
ConcurrentHashMap的TreeBinstatic final class TreeBin<K,V> extends Node<K,V> { /**TreeBin逻辑上引用了双向链表和红黑树,但物理上这两个结构里面的节点对象是同一个对象 */ //指向红黑树 根节点 TreeNode<K,V> root; //指向双向链表的头节点 volatile TreeNode<原创 2021-08-12 15:42:30 · 217 阅读 · 0 评论 -
ConcurrentHashmap核心源码分析(一)
以下内容为本人学习小刘老师的源码课程后(哔哩哔哩搜索,小刘讲源码),自己整理的笔记。仅供自己学习之用。这里写目录标题一级目录二级目录常量Constants成员属性Fields静态代码块内部类NodeTreeNodeForwardingNode内部小方法源码分析static final int spread(int h)Node一级目录二级目录 concurrenthashmap的扩容,数据迁移的动作是从下往上走的(以数组来看)。这样的好处是为了避免和迭代操作发生冲突。比如说,我在迭代访问conc原创 2021-08-10 20:44:18 · 559 阅读 · 0 评论 -
LongAdder核心源码分析
LongAdder是在高并发下实现高性能统计的一个类。以前使用AtomicLong来在高并发下统计一些数据。但AtomicLong在高并发的情景下性能会越来越差。因为它是通过CAS的方式去操作的,而且只有一个变量去记录累计值。同一轮只有一个线程能竞争成功,抢到锁,把数据修改成功。有很多线程都会CAS失败,然后去自旋了。所以就有了替代方案,LongAdder。大概的逻辑LongAdder的设计:当写base没有竞争时,线程就将数据写在base里面。当线程在写base发生竞争了,用CAS的方式修改b.原创 2021-08-07 18:12:29 · 214 阅读 · 0 评论 -
红黑树笔记
笔记转载 2021-08-07 09:07:46 · 75 阅读 · 0 评论 -
深度优先搜索
深度优先遍历 只要前面有可以走的路,就会一直向前走,直到无路可走才会回头;「无路可走」有两种情况:① 遇到了墙;② 遇到了已经走过的路;在「无路可走」的时候,沿着原路返回,直到回到了还有未走过的路的路口,尝试继续走没有走过的路径;有一些路径没有走到,这是因为找到了出口,程序就停止了;「深度优先遍历」也叫「深度优先搜索」,遍历是行为的描述,搜索是目的(用途);通过遍历 所有 的可能的情况达到搜索的目的。遍历是手段,搜索是目的。二叉树深度优先遍历的递归终止条件:遍历完一棵树的 所有 叶子结点,等.原创 2021-08-07 09:02:18 · 184 阅读 · 0 评论 -
i++ 和 ++i
i++:先用i,再给i+1。++i:先给i+1,再用i。public static void main(String[] args) { int i = 1; if(i++ ==1) { System.out.println("先比较再++"); }else { System.out.println("先++再比较"); } } //先比较再++public static void m原创 2021-07-30 11:29:17 · 172 阅读 · 0 评论 -
计算机网络突击面试(持续更新中)
第一部分:协议层次以及它们的服务类型OSI 七层模型OSI 模型全称为开放式通信系统互连参考模型① 应用层应用层位于 OSI 参考模型的第七层,其作用是通过应用程序间的交互来完成特定的网络应用。该层协议定义了应用进程之间的交互规则,通过不同的应用层协议为不同的网络应用提供服务。例如域名系统 DNS,支持万维网应用的 HTTP 协议,电子邮件系统采用的 SMTP 协议等。在应用层交互的数据单元我们称之为报文。② 表示层表示层的作用是使通信的应用程序能够解释交换数据的含义,其位于 .原创 2021-08-06 19:48:51 · 500 阅读 · 0 评论 -
快速排序算法(LeetCode版)
快速排序递归框架public static void quickSort(int[] arr) { quickSort(arr, 0, arr.length - 1);}public static void quickSort(int[] arr, int start, int end) { // 将数组分区,并获得中间值的下标 int middle = partition(arr, start, end); // 对左边区域快速排序 quickSort(a..原创 2021-08-06 16:51:05 · 990 阅读 · 0 评论 -
堆排序算法
数组、链表都是一维的数据结构,相对来说比较容易理解,而堆是二维的数据结构,对抽象思维的要求更高。但堆又是数据结构进阶必经的一步。堆:符合以下两个条件之一的完全二叉树:根节点的值 ≥ 子节点的值,这样的堆被称之为最大堆,或大顶堆;根节点的值 ≤ 子节点的值,这样的堆被称之为最小堆,或小顶堆。堆排序过程如下:用数列构建出一个大顶堆,取出堆顶的数字;调整剩余的数字,构建出新的大顶堆,再次取出堆顶的数字;循环往复,完成整个排序。整体的思路就是这么简单,我们需要解决的问题有两个:如何用数原创 2021-08-06 16:23:39 · 381 阅读 · 0 评论 -
希尔排序算法
希尔排序和冒泡、选择、插入等排序算法一样,逐渐被快速排序所淘汰,但作为承上启下的算法,不可否认的是,希尔排序身上始终闪耀着算法之美。希尔排序本质上是对插入排序的一种优化,它利用了插入排序的简单,又克服了插入排序每次只交换相邻两个元素的缺点。它的基本思想是:将待排序数组按照一定的间隔分为多个子数组,每组分别进行插入排序。这里按照间隔分组指的不是取连续的一段数组,而是每跳跃一定间隔取一个值组成一组逐渐缩小间隔进行下一轮排序最后一轮时,取间隔为 11,也就相当于直接使用插入排序。但这时经过前面的「宏观调原创 2021-08-06 16:05:27 · 175 阅读 · 0 评论 -
插入排序算法
插入排序的思想非常简单,生活中有一个很常见的场景:在打扑克牌时,我们一边抓牌一边给扑克牌排序,每次摸一张牌,就将它插入手上已有的牌中合适的位置,逐渐完成整个排序。插入排序有两种写法:交换法:在新数字插入过程中,不断与前面的数字交换,直到找到自己合适的位置。移动法:在新数字插入过程中,与前面的数字不断比较,前面的数字不断向后挪出位置,当新数字找到自己的位置后,插入一次即可。交换法插入排序public static void insertSort(int[] arr) { // 从第二个数原创 2021-08-06 15:55:38 · 115 阅读 · 0 评论 -
选择排序算法
选择排序的思想是:双重循环遍历数组,每经过一轮比较,找到最小元素的下标,将其交换至首位。public static void selectionSort(int[] arr) { int minIndex; for (int i = 0; i < arr.length - 1; i++) { minIndex = i; for (int j = i + 1; j < arr.length; j++) { if (arr[m原创 2021-08-05 21:16:31 · 160 阅读 · 0 评论 -
冒泡排序算法
冒泡排序有三种写法:一边比较一边向后两两交换,将最大值 / 最小值冒泡到最后一位;经过优化的写法:使用一个变量记录当前轮次的比较是否发生过交换,如果没有发生交换表示已经有序,不再继续排序;进一步优化的写法:除了使用变量记录当前轮次是否发生交换外,再使用一个变量记录上次发生交换的位置,下一轮排序时到达上次交换的位置就停止比较。import java.util.*;public class Main { public static void main(String[] args)原创 2021-08-05 08:47:12 · 121 阅读 · 0 评论 -
HashMap核心源码分析
基本原理补充笔记:笔记1笔记2补充笔记(1)数组和链表对比,内存布局,查找性能,内存大小,扩容灵活度,插入/删除节点,(2)散列表整合两种数据结构的优势,既可以用索引,动态扩容方便。 为什么要引入红黑树?为了解决链化过长的问题,提高查找效率。hashmap的扩容原理为什么要扩容?长度为16的时候,由于存放的元素过多,get方法的效率就降低了。扩容后,以空间换时间,提高了查找的效率。如果插入的数据很多的话,散列表就退化成线性查询了。扩容后,桶位就更多了。源码分析重要原创 2021-07-30 13:56:37 · 228 阅读 · 0 评论 -
Java 自动装箱和拆箱(待整理)
含义装箱就是 自动将基本数据类型转换为包装器类型;拆箱就是 自动将包装器类型转换为基本数据类型。Integer i =10; //装箱int n = i; //拆箱public class Main { public static void main(String[] args) { Integer i =10; int n = i; }}从反编译得到的字节码内容可以看出,在装箱的时候自动调用的是Integer的v原创 2021-07-28 17:53:16 · 106 阅读 · 0 评论 -
学习笔记之kettle基础
kettle简介ETL简介ETL(Extract-Transform-Load的缩写,即数据抽取、转换、装载的过程),对于企业或行业应用来说,我们经常会遇到各种数据的处理,转换,迁移,所以了解并掌握一种etl工具的使用,必不可少,这里我要学习的ETL工具是Kettle!kettle简介Kettle是一款国外开源的ETL工具,纯java编写,可以在Window、Linux、Unix上运行,绿色无需安装,数据抽取高效稳定。Kettle 中文名称叫水壶,该项目的主程序员MATT 希望把各种数据放到一个原创 2021-06-16 09:33:47 · 2678 阅读 · 0 评论 -
学习笔记之计算机网络
TCP 三次握手的过程①初始A 和 B 均处于 CLOSED 状态,B 创建传输控制块 TCB 并进入 LISTEN 状态,等待客户的连接请求。②A 向 B 发送连接请求报文,首部的同部位SYN=1,ACK=0,随机选择一个初始序号seq=x。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但要消耗一个序号,发送后TCP客户进程进入SYN-SENT 同步已发送状态。====A向B说:让我们建立连接吧。我发送的信息序号会从x开始。③B 收到 A 的连接请求报文后,如果同意建立连..原创 2021-06-13 16:03:47 · 2548 阅读 · 2 评论 -
学习笔记之Java笔记(三)
修饰符的权限原创 2021-06-13 15:41:48 · 1862 阅读 · 2 评论 -
学习笔记之JVM
反射1、什么是反射?反射是在运行中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java 语言的反射机制。2、哪里用到反射机制?JDBC中,利用反射动态加载了数据库驱动程序。Web服务器中利用反射调用了Sevlet的服务方法。Eclispe等开发工具利用反射动态刨析对象的类型与结构,动态提示对象的属性和方法。很多框架都用到反射机制,注入属性,调用方法,如Spring..原创 2021-06-13 15:32:34 · 1295 阅读 · 2 评论 -
学习笔记之多线程笔记(一)
多线程1、synchronized关键字synchronized 使用场景:当多个线程对同一个对象的同一个实例变量进行操作时,为了避免非线程安全问题,就用synchronized。synchronized的主要作用:保证同一时刻,只有一个线程可以执行某一个方法或代码块。synchronized 可以修饰方法和代码块。synchronized 三个特征:可见性、原子性、禁止代码重排序。synchronized可以用于解决脏读、多线程死锁等问题。非线程安全问题:当多个线程对同一个对象中的同一个实原创 2021-06-13 15:11:59 · 757 阅读 · 0 评论 -
学习笔记之Java笔记(二)
异常概述Java把所有的非正常情况分为:异常(Exception)和错误(Error)。它们都继承Throwable父类。Error错误一般是指与JVM相关的问题,如系统崩溃、虚拟机错误等。这类错误无法捕捉或无法恢复,将导致程序中断。不应该用catch块来捕捉Error或throws抛出Error。Java异常体系分为Checked异常和Runtime异常(运行时异常)。所有RuntimeException及其子类的实例都是Runtime异常,其余的异常实例都是Checked异常。Ja...原创 2021-06-13 15:01:43 · 376 阅读 · 0 评论 -
学习笔记之Java笔记(一)
重写(Override)与重载(Overload)的区别Java确定一个方法的三要素:①调用者,类还是对象。②方法名。③ 形参列表。方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载主要发生在同一类的多个同名方法之间。重写主要发生在子类和父类的同名方法之间。方法重载:在同一类中包含了两个或两个以上的方法,其方法名相同,但形参列表不同。重载要求两同一不同:同一个类中方法名相同,形参列表不同(参数的顺序,类型,个数不同)。至于方法的其他部分,如返回原创 2021-06-13 14:44:30 · 680 阅读 · 0 评论