自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

帆的博客

小白小白

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

原创 通过自定义注解 +AOP 切片实现敏感词的过滤

在 Java 中创建一个新的文件,并为注解定义一个新的接口,例:SensitiveFilter.java。@Target(ElementType.METHOD) // 表示这个注解可以用于方法上@Retention(RetentionPolicy.RUNTIME) // 表示这个注解在程序运行时是可访问的// 这个方法中的 text 参数将被过滤。

2023-10-11 18:28:04 299

原创 Map,List,Set 等集合以及底层数据结构

集合类存放于java.util包中。集合类存放的都是对象的引用,而非对象本身。常见的集合主要有三种——Set(集)、List(列表)和Map(映射)。其中,List和Set都实现了 Collection 接口,并且List和Set也是接口,而Map 为独立接口。常见的实现类如下:List 的实现类有:ArrayList、Vector、LinkedList;Set的实现类有:HashSet、LinkedHashSet、TreeSet;Map。

2023-09-07 17:12:45 763

原创 反射代码详解

使用获取到的无参构造函数创建该类的实例。这个方法会调用类的无参构造函数来初始化对象,并返回一个新创建的对象。方法接受一个参数,用于指定构造函数的参数类型,因此传入。对象包含了有关类的元信息,允许您在运行时检查和操作类。的值是一个类的全限定名(包括包名的类名),比如。是所有类的基类,因此可以用它来引用任何类的对象。变量,该变量包含了上一行代码中获取的类的。获取该类的无参构造函数(构造器),,那么上述代码将加载并返回该类的。中包含的类名来获取对应类的。最终,将新创建的对象赋值给。想通过反射机制创建对象。

2023-09-05 22:13:34 254

原创 java中方法的执行顺序

构造函数:构造函数有名称,与类名相同,可以有参数列表,用于接受初始化参数。构造函数的参数列表和方法参数一样,可以有零个或多个参数。构造代码块:构造代码块没有名称,它位于类中,使用一对花括号 {} 包裹起来,并且没有参数列表。构造代码块不接受任何参数。构造函数:需要显式调用以创建对象。构造函数的调用通常由 new 关键字触发。构造代码块:在创建对象时自动执行,不需要显式调用。

2023-09-05 22:01:25 275

原创 基础——内部类,多态

的类。它的作用域被限制在包含它的方法中,通常用于解决某个方法的特定问题。

2023-09-05 21:45:48 84

原创 Spring——Spring读取文件

更对内容请查看官方文档:https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config。很多时候我们需要将一些常用的配置信息比如阿里云oss配置、发送短信的相关信息配置等等放到配置文件中。下面我们来看一下 Spring 为我们提供了哪些方式帮助我们从配置文件中读取这些配置信息。

2023-08-30 16:16:16 479

原创 Spring——RESTful Web服务

本节我们将开发一个简单的 RESTful Web 服务。传统的 MVC 模式开发会直接返回给客户端一个视图,但是 RESTful Web 服务一般会将返回的数据以 JSON 的形式返回,这也就是现在所推崇的前后端分离开发。为了节省时间,本篇内容的代码是在Spring Boot 版 Hello World & Spring Boot 项目结构分析基础上进行开发的。

2023-08-29 19:52:41 434

原创 Spring——Spring Boot基础

这一点在我们平时开发中也经常用到,比如我们通常会提一个测试基类,这个基类包含了我们写测试所需要的一些基本的注解和一些依赖。上面是我截取的一段控制台打印出的内容,通过这段内容我们就知道了 Spring Boot 默认使用的 Tomact 内置 web 服务器,项目被运行在我们指定的 8333 端口上,并且项目根上下文路径是 “/”。我们直接像运行普通 Java 程序一样运行它,由于 Spring Boot 本身就嵌入 servlet 容器的缘故,我们的 web 项目就运行成功了, 非常方便。

2023-08-29 19:41:52 759

原创 Spring——Spring基础

随着 Spring 轻量级开发框架的流行,Spring 生态圈出现了 Spring MVC 框架, Spring MVC 是当前最优秀的 MVC 框架。的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到HTTP 响应(Response)对象的 body 中,通常用来返回 JSON或者 XML 数据,返回 JSON 数据的情况比较多。的话一般使用在要返回一个视图的情况,这种情况属于比较传统的Spring MVC 的应用,对应于前后端不分离的情况。如果我们的切面比较少,那么两者性能差异不大。

2023-08-29 17:35:35 288

原创 数据库——redis内存淘汰,持久化机制

当子进程完成创建新 AOF 文件的工作之后,服务器会将重写缓冲区中的所有内容追加到新 AOF 文件的末尾,使得新旧两个 AOF 文件所保存的数据库状态一致。Redis 创建快照之后,可以对快照进行备份,可以将快照复制到其他服务器从而创建具有相同数据的服务器副本(Redis 主从结构,主要用来提高 Redis 性能),还可以将快照留在原地以便重启服务器的时候使用。AOF 重写可以产生一个新的 AOF 文件,这个新的 AOF 文件和原有的 AOF 文件所保存的数据库状态一样,但体积更小。

2023-08-24 18:15:00 818 1

原创 数据库——redis过期时间

过期字典的键指向Redis数据库中的某个key(键),过期字典的值是一个long long类型的整数,这个整数保存了key所指向的数据库键的过期时间(毫秒精度的UNIX时间戳)。很多时候,我们的业务场景就是需要某个数据只在某一时间段内存在,比如我们的短信验证码可能只在1分钟内有效,用户登录的 token 可能只在 1 天内有效。如果假设你设置了一批 key 只能存活 1 分钟,那么 1 分钟后,Redis 是怎么对这批 key 进行删除的呢?一般情况下,我们设置保存的缓存数据的时候都会设置一个过期时间。

2023-08-24 15:00:00 365

原创 数据库——Redis 没有使用多线程?为什么不使用多线程?

虽然说 Redis 是单线程模型,但是, 实际上,不过,Redis 4.0 增加的多线程主要是针对一些大键值对的删除操作的命令,使用这些命令就会使用主处理之外的其他线程来“异步处理”。大体上来说,

2023-08-24 10:36:39 787

原创 数据库——Redis 单线程模型详解

(Netty 的线程模型也基于 Reactor 模式,Reactor 模式不愧是高性能 IO 的基石),这套事件处理模型对应的是 Redis 中的文件事件处理器(file event handler)。当被监听的套接字准备好执行连接应答(accept)、读取(read)、写入(write)、关 闭(close)等操作时,与操作相对应的文件事件就会产生,这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件。《Redis 设计与实现》有一段话是如是介绍文件事件的,我觉得写得挺不错。

2023-08-24 10:32:47 780

原创 数据库——Redis 常见数据结构以及使用场景分析

string 数据结构是简单的 key-value 类型。虽然 Redis 是用 C 语言写的,但是 Redis 并没有使用 C 的字符串表示,而是自己构建了一种。

2023-08-24 10:29:25 882

原创 数据库——缓存数据

一般像 MySQL 这类的数据库的 QPS 大概都在 1w 左右(4 核 8g) ,但是使用 Redis 缓存之后很容易达到 10w+,甚至最高能达到 30w+(就单机 redis 的情况,redis 集群的话会更高)。所以,直接操作缓存能够承受的数据库请求数量是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。但是,如果说,用户访问的数据属于高频数据并且不会经常改变的话,那么我们就可以很放心地将该用户访问的数据存在缓存中。

2023-08-24 10:18:02 122

原创 数据库——redis介绍

不过,了解 Redis 和 Memcached 的区别和共同点,有助于我们在做相应的技术选型的时候,能够做到有理有据!因为,本地缓存只在当前服务里有效,比如如果你部署了两个相同的服务,他们两者之间的缓存数据是无法共同的。后来,随着 Redis 的发展,大家慢慢都转而使用更加强大的 Redis 了。相信看了上面的对比之后,我们已经没有什么理由可以选择使用 Memcached 来作为自己项目的分布式缓存了。,也就是它是内存数据库,所以读写速度非常快,因此 Redis 被广泛应用于缓存方向。

2023-08-23 17:28:30 506

原创 数据库——事务,事务隔离级别

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

2023-08-23 17:19:07 709

原创 数据库——MySQL高性能优化规范

索引 NULL 列需要额外的空间来保存,所以要占用更多的空间进行比较和计算时要对 NULL 值做特别的处理。

2023-08-23 17:10:00 773

原创 数据结构——布隆计算器

布隆过滤器(Bloom Filter)是一个叫做 Bloom 的老哥于1970年提出的。我们可以把它看作由二进制向量(或者说位数组)和一系列随机映射函数(哈希函数)两部分组成的数据结构。相比于我们平时常用的的 List、Map 、Set 等数据结构,它占用空间更少并且效率更高,但是缺点是其返回的结果是概率性的,而不是非常准确的。理论情况下添加到集合中的元素越多,误报的可能性就越大。并且,存放在布隆过滤器的数据不容易删除。位数组中的每个元素都只占用 1 bit ,并且每个元素只能是 0 或者 1。

2023-08-22 17:00:00 759

原创 数据结构——图

有的关系是有方向的,比如父子关系,师生关系,微博的关注关系,A是B的爸爸,但B肯定不是A的爸爸,A关注B,B不一定关注A。边表示的是顶点之间的关系,有的关系是双向的,比如同学关系,A是B的同学,那么B也肯定是A的同学,那么在表示A和B的关系时,就不用关注方向,用不带箭头的边表示,这样的图就是无向图。对于一个关系,如果我们既关心关系的有无,也关心关系的强度,比如描述地图上两个城市的关系,需要用到距离,那么就用带权图来表示,带权图中的每一条边一个数值表示权值,代表关系的强度。图在我们日常生活中的例子很多!

2023-08-22 12:04:02 721

原创 数据结构——线性数据结构(数组,链表,栈,队列)

链表(LinkedList)虽然是一种线性表,但是并不会按线性的顺序存储数据,使用的不是连续的内存空间来存储数据。链表的插入和删除操作的复杂度为 O(1) ,只需要知道目标位置元素的上一个元素即可。但是,在查找一个节点或者访问特定位置的节点的时候复杂度为 O(n)。使用链表结构可以克服数组需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但链表不会节省空间,相比于数组会占用更多的空间,因为链表中每个节点存放的还有指向其他节点的指针。

2023-08-22 11:52:40 665

原创 操作系统——shell编程

简单来说“Shell编程就是对一堆Linux命令的逻辑化处理”。W3Cschool 上的一篇文章是这样介绍 Shell的,如下图所示。Shell编程中一般分为三种变量:仅在当前 Shell 实例中有效,其他 Shell 启动的程序不能访问局部变量。Linux已定义的环境变量(环境变量, 例如:$PATH, $HOME 等…, 这类变量我们可以直接使用),使用env命令可以查看所有的环境变量,而set命令既可以查看环境变量也可以查看自定义变量。Shell变量。

2023-08-22 11:42:19 390

原创 操作系统——Linux基本命令

分别对应文件的属主(owner),属组(group)和其他用户(other),通过这样的机制来限制哪些用户、哪些组可以对特定的文件进行什么样的操作。Linux 中的打包文件一般是以.tar 结尾的,压缩的命令一般是以.gz 结尾的。Linux 系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。示例:修改/test 下的 aaa.txt 的权限为文件所有者有全部权限,文件所有者所在的组有读写权限,其他用户只有读的权限。

2023-08-21 11:22:10 167

原创 操作系统——Linux基础知识

类 Unix 系统: Linux 是一种自由、开放源码的类似 Unix 的操作系统Linux 本质是指 Linux 内核: 严格来讲,Linux 这个词本身只表示 Linux 内核,单独的 Linux 内核并不能成为一个可以正常工作的操作系统。所以,就有了各种 Linux 发行版。在 Linux 操作系统中,所有被操作系统管理的资源,例如网络接口卡、磁盘驱动器、打印机、输入输出设备、普通文件或是目录都被看作是一个文件。一切都是文件。

2023-08-21 11:13:34 86

原创 操作系统——虚拟内存

什么是虚拟内存(Virtual Memory)?这个在我们平时使用电脑特别是 Windows 系统的时候太常见了。很多时候我们使用点开了很多占内存的软件,这些软件占用的内存可能已经远远超出了我们电脑本身具有的物理内存。为什么可以这样呢?正是因为虚拟内存的存在,通过虚拟内存可以让程序可以拥有超过系统物理内存大小的可用内存空间。另外,虚拟内存为每个进程提供了一个一致的、私有的地址空间,它让每个进程产生了一种自己在独享主存的错觉(每个进程拥有一片连续完整的内存空间)。这样会更加有效地管理内存并减少出错。虚拟内存。

2023-08-20 20:52:42 379

原创 操作系统——操作系统内存管理基础

操作系统的内存管理主要是做什么?操作系统的内存管理主要负责内存的分配与回收(malloc 函数:申请内存,free 函数:释放内存),另外地址转换也就是将逻辑地址转换成相应的物理地址等功能也是操作系统内存管理做的事情。为了提高内存的空间性能,提出了多级页表的概念;但是提到空间性能是以浪费时间性能为基础的,因此为了补充损失的时间性能,提出了快表(即 TLB)的概念。不论是快表还是多级页表实际上都利用到了程序的局部性原理,局部性原理在后面的虚拟内存这部分会介绍到。

2023-08-20 20:49:40 124

原创 操作系统——进程和线程

线程是进程划分成的更小的运行单位,一个进程在其执行的过程中可以产生多个线程。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。线程执行开销小,但不利于资源的管理和保护;而进程正相反。

2023-08-20 20:44:23 103

原创 操作系统——操作系统概念和系统调用

操作系统(Operating System,简称 OS)是管理计算机硬件与软件资源的程序,是计算机的基石。操作系统本质上是一个运行在计算机上的软件程序 ,用于管理计算机硬件和软件资源。举例:运行在你电脑上的所有应用程序都通过操作系统来调用系统内存以及磁盘等等硬件。操作系统存在屏蔽了硬件层的复杂性。操作系统就像是硬件使用的负责人,统筹着各种相关事项。操作系统的内核(Kernel)是操作系统的核心部分,它负责系统的内存管理,硬件设备的管理,文件系统的管理以及应用程序的管理。

2023-08-20 20:39:04 153

原创 计算机网络——OSI与TCP/IP各层的结构与功能,都有哪些协议?

上面我们对计算机网络的五层体系结构有了初步的了解,下面附送一张七层体系结构图总结一下。

2023-08-18 11:41:08 2312

原创 JVM——配置常用参数,GC调优策略

但是对于大对象这种做法却值得商榷,大对象如果首次在新生代分配可能会出现空间不足导致很多年龄不够的小对象被分配的老年代,破坏新生代的对象结构,可能会出现频繁的 full gc。**策略 1:**将新对象预留在新生代,由于 Full GC 的成本远高于 Minor GC,因此尽可能将对象分配在新生代是明智的做法,实际项目中根据 GC 日志分析新生代空间大小分配是否合理,适当通过“-Xmn”命令调节新生代大小,最大限度降低新对象直接进入老年代的情况。**策略 3:**合理设置进入老年代对象的年龄,

2023-08-17 21:38:27 1080

原创 JVM——JVM参数指南

在本篇文章中,你将掌握最常用的 JVM 参数配置。如果对于下面提到了一些概念比如堆、

2023-08-17 21:33:04 1295

原创 JVM——类加载器

JVM 中内置了三个重要的 ClassLoader,除了 BootstrapClassLoader 其他类加载器均由 Java 实现且全部继承自BootstrapClassLoader(启动类加载器):最顶层的加载类,由C++实现,负责加载目录下的jar包和类或者或被参数指定的路径中的所有类。ExtensionClassLoader(扩展类加载器):主要负责加载目录目录下的jar包和类,或被系统变量所指定的路径下的jar包。AppClassLoader(应用程序类加载器)

2023-08-17 21:24:35 1146

原创 JVM——类文件结构

在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为.class的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以 Java 程序运行时比较高效,而且,由于字节码并不针对一种特定的机器,因此,Java 程序无须重新编译便可在多种不同操作系统的计算机上运行。Clojure(Lisp 语言的一种方言)、Groovy、Scala 等语言都是运行在 Java 虚拟机之上。

2023-08-17 21:14:29 1433

原创 JVM——JDK 监控和故障处理工具总结

VisualVM(All-in-One Java Troubleshooting Tool)是到目前为止随 JDK 发布的功能最强大的运行监视和故障处理程序,官方在 VisualVM 的软件说明中写上了“All-in-One”的描述字样,预示着他除了运行监视、故障处理外,还提供了很多其他方面的功能,如性能分析(Profiling)。生成线程快照的目的主要是定位线程长时间出现停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的原因。:输出对应名称的参数的具体值。

2023-08-17 21:05:58 669

原创 JVM——JVM 垃圾回收

问题答案在文中都有提到如何判断对象是否死亡(两种方法)。简单的介绍一下强引用、软引用、弱引用、虚引用(虚引用与软引用和弱引用的区别、使用软引用能带来的好处)。如何判断一个常量是废弃常量如何判断一个类是无用的类垃圾收集有哪些算法,各自的特点?HotSpot 为什么要分为新生代和老年代?常见的垃圾回收器有哪些?介绍一下 CMS,G1 收集器。Minor Gc 和 Full GC 有什么不同呢?

2023-08-17 21:02:33 842

原创 JVM——类的生命周期

只要想通一点就好了,jdk自带的BootstrapClassLoader,ExtClassLoader,AppClassLoader负责加载jdk提供的类,所以它们(类加载器的实例)肯定不会被回收。而我们自定义的类加载器的实例是可以被回收的,所以使用我们自定义加载器加载的类是可以被卸载掉的。所以,在JVM生命周期类,由jvm自带的类加载器加载的类是不会被卸载的。综上,解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程,也就是得到类或者字段、方法在内存中的指针或者偏移量。,这些内存都将在方法区中分配。

2023-08-17 20:51:14 462

原创 JVM——Java 内存区域详解

介绍下 Java 内存区域(运行时数据区)Java 对象的创建过程(五步,建议能默写出来并且要知道每一步虚拟机做了什么)对象的访问定位的两种方式(句柄和直接指针两种方式)对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像 C/C++程序开发程序员这样为每一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题。

2023-08-11 15:33:26 584

原创 并发——AQS原理以及AQS同步组件总结

AQS 的全称为(AbstractQueuedSynchronizer),这个类在 java.util.concurrent.locks 包下面。AQS 是一个用来构建锁和同步器的框架,使用 AQS 能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的 ReentrantLock,Semaphore,其他的诸如 ReentrantReadWriteLock,SynchronousQueue,FutureTask(jdk1.7) 等等皆是基于 AQS 的。

2023-08-11 15:25:09 135

原创 并发——Atomic 原子类总结

Atomic 翻译成中文是原子的意思。在化学上,我们知道原子是构成一般物质的最小单位,在化学反应中是不可分割的。在我们这里 Atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。所以,所谓原子类说简单点就是具有原子/原子操作特征的类。并发包的原子类都存放在下,如下图所示。根据操作的数据类型,可以将JUC包中的原子类分为4类基本类型使用原子的方式更新基本类型AtomicInteger:整型原子类AtomicLong:长整型原子类。

2023-08-11 15:19:56 156

原创 并发——JDK 提供的并发容器总结

JDK 提供的这些容器大部分在包中。线程安全的 HashMap线程安全的 List,在读多写少的场合性能非常好,远远好于 Vector.高效的并发队列,使用链表实现。可以看做一个线程安全的 LinkedList,这是一个非阻塞队列。这是一个接口,JDK 内部通过链表、数组等方式实现了这个接口。表示阻塞队列,非常适合用于作为数据共享的通道。跳表的实现。这是一个 Map,使用跳表的数据结构进行快速查找。在很多应用场景中,读操作可能会远远大于写操作。

2023-08-11 15:15:42 146

空空如也

空空如也

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

TA关注的人

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