自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 算法基础--双指针

前面已经写了两篇关于算法方面的文章,这几天想了下,决定把这个算法整理成一个系列,除了是帮助自己巩固算法知识外,还能够把自己总结的每种算法的套路保存下来并分享给大家,这样以后即使是哪天想要重拾起来,也是能够根据这些算法套路快速重拾。那么好,这道题可能很多小伙伴会说太简单了,如果双指针只有这水平,那大家都可以洗洗睡了,还在算法的题海里面挣扎个什么劲。但是现在嘛,首尾指针给它安排上,两个指针指向的数值,比较小的往对方靠拢(为什么这样自己去想想),记录一个最大值,不断刷新满足条件的值,直到两个指针相遇,结束。

2023-12-03 23:41:40 998

原创 redis学习笔记(三)--项目实践过程遇到的问题

redis缓存击穿、缓存穿透、缓存雪崩,高可用机制

2022-12-11 18:34:45 354 1

原创 redis学习笔记(二)--redis实现原理相关

redis实现原理

2022-12-05 00:17:24 291

原创 redis学习笔记(一)--redis的认识和使用

redis是基于key-value的内存存储系统,具有高性能,高可靠的特点。支持存储String、list、hash、set、zset等数据类型,这些数据都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的排序。为了保证效率,数据都是缓存在内存中,Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。 1、先把Redis的连接池拿出来

2022-12-04 19:04:37 311

原创 网络安全-非对称加密

非对称加密算法介绍

2022-08-06 20:34:38 1519

原创 网络安全--对称加密

对称加密算法介绍

2022-08-06 18:58:08 2363

原创 并发编程学习小结

前段时间由于项目需要,自己设计了个线程池的框架,结合工厂模式,能够支持业务根据各自业务量的需要,定制自己线程池的大小。虽然通过这个对并发编程已经有了一定的了解,但是个人认为自己目前对于java的并发编程只是局限于使用和浅层的了解阶段,在这里先对自己这段时间的学习做个总结。首先,一般java多线程的实现,有两种方式,继承Thread类,或者实现runnable接口,但是基本上都是使用的实现run...

2022-08-06 17:12:05 127

原创 java基础知识--NIO详解及实战

前面已经介绍了java常见的几种IO操作,包括文件读写、缓冲区的操作等等。这些操作虽然都是我们日常在写业务代码的时候常用的操作,但是还有一种在互联网中也是极其重要的IO,那就是NIO。NIO是jdk1.4版本推出来的新功能,主要是为了解决在网络IO的过程中,同步IO阻塞导致系统资源浪费的场景。所以很多人说NIO,其实都是特指AIO,即异步IO在介绍NIO(AIO)之前,我们先来看看原来的BIO有什么问题。假如有这么一个场景,...

2021-05-10 01:27:50 286

原创 java基础知识--IO的的常用操作(二)

这章主要介绍IO相关的常用操作

2021-05-02 23:13:09 197 1

原创 java基础知识--IO的层次结构(一)

今天开始准备切入java的IO相关的知识,这一块也是外面互联网公司面试必备的基础知识,如果说搞java开发的不懂IO的话,我觉得基本上可以滚蛋了。今天开这篇博客,先从IO层次开始说起,让我们有一个,后续按照如下顺序不断推进:BIO和NIO、常见IO操作、inputStream和outputStream源码解析,在这几篇博文当中可能会穿插一些面试会问到的一些东西java的IO从处理对象上分,大致可以分为字节流和字符流,字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,

2021-04-30 00:49:39 209

原创 java基础知识--异常

说起异常,很多同学都会说,这不是最基本的吗?就一个exception,在代码执行过程中发生意外情况,就会抛出这个东西,好,本章结束。写这篇文章,主要有三点,第一个是异常的类型以及层次结构;第二是执行顺序;第三是如何自定义自己的异常(项目中经常会自定义自有异常,方便客户端识别)异常的类型以及层次结构从上图可以看出,Throwable 是 Java 语言中所有错误与异常的超类,它包含两个子类:Error(错误)和 Exception(异常),Error 表示程序中无法处理的错误,表示运行应用程序

2021-04-22 01:25:18 181

原创 java基础知识--hashMap、treeMap和LinkedHashMap

上一篇文章描述了hashMap的底层实现原理,接下来介绍另外两个也是比较常用的map:treeMap和linkedHashMapLinkedHashMapLinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的。HashMap和双向链表合二为一即是LinkedHashMap。所谓LinkedHashMap,其落脚点在HashMap,因此更准确地说,它是一个将所有Entry节点链入一个双向链表的HashMap。由于Linked

2021-04-18 23:23:05 1010 4

原创 java基础知识--hashMap原理深入解析

面试中经常会被问到,hashMap、treeMap、linkedHashMap有什么区别,内部实现逻辑如何?今天我就来深度剖析下这三个东西先总体说下这三个东西的区别,然后再深入一个一个解剖他们:hashMap是以哈希表结构(数组+链表)实现的以键值对存储的高性能存取集合,数据的存取都是无序的,非线程安全的数据结构LinkedHashMap是继承于HashMap,基于HashMap和双向链表来实现的。有序存取,可分为插入顺序和访问顺序两种。如果是访问顺序,那put和get操作已存在的Entry时,

2021-04-18 22:32:51 194

转载 计算机网络--HTTPS的hash、交互流程以及相关的实战问题

前面两篇文章都阐述清楚了HTTPS如何加密和利用CA证书认证,第一个方法解决了内容加密传输的问题,第二个方案解决了防伪冒的问题,那么就剩下最后一个问题了,如何验证完整性,接下来开始我们的这一章的主要内容:HTTPS的哈希哈希,键值对数据结构,通过哈希函数把一个空间映射到另一个空间。非常好用的一个工具,而且哪哪儿都有它的影子,比如负载均衡的一致性哈希、密码学中用于信息加密或数据校验的各种哈希(SHA、MD5等)、二维空间定位的GeoHash、对象相似度的SimHash等等。HTTPS的哈希一共用在2个

2021-04-12 00:53:05 389

转载 计算机网络--HTTPS与证书

上一章节说了第一个问题,HTTPS如何数据加密,还剩下两个问题,HTTPS如何做身份验证以及完整性校验在说者两个问题之前,我觉得有必要先搞清楚几个概念,CA,CA机构,数字证书,数字签名,(证书)指纹,(CA)证书,HTTPS证书,SSL/TLS证书CA,CA机构:机构/组织概念。 数字证书,(CA)证书,HTTPS证书,SSL/TLS证书:CA签发的数字证书。 数字签名,(证书)指纹:CA签发的证书的内容之一,一段加密的密文。智库百科对数字证书的解释是:数字证书也称公开密钥证书,是指用

2021-04-11 22:21:35 373

转载 计算机网络--HTTPS和加密

项目中如果是内网请求,经常会用到http请求;但是一旦请求经过公网,则我们会要求请求使用https,因为担心请求走出机房后,被网络上的黑客嗅探导致信息泄露。那么既然要防止网络上的黑客嗅探我们的数据,那么https肯定拥有很重要的一个能力--加密。那么,“HTTPS是什么?”维基百科对HTTPS的解释是:超文本传输安全协议(英语:HyperText Transfer Protocol Secure,缩写:HTTPS;常称为HTTP over TLS、HTTP over SSL或HTTP Secu

2021-04-11 01:32:18 424 2

转载 计算机网络--TCP和UDP

在脉脉上看一些人去参加面试后,面试官都会问一下计算机网络相关的东西,以考察候选人的计算机基础,如TCP和UDP的区别,TCP三次握手是怎样完成的,http和https有什么差别,https是如何保证。今天先介绍下TCP和UDP,后面再写一篇文章专门介绍http和https,毕竟那块也是非常重要,并且涉及知识点颇多。在说TCP、UDP之前,先说下计算机网络模型,计算机与网络设备要相互通信,双方就必须基于相同的方法。比如,如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通信、怎样结束通信等规则都需要

2021-04-09 01:22:09 235

原创 java基础知识--java数据类型相关

今天无意间看到脉脉上有人说自己面试遇到面试官问基础数据类型相关的问题竟然没回答出来,我也是笑了,自认为不敢说基础知识有多扎实,但是基本得一些东西还是知道的,这里写下来仅供参考1. 基础数据类型以及他们的大小:byte、short、int、long、float、double、char、boolean先说下单位大小的换算,位:bit,计算机中最小单位,1bit能表示两个数据结果,如true和false,二进制的0和1;字节byte,1byte=8bit,所以1字节可以表示的结果数量是2的8次方,即2

2021-03-10 00:34:30 125

原创 算法基础(栈)--移除无效的括号

题目来源于Leetcode 1249:移除无效的括号,题目描述如下:给你一个由 '('、')' 和小写字母组成的字符串 s。你需要从字符串中删除最少数目的 '(' 或者 ')'(可以删除任意位置的括号),使得剩下的「括号字符串」有效,请返回任意一个合法字符串。有效「括号字符串」应当符合以下任意一条要求:空字符串或只包含小写字母的字符串可以被写作AB(A连接B)的字符串,其中A和B都是有效「括号字符串」可以被写作(A)的字符串,其中A是一个有效的「括号字符串」...

2021-02-24 00:00:17 227

原创 算法基础-旋转有序数组的二分搜索

要求  给定一个没有重复元素的旋转数组(它对应的原数组是有序的),求给定元素在旋转数组内的下标(不存在的返回-1),要求算法时间复杂度越小越好。函数定义:int Search(int[] nums, int target)例子:有序数组{0,1,2,3,4,5,6,7}对应的旋转数组为{3,4,5,6,7,0,1,2}(左旋、右旋效果相同)。查找元素5,返回结果2; 查找元素8,返回结果-1。分析:可以轻易地想到遍历一遍O(n)时间可以得到结果,但是并不是最好的结果;利用有序的特点,

2021-02-23 01:00:25 158

原创 Java基础知识--内部类

之前看项目的代码中有使用到内部类的情况,但是不理解为什么要用内部类这种生僻而难以理解的语法,没有领悟到内部类的真正意义所在,故而在这里说下内部类的几种形式、用途以及使用方式内部类定义将一个类的定义放在另一个类内部,就是内部类。跟组合不同的是,组合只是将另一个类的引用指向一个实例后放在类里面,达到两个类之间的关联关系。从两个类通信角度来说,内部类可以直接访问外部类的所有属性方法,而组合中的定...

2019-10-06 21:24:08 234

原创 Spring的单例与线程安全

Spring单例在高并发下可能出现的线程安全问题:只有当注入的对象是无状态的,才能保证执行前后不被修改,否则执行一次之后单例对象就会发生变化,下一次执行结果肯定不一样。在高并发的情况下,这个线程刚使用单例对象进行属性设置,如果这时候被另外一个线程拿去使用,很有可能就造成这个对象就是一个脏对象,对这个脏对象的操作,都会存在线程安全的问题。所以在高并发情况下,单利对象的数据不可以在一个线程使用...

2019-10-06 00:21:15 335

原创 框架演进之路(一)--从复杂调用到逻辑分层

部门的框架在上次经过重构了以后,已经从一个所有的业务逻辑从头到尾都是方法调用的系统,演进到成为业务逻辑分层的架构,分层架构的最大的一个好处就是能够

2016-10-05 22:59:20 687

原创 java设计模式(十一)--状态模式

早之前就研究过老大开发的订单框架,一直想把它的最核心部分用到的设计模式放到最后面来写,作为本系列博客的收官之作。这段时间决定把部门框架的演进之路作为一个系列的博客写出来,而新框架最核心的部分就是订单,在我们的金融系统里面,所有的业务请求,都被视为一笔订单。而订单的核心代码,其实就是一个状态机的实现,下面就让我以我们部门的订单状态机为例子,阐述下我对设计模式中状态模式的理解,仅供大家交流学习。什

2016-06-20 02:03:40 724

原创 深入java虚拟机(九)--常见问题总结

1.     JVM运行时内存结构1.由如下图构成。Runtime Data Area有如下几个区,其中PC程序计数器、虚拟机栈和本地方法栈是线程独享的,堆和方法区是线程共享的。Classload用来加载class文件,执行引擎用来执行程序,本地方法接口调用本地方法库。2.java stack比较简单,每一个都是一个栈帧,每个栈帧由三部分构成。局部变量区、操作数区和帧数据区。局部变量是

2016-06-16 13:55:55 3368

转载 深入java虚拟机(八)--Java垃圾收集机制

对象引用    Java中的垃圾回收一般是在Java堆中进行,因为堆中几乎存放了Java中所有的对象实例。谈到Java堆中的垃圾回收,自然要谈到引用。在JDK1.2之前,Java中的引用定义很很纯粹:如果reference类型的数据中存储的数值代表的是另外一块内存的起始地址,就称这块内存代表着一个引用。但在JDK1.2之后,Java对引用的概念进行了扩充,将其分为强引用(Stron

2016-06-16 06:04:57 551

转载 深入java虚拟机(七)--Javac编译与JIT编译

编译过程    不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的目标代码或虚拟机能执行的指令集之前,都会按照如下图所示的各个步骤进行:        其中绿色的模块可以选择性实现。很容易看出,上图中间的那条分支是解释执行的过程(即一条字节码一条字节码地解释执行,如JavaScript),而下面的那条分支就是传统编译原理中从源代码到目

2016-06-16 06:04:34 668

转载 深入java虚拟机(六)--Java语法糖

语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家Peter.J.Landin发明的一个术语,指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。Java中最常用的语法糖主要有泛型、变长参数、条件编译、自动拆装箱、内部类等。虚拟机并不支持这些语法,它们在编译阶段就被还原回了简单的基础语法结构,这个过程成为解语法糖。    泛

2016-06-16 06:04:15 614

转载 深入java虚拟机(五)--多态性实现机制——静态分派与动态分派

方法解析    Class文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址。这个特性给Java带来了更强大的动态扩展能力,使得可以在类运行期间才能确定某些目标方法的直接引用,称为动态连接,也有一部分方法的符号引用在类加载阶段或第一次使用时转化为直接引用,这种转化称为静态解析。这在前面的“Java内存

2016-06-16 06:03:59 515

转载 深入java虚拟机(四)--类加载机制

类加载过程    类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。它们开始的顺序如下图所示:    其中类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为

2016-06-16 06:03:05 513

转载 深入java虚拟机(三)--类初始化

类初始化是类加载过程的最后一个阶段,到初始化阶段,才真正开始执行类中的Java程序代码。虚拟机规范严格规定了有且只有四种情况必须立即对类进行初始化:遇到new、getstatic、putstatic、invokestatic这四条字节码指令时,如果类还没有进行过初始化,则需要先触发其初始化。生成这四条指令最常见的Java代码场景是:使用new关键字实例化对象时、读取或设置一个类的静

2016-06-16 06:02:23 430

转载 深入java虚拟机(二)--Class类文件结构

平台无关性    Java是与平台无关的语言,这得益于Java源代码编译后生成的存储字节码的文件,即Class文件,以及Java虚拟机的实现。不仅使用Java编译器可以把Java代码编译成存储字节码的Class文件,使用JRuby等其他语言的编译器也可以把程序代码编译成Class文件,虚拟机并不关心Class的来源是什么语言,只要它符合一定的结构,就可以在Java中运行。Java语言中的各

2016-06-16 06:02:00 609

转载 深入java虚拟机(一)--Java内存区域与内存溢出

内存区域    Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域。Java虚拟机规范将JVM所管理的内存分为以下几个运行时数据区:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区。下面详细阐述各数据区所存储的数据类型。   程序计数器(Program Counter Register)

2016-06-16 06:01:17 472

转载 java并发编程(二十四)--面试题合集

下面是Java线程相关的热门面试题,你可以用它来好好准备面试。1) 什么是线程?  线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒。J2) 线程和进程有什么区别?  线程是进程

2016-06-13 16:08:48 1820

转载 java并发编程(二十三)--并发新特性—信号量Semaphore

在操作系统中,信号量是个很重要的概念,它在控制进程间的协作方面有着非常重要的作用,通过对信号量的不同操作,可以分别实现进程间的互斥与同步。当然它也可以用于多线程的控制,我们完全可以通过使用信号量来自定义实现类似Java中的synchronized、wait、notify机制。    Java并发包中的信号量Semaphore实际上是一个功能完毕的计数信号量,从概念上讲,它维护了一个许可集合

2016-06-13 13:19:33 459

转载 java并发编程(二十二)--并发新特性—障碍器CyclicBarrier

CyclicBarrier(又叫障碍器)同样是Java 5中加入的新特性,使用时需要导入java.util.concurrent.CylicBarrier。它适用于这样一种情况:你希望创建一组任务,它们并发地执行工作,另外的一个任务在这一组任务并发执行结束前一直阻塞等待,直到该组任务全部执行结束,这个任务才得以执行。这非常像CountDownLatch,只是CountDownLatch是只触发一次

2016-06-13 13:17:52 479

转载 java并发编程(二十一)--并发新特性—阻塞队列和阻塞栈

阻塞队列    阻塞队列是Java 5并发新特性中的内容,阻塞队列的接口是java.util.concurrent.BlockingQueue,它有多个实现类:ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue、PriorityBlockingQueue、SynchronousQueue等,用法大同小异,具体可查看JDK文档,这里简单举例看下

2016-06-13 13:15:21 497

转载 java并发编程(二十)--并发新特性—Lock锁和条件变量

简单使用Lock锁    Java 5中引入了新的锁机制——java.util.concurrent.locks中的显式的互斥锁:Lock接口,它提供了比synchronized更加广泛的锁定操作。Lock接口有3个实现它的类:ReentrantLock、ReetrantReadWriteLock.ReadLock和ReetrantReadWriteLock.WriteLock,即重入锁、

2016-06-13 13:04:02 1854

转载 java并发编程(十九)--并发新特性—Executor框架与线程池

Executor框架简介    在Java 5之后,并发编程引入了一堆新的启动、调度和管理线程的API。Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java.util.cocurrent 包下,通过该框架来控制线程的启动、执行和关闭,可以简化并发编程的操作。因此,在Java 5之后,通过Executor来启动线程比使用Thread的start方法更好,除了

2016-06-13 12:58:52 662

转载 java并发编程(十八)--深入Java内存模型—内存操作规则总结

主内存与工作内存    Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。此处的变量主要是指共享变量,存在竞争问题的变量。Java内存模型规定所有的变量都存储在主内存中,而每条线程还有自己的工作内存,线程的工作内存中保存了该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不

2016-06-13 12:49:57 672

空空如也

空空如也

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

TA关注的人

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