自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 JDK配置

显示安装JDK版本代表成功(失败就从头再来,如果能找到问题就不需要,不确定是哪一步的问题从头再来比较方便)新建这两条数据(只输入第一条就可以,第二条后面才用得到)2.安装(最好选择默认路径,自己选择路径不要带中文)3)点击右上角Download Java。4)找到 Java 8(选择对应系统)2)在Products中找到Java。5)变量名:JAVA_HOME。4)在系统变量里面点击新建。1)点击products。1)此电脑右键点击属性。2)点击高级系统设置。3)点击环境变量设置。.........

2022-08-18 16:25:03 321 1

原创 简单介绍Map中的getOrDefault

就是当Map集合中存在这个key,就使用这个key对应的value值,不存在就会使用后面的默认值defaultValuekey - 键defaultValue - 当指定的key并不存在映射关系中,则返回的该默认值。

2022-08-12 10:05:56 5260

原创 简述@RequestParam与@RequestBody参数注解

RequestParam用于将指定的请求参数赋值给方法中的形参,可以接受简单类型属性,也可以接受对象类型,一般用于GET请求。@RequestParam三个配置参数required表示是否必须,默认为true,必填。defaultValue可设置请求参数的默认值。value为接收url的参数名(相当于key值)。@RequestParam也可用于除GET请求外,其它类型的请求,例如POST、DELETE等请求。..................

2022-07-26 15:17:22 8881

原创 Linux常用命令

1、切换目录2、查看目录3、创建目录或文件4、删除目录或文件5、重命名目录或文件6、剪切目录7、拷贝目录8、搜索目录或文件9、编辑文件10、打包和压缩11、解压12、查看当前路径13、查看进程14、结束进程:kill15、查看系统端口.........

2022-06-16 23:29:06 1865

原创 List、Set、Map的区别

ArrayList 底层是数组,查询快,增删慢,线程不安全,效率高,适合get和set方法;Vector 底层是数组,查询快,增删慢,线程安全,效率低;LinkedList 底层是双向循环链表,查询慢,增删快,线程不安全,效率高,适合增加和删除方法。HashSet:(无序,唯一)底层是哈希表,通过 hashCode()和 eques()保证元素唯一;LinkedHashSet:(有序,唯一)底层是链表和哈希表 ,链表保证元素的有序, 哈希表证元素的唯一性;TreeSet:(有序,唯一)底层是红黑树,排序通过

2022-06-07 15:16:33 9248 1

原创 简单介绍线程和进程区别

根本区别:进程是操作系统资源分配的基本单位,线程是资源调度的基本单位。资源开销:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资

2022-06-06 20:45:30 1160

原创 抽象类和接口

抽象类和接口

2022-06-01 22:37:29 232

原创 线程池详解

一、为什么要用线程池线程池解决的核心问题就是资源管理问题。在并发环境下,系统不能够确定在任意时刻中,有多少任务需要执行,有多少资源需要投入。这种不确定性将带来以下若干问题:1)频繁申请/销毁资源和调度资源,将带来额外的消耗,可能会非常巨大。2)对资源无限申请缺少抑制手段,易引发系统资源耗尽的风险。3)系统无法合理管理内部的资源分布,会降低系统的稳定性。为解决资源分配这个问题,线程池采用了“池化”(Pooling)思想。池化,顾名思义,就是将资源统一在一...

2022-05-11 00:24:54 620

原创 浏览器输入URL网址后经历过程

1.在浏览器的地址栏中输入url。2.浏览器检查缓存中的DNS记录,以找到url对应的IP地址,如果请求的URL不在缓存中,ISP的DNS服务器将发起DNS查询以查找托管URL的服务器的IP地址。DNS:域名系统。DNS是互联网的一项服务,他作为将域名和IP地址相互映射的一个分布式数据库。互联网上的每个URL都有一个分配给它的唯一IP地址,DNS是URL及其IP地址的列表,就像是电话簿是名称及其对应电话号码的列表一样。为了查找DNS记录,浏览器会检查四个缓存。1)...

2022-05-10 21:56:36 659

原创 面向对象的三大基本特征

面向对象三大基本特性:封装,继承,多态一、封装就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。 简单的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。一个对象他所封装的是自己的属性和方法,所以它是不需要依赖其他对象...

2022-05-10 15:31:07 7927

原创 Redis持久化机制

1.简单介绍一下Redis Redis是使用C语言开发的数据库,不过与传统数据库不同的是Redis的数据是存在内存中的,也就是内存数据库,读写速度非常的快,因此Redis被广泛应用于缓存方向。2.Redis 持久化机制很多时候我们需要持久化数据也就是将内存中的数据写入到硬盘里面,大部分原因是为了之后重用数据(比如重启机器、机器故障之后回复数据),或者是为了防止系统故障而将数据备份到一个远程位置。1)快照(snapshotting)持久化 Re...

2022-05-07 19:41:37 2278

原创 简单Docker入门讲解

一、什么是dockerDocker 是世界领先的软件容器平台,Go 语言进行开发实现,基于 Linux 内核提供的CGroup 功能和namespace 来实现的,以及AUFS 类的UnionFS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。 由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器,Docker能够自动执行重复性任务,用户可以方便地创建和使用容器,把自己的应用放入容器。容器可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。二、docker三大核心概念

2022-05-01 23:15:35 1589

原创 简单介绍常用数据库引擎

一、什么是数据库引擎?数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务,从而满足企业内大多数需要处理大量数据的应用程序的要求。 使用数据库引擎创建用于联机事务处理或联机分析处理数据的关系数据库。这包括创建用于存储数据的表和用于查看、管理和保护数据安全的数据库对象(如索引、视图和存储过程)。二、数据库引擎类型1 InnoDB引擎 支持行级锁,支持事务处理,支持外键,支持崩溃修复能力和并发控制,支持MVCC。如果需要对事务的完整性要求比较高...

2022-04-22 15:43:00 4745

原创 简单介绍缓存穿透、缓存雪崩、缓存击穿以及解决方案

一.缓存穿透简单意思就是大量请求的 key 根本不存在于缓存中,导致请求直接到了数据库上,根本没有经过缓存这一层。比如:某个黑客故意制造我们缓存中不存在的 key 发起大量请求,导致大量请求落到数据库。解决方法1)缓存无效的key:如果缓存和数据库都查不到某个 key 的数据就写一个到 Redis 中去并设置过期时间,具体命令如下: SET key value EX 10086 。这种方式可以解决请求的 key 变化不频繁的情况,如果黑客恶意攻击,每次构建不同的请求 key,会导...

2022-04-15 19:55:47 1042

原创 LinkedList和ArrayLists的区别

一、是否保证线程安全ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全。二、数据结构1.Arraylist 底层是基于动态数组的数据结构,动态数组是在没指定数组大小时,申请默认大小的数组,当元素个数超过数组,系统会另个申请一个长度为当前长度1.5倍的数组,然后,把之前的数据拷贝到新建的数组。2.LinkedList 底层使用的是 双向链表 数据结构(JDK1.6 之前为循环链表,JDK1.7 取消了循环)。三、内存空间占用1.ArrayList主要空间使

2022-04-14 00:56:35 143

原创 Spring如何解决循环依赖

先说说什么是循环依赖?举例:简单的说就是A依赖B,B依赖A,这样就构成了循环依赖。@Servicepublic class TestService1 { @Autowired private TestService2 testService2; public void test1() { }} @Servicepublic class TestService2 { @Autowired private TestServic.

2022-04-10 23:00:39 769

原创 初识RPC

1、什么是 RPC?RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。比如两个不同的服务 A、B 部署在两台不同的机器上,当服务 A 想要调用服务 B 中的某个方法该,可以使用 HTTP请求,但是可能会比较麻烦。而RPC 的出现就是为了调用远程方法像调用本地方法一样简单。2、RPC原理 服务消费方(client)调用以本地调用方式调用服务; client stub接收到调用后负责将方法、

2022-04-10 20:27:57 976

原创 简单介绍消息队列

一、 什么是消息队列我们可以把消息队列看作是一个存放消息的容器,当我们需要使用消息的时候,直接从容器中去除消息供自己使用。消息队列是分布式系统中重要的组件之一。使用消息队列主要是为了通过异步处理提高系统性能和削峰/限流、降低系统耦合性。因为队列 Queue 是一种先进先出的数据结构,所以消费消息时也是按照顺序来消费的。二、使用消息队列的三点好处1.通过异步处理提高系统性能(减少响应所需时间)将用户的请求数据存储到消息队列之后就立即返回结果。随后,系统再对消息进...

2022-04-07 00:54:44 390

原创 事务隔离级别

一、什么是事务?事务是逻辑上的一组操作,要么都执行,要么都不执行。事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元,这个转账会涉及 到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。二、事务的特性(ACID) 原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成

2022-04-04 00:35:13 233

原创 SpringMVC 工作原理

流程说明(重要): 客户端(浏览器)发送请求,直接请求到 DispatcherServlet。 DispatcherServlet 根据请求信息调用 HandlerMapping,解析请求对应的 Handler。 解析到对应的 Handler(也就是我们平常说的 Controller 控制器)后,开始由 HandlerAdapter 适配器处理。 HandlerAdapter 会根据 Handler来调用真正的处理器来处理请求,并处理相应的业务逻辑。 处理器处理

2022-04-03 22:16:17 123

原创 SpringAOP,IOC实现原理

先说说生么是Spring框架?我们一般说 Spring 框架指的都是 Spring Framework,它是很多模块的集合,使用这些模块可以很方便地协助我们进行开发。这些模块是:核心容器、数据访问/集成,、Web、AOP(面向切面编程)、工具、消息和测试模块。比如:Core Container 中的 Core 组件是Spring 所有组件的核心,Beans 组件和 Context 组件是实现IOC和依赖注入的基础,AOP组件用来实现面向切面编程。Spring 官网列出的 Spring 的 6 个特征

2022-04-03 21:34:30 1585

原创 使用Md5进行字符串加密

在业务中,直接将密码存储在数据库中是不安全的,所以需要将密码加密后再存入数据库当中。MD5算法的算法特点如下:压缩性:针对不同长度待加密的数据、字符串等等,其都可以返回一个固定长度的MD5加密字符串。(通常32位的16进制字符串);加密不可逆:其加密过程几乎不可逆,除非维护一个庞大的Key-Value数据库来进行碰撞破解,否则几乎无法解开。容易计算:从原数据计算出MD5值很容易。抗修改:对于一个固定的字符串。数字等等,MD5加密后...

2022-04-03 20:12:31 6284

原创 JVM系列之对象的创建过程

java是一门面向对象的编程语言,在程序运行过程中无时无刻都有对象被创建。在语言层面上,创建对象通常(例外:复制、反序列化)仅仅是一个new关键字而已,而在虚拟机中对象的创建又是怎样的一个过程呢?1.检查当Java虚拟机遇到一条字节码new指令时,首先去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。2.分配内存在类加载检查通过后,将为新生对象分配内存。对象所需的内存大小在类加载完成后

2022-04-03 01:19:30 332

原创 JVM系列之内存分配与回收策略

1.对象优先在Eden分配大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC。HotSpot虚拟机提供了-XX:+PrintGCDetails这个收集器日志参数,告诉虚拟机在发生垃圾收集行为时打印内存回收日志,并且在进程退出时输出当前内存各区域分配情况。2.大对象直接进入老年代大对象就是指需要大量连续内存空间的Java对象,最经典型的大对象便是那种很长的字符串,或者元素数量很庞大的数组。避免大对象的原因是,在分配空间时,他容易导致

2022-04-02 22:54:37 1266

原创 final关键字

1、final修饰类final修饰的类不能被继承。因此final类的成员方法没有机会被覆盖,默认都是final的。在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会再被扩展,那么就设计为final类。final类里面的方法不能被重写,但可以被继承。2、final修饰方法当一个类的方法被final 关键字修饰后,这个类的子类将不能重写该方法。使用final方法的原因有二:第一、把方法锁定,防止任何继承类修改它的意义和实现。第二、高效。编译器在遇到调用f

2022-04-01 16:20:18 292

原创 try、catch中finally和return执行顺序

1.执行try中的returnpublic static int show() { try { return 1; } catch (Exception e) { return 2; } finally { System.out.println("finally模块被执行"); } } public static void main(String a

2022-04-01 12:35:48 3615

原创 Git基础

创建git仓库1.git init仓库管理工作区(workpace->暂存区(index)1.git add . #当前文件夹以及子文件夹 2.git add fileName #某个文件暂存区(index)->本地仓库(local repository)1.git commit -m '备注提交内容'克隆远程仓库1.git clone xxxx地址 (不加分支默认master) #默认拉取master分支代码 git ...

2022-03-30 10:40:39 162

原创 46. 全排列

题目:给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。示例1:输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例2:输入:nums = [0,1]输出:[[0,1],[1,0]]示例3:输入:nums = [1]输出:[[1]]题解:因为是不含重复数字数组,每次向数组里面放一个不重复数据,直到放满。List<Lis

2022-03-29 16:52:51 148

原创 简单介绍TCP,UDP 协议的区别

1. TCPTCP(Transmission Control Protocol,传输控制协议)是面向连接的、可靠的字节流服务,也就是说,在收发数据前,必须和对方建立可靠的连接。这一过程和打电话类似:先拨号振铃,等待对方接电话,说喂,再说自己是谁。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的传输层。2. UDPUDP 在传送数据之前不需要先建立连接,远地主机在收到 UDP 报文后,不需要给出任何确认。虽然 UDP 不提供可靠交付,但

2022-03-29 11:20:50 3454

原创 简单介绍redis五种数据类型

1.String数据类型string 是 redis 最基本的数据类型,最大能存储 512MB,一个 key 对应一个 value,是二进制安全的,意思是 redis 的 string 可以包含任何数据(比如jpg图片或者序列化的对象)。2.List 数据类型redis 列表是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或者尾部(右边).3.Hash数据类型(散列类型)redis中的散列可以看成具有String key和String value的map容器,可

2022-03-28 22:36:34 2430

原创 synchronized锁的升级过程

1.三种方式加锁1)修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁。2)静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁。3)修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。2.无锁无锁是指没有对资源进行锁定,所有的线程都能访问并修改同一个资源,但同时只有一个线程能修改成功。特点:修改操作会在循环内进行,线程会不断的尝试修改共享资源。如果没有冲突就修改成功并退出,否则就会继续循环尝试。如果有多个线程修改同一个值,必定

2022-03-28 21:54:59 1814

原创 synchronized部分简单用法

synchronized修饰静态/非静态方法 public static void main(String[] args) { Thread t1 = new Thread() { @Override public void run() { Person.m1("线程1"); } }; Thread t2 = new Thread() {

2022-03-19 23:55:26 339

原创 JVM系列之Java的类加载机制

类加载的时机一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,他的整个生命周期将会经历加载、验证、准备、解析、初始化、使用、卸载七个阶段,其中验证、准备、解析三部分统称为连接。什么情况下需要加载过程的第一阶段“加载”1.使用new关键字实例化对象的时候2.读取或设置一个类型的静态字段(被final修饰、已在编译期把结果放入常量池的静态字段除外)的时候。3.调用一个类型的静态方法的时候。4.使用java.lang.reflect包的方法对类型进行反射调用的时候。5.当初始化

2022-03-18 15:20:49 512

原创 JVM系列之经典垃圾收集器

Serial收集器

2022-03-16 00:35:08 360

原创 JVM系列之垃圾回收算法

一、如何判断某个对象是否为“垃圾”1.引用计数算法在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效计数值就减一;任何时刻计数器为零的对象就是不可能在被使用。引用计数算法虽然占用了一些额外的内存空间来进行计数,但原理简单,判断效率也很高,但是无法检测出循环引用。2.可达性分析算法基本思路就是通过一系列称为“GC Roots"的根对象作为起始节点,从这些结点开始,根据引用关系向下搜索,搜索过程所走过的路径成为”引用链“,如果某个对象到GC Roots间没有任何引

2022-03-14 00:40:15 824

原创 JVM系列之详解运行时数据区域

运行时数据区1.程序计数器是一块较小的内存空间,可以看作当前线程所执行字节码行号指示器。程序控制流的指示器,分支、循环、跳转、异常处理、线程回复等功能功能都需要依赖这个计数器完成。2.Java虚拟机栈3.方法栈4.方法区5.Java堆...

2022-03-13 20:34:20 1196

原创 实现链表的插入——头插/尾插

声明类:public class LinkList { LinkList next; int val; public LinkList(int val) { this.val = val; } public LinkList getNext() { return next; } public void setNext(LinkList next) { this.next = next;

2022-03-12 18:11:46 946

原创 java值传递问题

定义类:class Student { String name; int sex; public Student(String name, int sex) { this.name = name; this.sex = sex; } @Override public String toString() { return "Student{" + "name='" + na

2022-03-09 23:46:19 171

原创 三次握手和四次挥手

1.1.TCP 三次握手漫画图解简单示意图:1.客户端–发送带有 SYN 标志的数据包–一次握手–服务端2.服务端–发送带有 SYN/ACK 标志的数据包–二次握手–客户端3.客户端–发送带有带有 ACK 标志的数据包–三次握手–服务端1.2为什么要三次握手三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。第一次握手:Client 什么都不能确认;Server 确认了对方发送正常,

2022-02-19 11:34:31 121

原创 1996. 游戏中弱角色的数量

题目:你正在参加一个多角色游戏,每个角色都有两个主要属性:攻击 和 防御 。给你一个二维整数数组 properties ,其中 properties[i] = [attacki, defensei] 表示游戏中第 i 个角色的属性。如果存在一个其他角色的攻击和防御等级 都严格高于 该角色的攻击和防御等级,则认为该角色为 弱角色 。更正式地,如果认为角色 i 弱于 存在的另一个角色 j ,那么 attackj > attacki 且 defensej > defensei 。返回 弱角

2022-01-28 20:17:50 84

空空如也

空空如也

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

TA关注的人

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