自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 计算机网络

100:这个状态码是告诉客户端应该继续发送请求,这个临时响应是用来通知客户端的,部分的请求服务器已经接受,但是客户端应继续发送求请求的剩余部分,如果请求已经完成,就忽略这个响应,而且服务器会在请求完成后向客户发送一个最终的结果。301:客户端请求的网页已经永久移动到新的位置,当链接发生变化时,返回301代码告诉客户端链接的变化,客户端保存新的链接,并向新的链接发出请求,已返回请求结果。HTTP 明文传输,数据都是未加密的,安全性较差,HTTPS(SSL+HTTP) 数据传输过程是加密的,安全性较好。

2022-08-24 16:50:57 753 1

原创 二叉树遍历模板

二叉树前序遍历,中序遍历,后序遍历,层序遍历

2022-08-17 11:33:35 228

原创 循环队列和循环双端队列

循环双端队列其实就是一个双端队列,即可以在队头和队尾都进行入队或者出队操作的队列。

2022-08-16 20:57:54 179

原创 MySQL(4)

锁按照粒度,锁可以分为表锁、行锁以及其他位于二者之间的间隙锁。表锁在操作数据时会锁定整张表,并发性能较差;行锁则只锁定需要操作的数据,并发性能好。但是由于加锁本身需要消耗资源(获得锁、检查锁、释放锁等都需要消耗资源),因此在锁定数据较多情况下使用表锁可以节省大量资源。MySQL 中不同的存储引擎支持的锁是不一样的,例如 MyIsam 只支持表锁,而 InnoDB 同时支持表锁和行锁,且出于性能考虑,绝大多数情况下使用的都是行锁。行级锁是 Mysql 中锁定粒度最细的一种锁,表示只针对当前操作的行进行 加锁。

2022-06-28 16:20:56 369

原创 MySQL(3)

数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,是一个不可分割的工作单位。事务管理的目标是完整性,一次中的若干操作要么都执行成功,要么都失败. 事务由事务开始与事务结束之间执行的全部数据库操作组成。在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行, 要么全部不执行。事务用来管理 insert,update,delete 语句。一般来说,事务是必须满足 4 个条件(AC

2022-06-27 15:36:20 245

原创 MySQL(2)

MySQL完整架构层:连接层最上层是一些客户端和连接服务,包含本地 sock 通信和大多数基于客户端 /服务端工具实现的类似于 tcp/ip 的通信。主要完成一些类似于连接处理、授权 认证、及相关的安全方案。服务层可以接收SQL,负责调用函数,存储过程,触发器,对SQL执行顺序排序和优化,如果是查询操作,还可以从内部缓存中先查询数据,提高性能.引擎层存储引擎层,存储引擎真正的负责了 MysQL 中数据的存储和提取,服务器通过 API 与存储引擎进行通信。MySQL提供了不同的执行引擎,不同的存储引擎具有

2022-06-25 16:06:28 217

原创 MqSql(1)

什么是视图?视图就是将某个查询语句存储在数据中,并为其命名,视图中并不存储数据,数据还是在基本中存储.定义视图:create view 视图名 as 查询语句使用视图select * from 视图名删除视图drop view 视图名如果实现用户的某些需求时,需要编写一组复杂的 SQL 语句才能实现,那么 可以将这组复杂的 SQL 语句集编写在数据库中,由 JDBC 调用来执行这组 SQL 语句。把编写在数据库中的 SQL 语句集称为存储过程。存储过程(PROCEDURE)是事先经过编译并存储在数

2022-06-22 18:31:01 264

原创 Hashmap底层实现原理(JDK1.8)

,HashMap 数据结构为 数组+链表+红黑树.因为当链表的长度特别长的时候,查询效率将直线下降,查询的时间复杂度为 O(n)。因此,JDK1.8 把它设计为达到一个特定的阈值之后,就将链表转化为红黑树。在这里我们就讲一下jdk1.7和1.8的HashMap的区别吧:首先就是hash()方法,1.7版本的hash()方法的散列...

2022-06-21 16:26:19 2337

原创 Hashmap底层实现原理(JDK1.8)(AVL树简介.红黑树的原理)

在说jdk1.8的HashMap之前呢,我们先了解一下AVL树和红黑树:在计算机科学中,AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。平衡二叉树递归定义如下:左右子树的高度差......

2022-06-17 17:39:07 704

原创 Hashmap底层实现原理(JDK1.7)

在JDK1,7中,HashMap 数据结构为 数组+链表.三句话,说清它的数据结构:1.整体是一个数组;2.数组每个位置是一个链表;3.链表每个节点中的Value即我们存储的Object;初始化HashMap:提供了有参构造和无参构造:1.无参构造中,容器默认的数组大小 initialCapacity 为 16;2.,有参构造中,指定数组长度时,如果指定数组的长度为9,但是真正在初始化时创建数组的长度不是为9而是16。创建数组是在使用put方法时进行初始化创建。进入inflateTable(

2022-06-10 17:47:55 725

原创 高精度算法

高精度算法(High Accuracy Algorithm)是处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称为是高精度数。高精度算法就是能处理高精度数各种运算的算法,但又

2022-06-03 13:22:18 123

原创 数据结构--并查集

并查集并查集是一种非常精致而且实用的数据结构;它主要用于处理一些不相交集合的合并问题.一些常见的用途有求连通子树,求最小生成数和求最近公共祖先等.并查集的主要操作有:1.初始化(init)2.查询(find)3.合并(union)假设有编号为1,2,3,4…,n的n个元素,我们用一个数组 fa[ ] 来存储每个元素的父节点,我们先将它们的父节点设为自己.// 并查集public class UnionFindSets { int[] fa; //1.初始化 pub

2022-05-27 16:26:05 222

原创 Java 并发编程(ThreadLocal)(6)

ThreadLocal线程封闭:ThreadLocal 是什么?ThreadLocal 原理分析 :ThreadLocal 内存泄漏问题:线程封闭:在了解 ThreadLocal 之前,我们先了解下什么是线程封闭.对象封闭在一个线程里,即使这个对象不是线程安全的,也不会出现并发安全问题。例如 栈封闭:就是用栈(stack)来保证线程安全.StringBuilder 是线程不安全的,但是它只是个局部变量,局部变量存储在虚拟 机栈,虚拟机栈是线程隔离的,所以不会有线程安全问题.ThreadLoca

2022-05-16 16:06:57 166

原创 Java 并发编程(线程池)(5)

线程池概述:数据库链接池: 每次与数据链接, 创建连接对象Connection 操作完之后,进行销毁 频繁创建销毁比较耗时.创建一个池子,预先在池子中初始化好一部分连接(Connection )对象, 使用时直接获取即可,用完还回,不需要频繁创建销毁.线程池和数据库连接池的思想是一样的:以前我们需要使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁

2022-05-16 15:20:18 91

原创 Java 并发编程(Java中的锁)(4)

Java中的锁Java 中的锁分类:乐观锁/悲观锁:可重入锁:读写锁(ReadWriteLock):分段锁:自旋锁( SpinLock):共享锁/独占锁:AQS(AbstractQueuedSynchronizer):公平锁/非公平锁:偏向锁/轻量级锁/重量级锁:Java 对象头:Synchronized:ReentrantLock:Java 中的锁分类:乐观锁/悲观锁:乐观锁与悲观锁不是指具体的什么类型的锁,而是指看待并发同步的角度.悲观锁认为对于同一个数据的并发操作,一定是会发生修改的,哪怕没有

2022-05-09 14:30:39 290

原创 Java 并发编程(CAS,JUC常用类)(3)

CAS.JUC常用类CASJUC 常用类1.ConcurrentHashMap2.CopyOnWriteArrayListCASCAS(Compare-And-Swap) :比较并交换,该算法是硬件对于并发操作的支持.适用于低并发的情况下CAS 是乐观锁的一种实现方式,他采用的是自旋锁的思想,是一种轻量级的锁机制。CAS 包含了三个操作数:①内存值 V ;②预估值 A (比较时,从内存中再次读到的值) ;③更新值 B (更新后的值).当且仅当预期值 A==V,将内存值 V=B,否则什么都不

2022-04-23 17:10:40 526

原创 二分查找力扣习题(1)

模板 1:while (left <= right)LeetCode第35题为例:public int searchInsert(int[] nums, int target) { int len = nums.length; if (nums[0] > target) return 0; if (nums[len - 1] < target) return len ; int left = 0; int

2022-04-23 15:45:55 363

原创 二分查找力扣习题(2)

二分查找练习力扣习题题型二:在非有序的数组中使用二分查找33. 搜索旋转排序数组81. 搜索旋转排序数组 II153. 寻找旋转排序数组中的最小值154. 寻找旋转排序数组中的最小值 II162. 寻找峰值题型二:在非有序的数组中使用二分查找33. 搜索旋转排序数组33. 搜索旋转排序数组(中等)题目描述:整数数组 nums 按升序排列,数组中的值 互不相同 。在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为

2022-04-23 15:43:08 305

原创 Java 并发编程(并发编程核心问题,volatile 关键字,如何保证原子性,原子类)(2)

并发编程核心问题–可见性,原子性,有序性可见性一个线程对共享变量的修改,另外一个线程能够立刻看到,我们称为可见性。对于如今的多核处理器,每颗 CPU 都有自己的缓存,而缓存仅仅对它所在的处理器可见,CPU 缓存与内存的数据不容易保证一致。为了避免处理器停顿下来等待向内存写入数据而产生的延迟,处理器使用写 缓冲区来临时保存向内存写入的数据。写缓冲区合并对同一内存地址的多次写, 并以批处理的方式刷新,也就是说写缓冲区不会即时将数据刷新到主内存中。缓存不能及时刷新导致了可见性问题。举例:假设线程 1

2022-04-13 14:06:37 587

原创 排序高级算法(2)快速排序

快速排序归并排序与快速排序都使用了「分治思想」归并排序拆分:不管数组的形态,总是将数组一分为二;组合:合并两个有序的数组。快速排序拆分:根据某个元素 pivot,将数组整理成两个部分; 前半部分小于 pivot, 后半部分大于等于 pivot; 把 pivot 交换到前半部分的最后一个元素。组合:什么都不用做。快速排序的基本想法快速排序每一次都排定一个元素(这个元素呆在了它最终应该呆的位置),然后递归地去排它左边的部分和右边的部分,依次进行下去,直到数组有序。快速排序的算法思想分而治之

2022-03-12 14:21:13 571

原创 排序算法(1)(归并排序)

归并排序排序算法的稳定性如果相等的元素在排序以后的位置保持不变,这样的排序算法就是稳定的排序算法.如果只是针对数值类型,谈论稳定性没有意义,稳定性针对有多个属性的对象类型而言,不稳定的排序算法对于数值相同的元素在排序前后的相对位置关系是不确定的.常用的排序算法中插入排序,冒泡排序,归并排序是稳定的排序算法.归并排序简介

2022-03-06 17:51:18 344

原创 java注解&&对象克隆

注解Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。这里是我自己之前写的关于注解的博客:内置的注解元注解(注解的注解)自定义一个注解:自定义一个注解:import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotat

2022-03-03 17:51:44 450

原创 排序算法(基础排序算法)

选择排序选择排序的基本思想:每一轮选取未排定的部分中 最小的元素交换到未排定部分的最开头,经过若干个步骤,就能排定整个数组。参考代码://选择排序public class Selectionsort { public int[] sortArray(int[] nums) { int len = nums.length; //当数组的长度小于2(即长度为0或者1)时,直接返回该数组; if (len < 2) {

2022-03-03 12:22:09 719

原创 框架进阶(2)

建模语言Unified Modeling Language,简称UML。 类图以可视化图形方式来表述类与类之间的关系,方便理解.类图的基本元素:类;接口;属性 ;方法类之间的关系:依赖(Dependency)关系在A类中的某个方法中把B类作为参数使用,具有临时性.关联(Association)关系在一个类中,把另一个类当做属性;聚合(Aggregation)关系表示一种强关联关系 学校和老师 学校不存在,老师依然存在组合(Composition)关系更强烈的关联关系

2022-03-02 17:54:23 6581 1

原创 框架进阶(1)

Spring框架spring是一个轻量级的,非侵入式的,IOC,AOP,一站式的,简化企业级开发而生的。核心包非常小;业务代码中不侵入框架代码;IOC:控制反转;将生成对象的权利,反转给了spring框架;依赖注入(DI)为属性注入值;AOP:面向切面编程;将一些与业务代码无关的公共部分抽取起来;使用时,通过代理对象调用;从而达到不修改原代码的基础上增加功能,代码的耦合度降低;一站式框架:数据持久层,web控制层…如何搭建:创建spring配置文件 spring.xml文件;在spring

2022-02-27 16:43:06 322

原创 Java 并发编程(线程,并发概述,Java 内存模型)(1)

线程基本内容程序: 静态代码 安装在硬盘上的进程: 运行中的程序 是操作系统分配内存空间的单位线程: 线程是进程中的一个最小执行单位, 是cpu调度单位 线程依赖于进程创建线程1…线程类 继承 Thread类2.实现 Runnable接口 重写 run( )方法3.创建Thread类的对象,为其分配任务4.实现 Callable接口 重写 call( ) 有返回值 可以抛出异常5.创建Thread类的对象,为其分配任务常用方法run() calll() start(

2022-01-18 14:54:17 291

原创 JVM-垃圾回收(垃圾回收的相关概念,垃圾收集器概述)(4)

垃圾回收的相关概念:1.System.gc() 的理解在默认情况下,通过 System.gc()者 Runtime.getRuntime().gc() 的调用,会显式触发 Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。然而 System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用(不能 确保立即生效)。JVM 实现者可以通过 System.gc() 调用来决定 JVM 的 GC 行为。而一般情况 下,垃圾回收应该是自动进行的,无须手动触发,否则就太过于麻烦

2022-01-17 19:53:48 249

原创 JVM-垃圾回收(垃圾回收阶段算法)(3)

垃圾回收阶段算法当成功区分出内存中存活对象和死亡对象后,GC 接下来的任务就是执行垃 圾回收,释放掉无用对象所占用的内存空间,以便有足够的可用内存空间为新对 象分配内存。目前在 JVM 中比较常见的三种垃圾收集算法是:标记-清除算法(Mark-Sweep)复制算法(Copying)标记-压缩算法(Mark-Compact)1.标记-清除算法:当堆中的有效内存空间(available memory)被耗尽的时候,就会停止整个程序(也被称为 stop the world),然后进行两项工作,第一项则

2022-01-17 18:54:17 285

原创 JVM - 垃圾回收(垃圾标记阶段算法,内存泄漏与溢出)(2)

2.垃圾回收相关算法:2.1.垃圾标记阶段算法:2.1.1 标记阶段的目的垃圾标记阶段:主要是为了判断对象是否存活1.在堆里存放着几乎所有的 Java 对象实例,在 GC 执行垃圾回收之前,首先需 要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有被标记为己经死亡的对象,GC 才会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个 过程我们可以称为垃圾标记阶段。2.那么在 JVM 中究竟是如何标记一个死亡对象呢?简单来说,当一个对象已经 不再被任何的存活对象继续引用时,就可以宣判为已经死亡

2022-01-11 17:50:08 2749

原创 JVM - 垃圾回收(垃圾回收概述)(1)

1 垃圾回收概述:1.1 概述:1.Java 和 C++语言的区别,就在于垃圾收集技术和内存动态分配上,C++语言没有垃圾收集技术,需要程序员手动的收集。2.垃圾收集,不是 Java 语言的伴生产物。早在 1960 年,第一门开始使用内存动态分配和垃圾收集技术的 Lisp 语言诞生。3.关于垃圾收集有三个经典问题:哪些内存需要回收?什么时候回收?如何回收?4.垃圾收集机制是 Java 的招牌能力,极大地提高了开发效率。如今,垃圾收集 几乎成为现代语言的标配,即使经过如此长时间的发展,Java

2022-01-10 19:10:14 101

原创 JVM - 执行引擎

1.执行引擎概述:1.执行引擎是 Java 虚拟机核心的组成部分之一。2.JVM 的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只 是一些能够被 JVM 所识别的字节码指令、符号表,以及其他辅助信息。3.那么,如果想要让一个 Java 程序运行起来,执行引擎(Execution Engine) 的任务就是将字节码指令解释/编译为对应平台上的本地机器指令才可以。简单来说,JVM 中的执行引擎充当了将高级语言翻译为机器语言

2022-01-10 16:36:57 429

原创 JVM-本地方法接口

1 什么是本地方法:简单来讲,一个 Native Method 就是一个 java 调用非 java 代码的接口,一个 Native Method 是这样一个 java 方法:该方法的底层实现由非 Java 语言实现, 比如 C。这个特征并非 java 特有,很多其他的编程语言都有这一机制 在定义一个 native method 时,并不提供实现体(有些像定义一个 Java interface),因为其实现体是由非 java 语言在外面实现的。关键字 native 可以与其他所有的 java 标识符连用

2022-01-10 15:51:56 242

原创 JVM运行时数据区(方法区)(3)

6.方法区6.1 方法区的基本理解:方法区,是一个被线程共享的内存区域。其中主要存储加载的类字节码、 class/method/field 等元数据、static final 常量、static 变量、即时编译器编译后的代码等数据。另外,方法区包含了一个特殊的区域“运行时常量池”。Java 虚拟机规范中明确说明:”尽管所有的方法区在逻辑上是属于堆的一部分,但对于 HotSpotJVM 而言,方法区还有一个别名叫做 Non-Heap(非堆),目的就是 要和堆分开.所以,方法区看做是一块独立于 java

2022-01-10 15:30:16 581

原创 JVM运行时数据区(堆)(2)

5.Java 堆内存5.1堆内存概述:一个 JVM 实例只存在一个堆内存,堆也是 Java 内存管理的核心区域.Java 堆区在 JVM 启动时的时候即被创建,其空间大小也就确定了,是 JVM 管理 的最大一块内存空间.堆内存的大小是可以调节. 例如: -Xms:10m(堆起始大小) -Xmx:30m(堆最大内存大小) 一般情况可以将起始值和最大值设置为一致,这样会减少垃圾回收之后堆内存重 新分配大小的次数,提高效率.《Java 虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但逻辑

2022-01-10 14:50:00 369

原创 JVM 运行时数据区(程序计数器,java虚拟机栈,本地方法栈)(1)

1 运行时数据区组成概述JVM 的运行时数据区,不同虚拟机实现可能略微有所不同,但都会遵从 Java 虚 拟机规范,Java 8 虚拟机规范规定,Java 虚拟机所管理的内存将会包括以下几 个运行时数据区域:1.1 程序计数器(Program Counter Register):程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。1.2Java 虚拟机栈(Java Virtual Machine Stacks)描述的是

2022-01-09 17:09:51 397

原创 JVM-类加载(2)

4 类加载器分类:站在 JVM 的角度看,类加载器可以分为两种:1.引导类加载器(启动类加载器 Bootstrap ClassLoader). (不是java语言实现)2.其他所有类加载器,这些类加载器由 java 语言实现,独立存在于虚拟机外部,并且全部继承自抽象类 java.lang.ClassLoader.站在 java 开发人员的角度来看,类加载器就应当划分得更细致一些.自 JDK1.2 以 来 java 一直保持者三层类加载器:1.启动类加载器(引导类加载器)2.扩展类加载器3.应用

2022-01-09 15:35:39 272

原创 JVM 结构-类加载(1)

1 类加载子系统:作用:类加载子系统负责从文件系统或者加载class文件.只负责加载类,由执行引擎执行,存放在方法区(元空间).2 类加载的角色:1.class file 存在于硬盘上,可以理解为设计师画在纸上的模板,而最终这个模板在执行的时候是要加载 JVM 当中来,根据这个模板实例化出 n 个一模一样的实例.2.class file 加载到 JVM 中,被称为 DNA 元数据模板,放在方法区中.3.在.class–>JVM–>最终称为元数据模板,此过程就要有一个运输工具(类加

2022-01-08 17:26:43 596

原创 JVM概述

虚拟机:所谓虚拟机(Virtual Machine),就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。大名鼎鼎的 VMware 就属于系统虚拟机,它是完全对物理计算机的仿真,提供了一 个可运行完整操作系统的软件平台。程序虚拟机典型的代表就是 java 虚拟机了,它专门为 执行某个单个计算机程序而设计。在 java 虚拟机中执行的指令我们称为 java 字节码指令。Java 虚拟机是一种执行 java 字节码文件的虚拟计算机,它拥有独

2022-01-08 15:49:50 519

原创 泛型(generics)

为什么用泛型:早期的Object类型可以接收任意的对象类型,但是在实际的使用中, 会有类型转换的问题。也就存在这隐患,所以Java提供了泛型来解决这个安全问题什么是泛型:● 泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。● 参数化类型,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式,然后在使用/调用时传入具体的类型。● Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全

2022-01-08 14:49:37 340

原创 Stream

什么是 Stream?Stream 是 Java8 的新特性,它允许你以声明式的方式处理数据集合,可以把它看作是遍历数据集的高级迭代器。此外与 stream 与 lambada 表达示结合后 编码效率与大大提高,并且可读性更强。要澄清的是 java8 中的 stream 与 InputStream 和 OutputStream(IO中对文件的输入输出) 是完全不同的概念.steam擅长对数据的操作.简单案例:import java.util.ArrayList;import java.util.

2022-01-07 19:49:48 288

空空如也

空空如也

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

TA关注的人

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