自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Hpt的个人空间

热爱技术的Java狗

  • 博客(31)
  • 收藏
  • 关注

原创 SpringBoot-入门

1 系统要求● Java 8 & 兼容java14 .● Maven 3.3+● idea 2019.1.22 快速入门2.1、创建maven工程2.2、引入依赖<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <v

2022-01-06 14:00:57 108

原创 图解HTTP-简单的HTTP协议

图解HTTP

2022-01-05 19:53:09 776

原创 MyBatis-动态SQL

什么是动态SQL??MyBatis通过使用if,choose (when, otherwise),trim (where, set),foreach等标签可以组成非常灵活的SQL语句。

2022-01-02 16:13:02 443

转载 MyBatis-xml映射文件(上)

就是mybatis-config.xml最后mapper,就是去哪个文件去找SQL语句如何写CRUD(( ̄︶ ̄)↗ 滑稽)select这东西用的老频繁了,懂得都懂<select id="selectPerson" parameterType="int" resultType="hashmap"> SELECT * FROM PERSON WHERE ID = #{id}</select>神马意思?id:唯一标识,这个SQL语句叫啥,就是那个方法名呗paramet

2022-01-01 18:26:11 87

转载 MyBatis-xml配置

面型文档学习xml配置,也就是那个mybatis-config.xml文件开头<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">配置文档的顶层结构如下所示首先是property(属性)

2022-01-01 16:09:33 323

原创 Redis-单机数据库的实现-数据库

Redis服务器将所有的数据库都保存在服务器状态redisServer结构的db数组中db数组的每一项都是redisDB结构上图片数据库这么多怎么切换?SELECT 数字数据库键空间–以前老见到,就是不理解,现在?哼哼结构typedef struct redisDb { // ... // 数据库键空间,保存着数据库中的所有键值对 dict *dict; // ...} redisDb;举个例子redis> SET message "hello

2021-12-21 21:25:15 209

原创 Redis-数据结构与对象-对象

在前面的数个章节里, 我们陆续介绍了 Redis 用到的所有主要数据结构, 比如简单动态字符串(SDS)、双端链表、字典、压缩列表、整数集合, 等等。Redis 并没有直接使用这些数据结构来实现键值对数据库, 而是基于这些数据结构创建了一个对象系统, 这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象, 每种对象都用到了至少一种我们前面所介绍的数据结构。我们可以针对不同的使用场景, 为对象设置多种不同的数据结构实现, 从而优化对象在不同场景下的使用效率。除此之外, Re

2021-12-21 20:41:22 111

原创 Redis-数据结构与对象-整数集合

整数集合(intset)是集合键的底层实现之一: 当一个集合只包含整数值元素, 并且这个集合的元素数量不多时, Redis 就会使用整数集合作为集合键的底层实现。wtf ?好麻烦intset 结构表示一个整数集合typedef struct intset { // 编码方式 uint32_t encoding; // 集合包含的元素数量 uint32_t length; // 保存元素的数组 int8_t contents[];} intset

2021-12-21 19:11:02 73

原创 Redis-数据结构与对象-跳跃表

跳跃表(skiplist)是一种有序数据结构, 它通过在每个节点中维持多个指向其他节点的指针, 从而达到快速访问节点的目的。跳跃表支持平均 O(\log N) 最坏 O(N) 复杂度的节点查找, 还可以通过顺序性操作来批量处理节点。在大部分情况下, 跳跃表的效率可以和平衡树相媲美, 并且因为跳跃表的实现比平衡树要来得更为简单, 所以有不少程序都使用跳跃表来代替平衡树。Redis 使用跳跃表作为有序集合键的底层实现之一: 如果一个有序集合包含的元素数量比较多, 又或者有序集合中元素的成员(member)

2021-12-21 18:55:13 464

原创 Redis-数据结构与对象-字典

字典,emmm,怎么说呢,不是很能理解,我想想哈,一种用于保存键值对的抽象数据结构。Redis数据库底层就是字典实现的,毕竟key-value嘛,对数据库的增删改查操作也是构建在字典之上的。比如redis> SET msg "hello world"OK什么?这不是SDS吗?对,是SDS,但是他们之间的关系呢?key-msg value-" hw ",这个总要保存在字典里吧。怎么实现?Redis 的字典使用哈希表作为底层实现, 一个哈希表里面可以有多个哈希表节点, 而每个哈希表节点就保

2021-12-21 17:37:50 550

原创 Redis-数据结构与对象-链表

链表提供了高效的节点重排能力, 以及顺序性的节点访问方式, 并且可以通过增删节点来灵活地调整链表的长度,因为 Redis 使用的 C 语言并没有内置这种数据结构, 所以 Redis 构建了自己的链表实现。链表?emmm,经常做算法题的话简直不能在熟悉了一个Node节点,节点里面有属性,前置节点,后置节点代码typedef struct listNode { // 前置节点 struct listNode *prev; // 后置节点 struct listNode

2021-12-21 16:41:12 298

原创 Redis--数据结构与对象-简单动态字符串

redis> SET msg "hello world"OK客户端执行这个命令然后发生什么??Redis 将在数据库中创建了一个新的键值对, 其中:键值对的键是一个字符串对象, 对象的底层实现是一个保存着字符串 “msg” 的 SDS 。键值对的值也是一个字符串对象, 对象的底层实现是一个保存着字符串 “hello world” 的 SDS 。SDS?What is it?官方一点的回答Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串)

2021-12-21 16:05:12 213

原创 Redis--过期键的删除策略,淘汰策略

众所周知Redis是一个key-value数据库,还经常被当作缓存,当热点数据过期了怎么办?答:删除呗。。怎么删除,删除哪些数据??答:两种删除方式惰性过期:只有当访问一个key时,才会判断该key是否过期,过期则清除,该策略可以最大化的节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。定时删除在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作。对内存是最友好的,保证

2021-12-06 16:43:51 114

原创 Redis--持久化

Redis持久化Redis是内存数据库,如果不将内存中的数据库状态保存到磁盘,那么一旦服务器进程退出,服务器中的数据状态也会消失,所以Redis提供了持久化功能1 RDB是什么?原理是redis会单独创建(fork)一个与当前进程一模一样的子进程来进行持久化,这个子进程的所有数据都和原进程一模一样,会先将数据写道一个临时文件中(.rdb),带持久化结束了,再用这个临时文件替换上次持久化,整个过程,主进程不进行任何的io操作,这就确保了极高的性能。配置参数redis.conf配置文件中save

2021-12-06 16:27:07 939

原创 Redis--为什么你能这么快?

Redis快速的原因1.redis是基于内存的,内存的读写速度非常快;2.redis是单线程的,省去了很多上下文切换线程的时间;3.redis使用多路复用技术,可以处理并发的连接。非阻塞IO 内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间。为什么Redis是单线程的官方答案因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大

2021-12-06 12:58:27 88

原创 JUC--ReentrantLock

ReentrantLock基于AQS,它实现了公平锁和非公平锁,在开发中可以用它对共享资源进行同步,此外,和synchronized一样,ReentrantLock支持可重入锁,但ReentrantLock在调度上更灵活。首先来看ReentrantLock的继承关系,ReentrantLock实现了Lock接口。在面向对象的概念中,既然ReentrantLock是Lock的一种具体实现,呢么它必然拥有Lock的抽象意义。Lock只是定义了一些方法的语义,规定了它的 实现类需要满足这些语义。关于Ree

2021-11-30 16:01:12 226

原创 JUC--AQS设计

尝试设计CAS能够原子的对一个值进行写操作,那么可以将这个值(称为status)作为竞争资源的标记位。在多个线程想要去修改共享资源时,先来读取status,看能不能获取到写status的权限。拒绝其它线程的调用怎么设计呢?有两种业务场景:有的业务可能只是快速尝试获取一下共享资源,获取不到也没关系,会进行其它处理,有的业务线程一定要获取共享资源才能进行下一步处理,如果没有获取到,愿意等待。第一种场景直接返回共享资源当前的状态就可以了,第二种场景不适合自旋,我们设计一个队列让这些线程排队。队列头部的线程自旋

2021-11-30 12:24:45 275

原创 JUC--生产者消费者

1 题目:一个初始值为0的变量,两个线程对其交替操作,一个加一 一个减一import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class Test01 { /** * 线程 操作 资源类 * 判断 干活 通知 * 防止虚假唤醒

2021-11-18 16:53:56 58

原创 ThreadLocal的理解

一致性问题解决办法排队(例如:锁,互斥量,管程,屏障等)投票(例如Paxos,Raft等)这俩需要额外开销避免(例如:ThreadLocal等)定义正如 JDK 注释中所说的那样: ThreadLocal 类提供线程局部变量,它通常是私有类中希望将状态与线程关联的静态字段。一个线程局部变量在多个线程中,分别有独立的值。特点:简单(开箱即用),快速(无额外开销),安全(线程安全)场景多线程场景(资源持有,线程一致性,并发计算,线程安全等场景)在一个进程当中线程是资源调度的基本单位,操作系

2021-11-18 15:18:58 162

原创 对象的实例化内存布局与访问定位

对象的实例化创建对象的方式new,Class的newInstance():反射的方式,只能调用空参的构造器,权限必须是publicConstructor的newInstance(Xxx):反射的方式,可以调用空参,带参的构造器,权限没有要求。使用clone():不调用任何构造器,当前类需要实现Cloneable接口,实现clone()使用反序列化:从文件,网络中获取一个对象的二进制流...

2021-09-20 15:14:47 62

原创 Lambda表达式

什么是Lambda?Lambda是Java8添加的一个新特性,Lambda就是一个匿名函数为什么要使用Lambda使用Lambda表达式可以对一个接口进行非常简洁的实现。Lambda对接口的要求虽然可以使用Lambda表达式对某些接口进行简单实现,但要求接口中定义的必须要实现的抽象方法只能是一个。在Java8对接口加了一个新特性:default@FunctionalInterface修饰函数式接口的。接口中的抽象方法只能由一个/*Lambda表达式的基础语法:Lambda是一个匿名函数

2021-09-15 13:39:15 50

原创 String,StringBuilder和StringBuffer

1 String首先明确一点,String对象是不可变的,每一次修改String值都会创建一个全新的String对象,最初的String对象不动。当使用’+'连接字符串的时候,编译器会自动引入StringBuilder类,StringBuilder是可变的,在这个过程中只创建了一个对象,优化了设计。当循环的时候,最好还是手动创建StringBuilder然后用append等方法进行操作StringBuilder和StringBufferStringBuilder:可变的,不是线程安全的Strin

2021-08-20 19:35:47 84

原创 Java动态代理

动态代理是基于反射机制1 代理1.1 初步理解客户–>代理–>目标(代理和目标功能一致)买家–>商家–>厂家老中间商了张三发短信 ----子公司----中国移动1.2 代理模式代理模式是指,为其它对象提供一种代理以控制对这个对象的访问,在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户类和目标对象之间起到中介作用 ----百度百科《代理模式》使用代理对象,是为了在不修改目标对象的基础上,增强主业务的逻辑功能增强,控制访问2.1 静态代

2021-08-20 17:32:25 56

原创 关于JDK1.8时的接口的想法

jdk1.8之前,interface之中可以定义变量和方法,然后变量都必须时public static final的(感觉就是个常量,虽然不知道干嘛的,存在即合理),方法都必须是public abstract的,换句话说,就是想要继承接口,必须实现里面的方法。嘿,这时候就像适配器结构,我们有一个类肯定只想要接口里面的一部分方法。一个父类继承接口,然后默认实现方法,空方法都行,然后我们的类继承这个父类,对想要的方法重写,完美。在servlet中有这个体现,HttpServlet上面就有一个父类或祖先类,实现

2021-08-05 08:29:16 152

原创 Spring MVC

首先了解MVC//本文是在学习狂神说的springMVC记录下来的笔记,方便自己复习,有错误的地方请指出,共同进步。Model(模型 dao,service)View(视图,jsp)Controller(控制器 servlet)是一种软件规范约定优于配置功能强大:支持RESTful风格,数据验证,格式化,本地化等1 环境搭建<dependencies> <dependency> <groupId>junit&lt

2021-07-17 16:44:33 48

原创 虚拟机基础故障基础处理工具

本文只介绍基础的工具,无论JDK发展到了什么版本,这些基础的工具命令并不会过时和浪费jps:虚拟机进程状况工具可以列出正在运行的虚拟机进程,并显示虚拟机执行主类名称以及这些进程的本地虚拟机唯一ID。命令格式 jps [options][hostid]参数 hostid 为RMI注册表中的注册的主机名jps工具主要选项:-q:只输出ID,省略主类名称-m:输出虚拟机进程启动时传递给主类main()函数的参数-l:输出主类的全名,如果进程执行的是JAR包,则输出JAR路径-v:输出虚拟机进程

2021-04-11 10:10:42 138

原创 Java虚拟机内存区域

首先要知道Java虚拟机内存区域是我们学习JVM的第一步而java虚拟机有以下几个区域1 程序计数器几个关键字:行号指示器,线程私有,执行Java方法还是Native方法行号指示器:程序计数器(Program Counter Register)是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。在虚拟机概念模型中,字节码解释器工作时就是通过改变计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。线程私有:程序计数器是

2021-04-10 11:02:04 92

原创 总结异常(无代码)

Throwable:有两个重要的子类:Exception和Error ,它们各又包含大量的子类Error(错误):是程序无法处理的错误,表示运行应用程序中较为严重的问题,代码运行时出的问题。如:OutOfMemoryError,StackOverFlowError ,它们是Virtual MachineError。还有类定义错误NoClassDefFoundError等。这些错误不可查。Exception(异常):重要子类:RuntimeException类 和 IOException异常和错误的区

2021-04-02 09:21:02 59

原创 缓存和缓冲

1,缓冲 Buffer缓冲的作用就是协调上下层应用之间的性能差异上下层的性能差异会导致数据的不协调,需要加一个缓冲区,通过缓冲区的缓冲,当上层组件性能优于下层组件的时候,缓冲可以有效减少上层组件对下层组件等待的组织基于这样的结构,上层组件就不需要等待下层组件完全接收全部数据,即可返回进行其他操作,加快了上层组件的处理速度,从而提升整个系统的性能。BufferedWriter 有两个构造函数BufferedWriter(Writer writer){}BufferedWriter(Writer wr

2021-02-17 10:50:29 282

原创 List集合遍历的几种方式

public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("wo"); list.add("shi"); list.add("yi"); list.add("ge"); list.add("hao"); list.add("ren"); for (int i = 0; i < list.size(

2021-02-14 08:25:45 134

原创 Java中 final finally finalize有什么区别?(小白留给自己的笔记)

首先,final是一个关键字,英文是最终的,不可变的。 finally也时一个关键字,和try联合使用,使用在异常处理机制当中,finally语句块中的代码一定会执行finalize()是Object类当中的一个方法,finalize()是一个标识符 关于final的补充:final修饰的类无法被继承final修饰的方法无法被覆盖final修饰的变量一旦赋值就不会变final修饰的引用,只能指向一个对象final修饰的实例变量一般加static修饰,放在常量池中节省内存,创建100 分对象.

2021-02-09 15:54:44 123

空空如也

空空如也

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

TA关注的人

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