java
文章平均质量分 58
可爱的小小小狼
精读各种经典书籍,喜欢总结读书笔记。
展开
-
堆和优先级队列
使用比较器(Comparator)来创建一个自定义优先级的优先级队列。// 定义一个比较器,用于实现大顶堆@Override// 降序排列// 创建一个大顶堆优先级队列// 插入元素// 输出优先级最高(最大)的元素// 应该输出20// 依次取出优先级最高的元素while (!// 输出顺序应该是: 20, 15, 10, 5如果要在优先级队列中存储自定义对象,可以实现Comparable接口,或提供Comparator来定义优先级。int age;原创 2024-05-19 13:37:09 · 285 阅读 · 0 评论 -
jvm的元空间
元空间(Metaspace)是Java虚拟机(JVM)用于存储类元数据的内存区域,取代了JDK 8之前的永久代(PermGen)。本地内存:元空间使用本地内存(Native Memory)而不是堆内存,这意味着它不受堆内存大小的限制。本地内存指的是由操作系统直接管理的内存,而不是由Java虚拟机(JVM)内部的垃圾回收机制管理的内存区域。原创 2024-05-19 00:02:07 · 309 阅读 · 0 评论 -
实时数据推送——长轮询,短轮询,长连接
短轮询是最简单的一种数据推送方式,客户端在固定的时间间隔(例如每隔5秒)向服务器发送请求,询问是否有更新的数据。服务器立即处理请求并返回数据,不论数据是否真的已经更新。原创 2024-05-12 13:15:18 · 231 阅读 · 0 评论 -
雪花算法》
用于生成唯一 ID 的分布式算法原创 2024-05-12 12:33:39 · 200 阅读 · 0 评论 -
接口的幂等性
由于网络延迟、超时、重试等因素,可能会导致客户端多次发送相同的请求。通过保证接口的幂等性,无论客户端发送多少次相同的请求,服务器端都会保持相同的状态变化,从而确保系统的稳定性和数据的一致性。原创 2024-05-12 12:27:31 · 444 阅读 · 0 评论 -
char和byte和string
我们说String不可变,指的就是value在栈中的引用地址不可变。在 JDK 8.0 中,方法区(永久代被元空间取代了;JDK 7、8以后的字符串常量池被转移到了堆中。常量池中存储的是字符串常量的引用,而不是字符串对象本身,实际的char[]数组存储在堆内存中,而字符串常量池中存储的是对这些字符串对象的引用。当使用双引号创建一个字符串常量时,这个常量首先会被存储在常量池中。如果常量池中已经存在相同内容的字符串,则会返回该字符串的引用,而不是创建一个新的字符串对象。原创 2024-05-09 11:53:19 · 171 阅读 · 0 评论 -
异常抛出过程
当异常被抛出(throw关键字)时,它会沿着调用栈向上抛出,直到找到适当的异常处理器或者到达了程序的顶层(如 main 方法)。如果到了main方法还没被捕获,就会终止程序。如果异常在抛出过程中被捕获并处理了,那么程序会在处理完异常后返回到抛出异常的地方,并继续执行后续的代码。原创 2024-04-30 10:26:09 · 98 阅读 · 0 评论 -
maven教程
我们在输入 mvn 命令的时候 比如 mvn clean,clean 对应的就是 Clean 生命周期中的 clean 阶段。但是 clean 的具体操作是由 maven-clean-plugin 来实现的。每个生命周期中都包含着一系列的阶段(phase)。这些 phase 就相当于 Maven 提供的统一的接口,然后这些 phase 的实现由 Maven 的插件来完成。所以说 Maven 生命周期的每一个阶段的具体实现都是由 Maven 插件实现的。原创 2024-04-28 16:34:44 · 261 阅读 · 0 评论 -
java中资源的线程安全的实现
实现线程安全的资源管理通常需要考虑以下几种方法:使用锁机制:使用 Java 中的锁机制,如 synchronized 关键字或 Lock 接口及其实现类,可以确保在任何时候只有一个线程可以访问共享资源。这样可以保证资源的一致性和完整性,但可能会影响性能。使用并发数据结构:Java 并发包提供了一系列线程安全的数据结构,如 ConcurrentHashMap、ConcurrentLinkedQueue 等。这些数据结构内部使用了复杂的算法和同步机制,能够在保证线程安全的同时提供较高的并发性能。原创 2024-04-16 00:34:01 · 330 阅读 · 0 评论 -
java中的正则表达式匹配
匹配单个字符\d:匹配一个数字字符。\w:匹配一个字母、数字或下划线字符。\s:匹配一个空白字符(空格、制表符、换行符等)。.:匹配除换行符外的任意字符。量词*:匹配前一个元素零次或多次。+:匹配前一个元素一次或多次。?:匹配前一个元素零次或一次。{n}:匹配前一个元素恰好 n 次。{n,}:匹配前一个元素至少 n 次。{n,m}:匹配前一个元素至少 n 次,但不超过 m 次。边界匹配^:匹配输入字符串的开头。$:匹配输入字符串的结尾。\b:匹配单词边界。\B:匹配非单词边原创 2024-04-15 11:01:32 · 159 阅读 · 0 评论 -
java的线程安全
当多个线程调用一个对象时,不需要考虑额外的同步和调用顺序,调用这个对象都可以获得正确的结果,那么这个对象就是线程安全的。原创 2024-04-06 20:42:58 · 172 阅读 · 0 评论 -
java内存模型和线程
即关注在虚拟机中把变量值存储到内存和从内存中取出的底层实现。这里讨论的变量值是除了局部变量和方法参数的,因为两者存储在线程私有的栈中,不会有并法问题。JVM会主动使用寄存器和缓存硬件来JMM。在JMM中每个线程有自己的工作内存。JMM定义了所有的变量都存储在主内存中,线程的工作内存中保存被该线程使用的变量的副本。线程对变量的操作都必须在工作内存中进行,而不能操作主内存中的数据。线程间的变量传递也需要主内存当中间人。原创 2024-04-06 19:54:07 · 728 阅读 · 0 评论 -
jvm的垃圾回收策略
对象类元数据: 类的元数据包括类的结构信息、方法信息、字段信息等,它们存储在方法区(Metaspace)中。当一个类不再被引用时,垃圾回收器会卸载这个类,并释放其在方法区中占用的内存空间。线程栈和本地方法栈类加载器: 类加载器负责加载类并生成类的元数据。当一个类加载器不再被使用时,垃圾回收器会清理它所加载的类及其相关的元数据,并释放相应的内存空间。其他资源: 包括文件句柄、网络连接、数据库连接等外部资源。原创 2024-04-04 12:32:21 · 1304 阅读 · 0 评论 -
java中的string和stringbuff和stringBuilter
String类是引用类型,而不是基础数据类型。所有双引号括住的都是String类。所有String类都是在方法区的字符常量池中存储数据,通过new String(“example”);创建的字符串在堆中有一个对象,其内容是一个指向字符常量池中一个指针。而双引号创建的String类,没有堆中对象,而是直接指向字符常量池。字符常量池中的值是唯一的,即创建多个相同值的String,指向的都是一个字符常量。原创 2024-04-02 21:08:01 · 388 阅读 · 0 评论 -
Java容器
它实现了Set接口,底层使用了一个LinkedHashMap来存储元素,其中键是集合中的元素,值是一个常量对象。HashSet的内部实现就是基于HashMap的,它使用HashMap来存储元素,并将元素视为键,而值则是一个常量对象。V put(K key, V value):将指定的键值对添加到映射中,如果键已存在,则替换对应的值,并返回被替换的值。V remove(Object key):从映射中删除指定键的映射关系,并返回对应的值。V get(Object key):获取指定键对应的值。原创 2024-04-02 15:50:53 · 357 阅读 · 0 评论 -
java中的Arrays类的常用操作
/ newArr为 {1, 2, 3, 0, 0}boolean isEqual = Arrays.equals(arr1, arr2);// isEqual为true。// arr变成 {7, 7, 7, 7, 7}Arrays类位于 java.util 包中,主要包含了操作数组的各种方法。原创 2024-04-02 12:05:34 · 150 阅读 · 0 评论 -
java的HashMap
java的HashMap。原创 2024-03-27 15:04:33 · 132 阅读 · 0 评论 -
AMPQ和rabbitMQ
在绑定时可以指定一个或多个键值对作为匹配规则,只有当消息的头部属性和绑定规则完全匹配时,消息才会被路由到相应的队列。绑定在direct exchange上的队列都需要设置其路由键,当消息到达direct exchange后,会根据消息的路由键(消息路由键=队列绑定在Direct exchange上的路由键)转发到队列。主题交换器可以根据消息的路由键和队列的绑定键之间的模式匹配规则进行路由。扇形交换器会将收到的消息直接广播到与之绑定的所有队列。一个消息到达会尝试所有绑定队列的路由匹配模式,如果匹配就路由。原创 2024-03-20 11:18:29 · 623 阅读 · 0 评论 -
cookie,session和token
HTTP 协议是无状态的,Cookie,session和token都是为了实现用户的状态的持久性。对于敏感信息和大量数据,最好将其存储在服务器端,而对于较小、非敏感的数据,可以考虑存储在客户端。原创 2024-03-19 00:23:31 · 326 阅读 · 0 评论 -
ThreadLocal变量
ThreadLocal变量是线程私有的,也就是多个线程使用相同名字的ThreadLocal对象,使用的是不同线程里面的不同实例。原创 2024-03-18 23:45:31 · 239 阅读 · 0 评论 -
阻塞和异步
可伸缩性差:阻塞模式下,每个连接通常都会关联一个线程,当连接数增加时,线程数也会相应增加,这样会占用大量的系统资源,导致系统的可伸缩性较差。资源浪费:在阻塞模式下,当一个线程被阻塞时,它无法执行其他任务,但却会持续占用系统的线程资源。上下文切换开销大:在阻塞模式下,由于线程被阻塞时需要切换到其他线程执行,频繁的线程切换会导致较大的上下文切换开销,降低系统的性能。处理复杂度高:在阻塞模式下,需要额外的线程管理和同步机制来处理线程的阻塞和唤醒,增加了编程的复杂度和出错的可能性。原创 2024-03-17 23:51:53 · 230 阅读 · 0 评论 -
基于@ControllerAdvice的全局异常处理
在拦截器中,@ControllerAdvice 可以拦截并处理控制器抛出的异常,实现全局的异常处理。全局异常处理:使用 @ExceptionHandler 注解在 @ControllerAdvice 中的方法可以处理应用程序中任何控制器抛出的异常。全局模型属性:使用 @ModelAttribute 注解在 @ControllerAdvice 中的方法可以为每个控制器添加模型属性。方法: 在带有 @ControllerAdvice 注解的类中的被注解方法将适用于整个应用程序的所有控制器。原创 2024-03-02 12:29:56 · 348 阅读 · 0 评论 -
java中的线程池
描述:核心线程池的大小,即线程池中始终保持存活的线程数量。作用:当有新的任务提交时,线程池会优先创建核心线程来处理任务。原创 2024-02-26 10:26:26 · 900 阅读 · 0 评论 -
Serializable
在这个例子中,MyClass 类实现了 Serializable 接口。最后,输出反序列化后的对象内容。Serializable 接口本身并不包含任何方法,它只是一个标记接口,表明实现类愿意参与 Java 的序列化和反序列化过程。在实际应用中,当你希望将对象进行序列化时,需要确保该对象的类及其所有涉及到的类都实现了 Serializable 接口。Serializable 是 Java 中的一个标记接口(Marker Interface),用于指示类的实例可以被序列化(将对象的状态转换为字节流)。原创 2024-02-24 10:11:26 · 140 阅读 · 0 评论 -
final和static
在这个例子中,CONSTANT_VALUE 是一个静态常量,它属于整个类,而不是类的实例。它可以通过 Example.CONSTANT_VALUE 的方式访问。在这个例子中,instanceConstant 是一个实例变量,每个类的实例都有自己的值。它在对象创建时通过构造方法初始化,之后不能再被修改。原创 2024-02-22 19:02:04 · 141 阅读 · 0 评论 -
final和static
在这个例子中,CONSTANT_VALUE 是一个静态常量,它属于整个类,而不是类的实例。它可以通过 Example.CONSTANT_VALUE 的方式访问。在这个例子中,instanceConstant 是一个实例变量,每个类的实例都有自己的值。它在对象创建时通过构造方法初始化,之后不能再被修改。原创 2024-02-22 11:50:30 · 132 阅读 · 0 评论 -
Java中的Enum
Java 中的枚举类型(enum)实际上是一种特殊的类。enum编译后是一个特殊的类(有些类似单例模式)这些实例在声明时就被创建,并在整个应用程序的生命周期中只存在一个实例。enum 用于定义包含固定数量实例的枚举类型。枚举类型的优势在于它提供了更类型安全、更清晰和更具可读性的方式来表示一组相关的常量。枚举类的构造函数默认是私有的,这是因为枚举常量在声明时就被创建,而且在整个应用程序的生命周期内,它们的数量是固定的enum的实现,原创 2024-02-21 19:45:03 · 246 阅读 · 0 评论 -
java异常处理设计
通过以上的描述和举例,可以总结出一个结论,**RuntimeException 异常和受检异常之间的区别就是: 是否强制要求调用者必须处理此异常,如果强制要求调用者必须进行处理,那么就使用受检异常,否则就选择非受检异常 (RuntimeException)。不要同时记录和抛出异常,因为异常会打印多次,正确的处理方式要么抛出异常要么记录异常,如果抛出异常,不要原封不动的抛出,可以自定义异常抛出。尽可能晚的捕获异常,如非必要,建议所有的异常都不要在下层捕获,而应该由最上层捕获并统一处理这些异常。原创 2024-02-21 18:49:57 · 648 阅读 · 0 评论 -
使用Properties类读取配置文件
读取配置文件使用Properties类读取配置文件。Properties类本质上是个hashmap。原创 2024-02-17 13:10:15 · 354 阅读 · 0 评论 -
java测试junit
JUnit Platform是底层的测试执行引擎,JUnit Jupiter是JUnit 5的主要测试框架,而JUnit Vintage允许在JUnit 5平台上运行旧版本的测试。所以想要使用junit5,必须包含platform和jupiter。原创 2024-02-17 07:32:33 · 460 阅读 · 0 评论 -
Java环境变量
编译后,classpath的当前目录就是target下的classes目录,它是resource和main目录的合并,如果两个类目录相同,那么就放在了一个文件夹下了。test目录下的文件不会输出到target下的。(2)JAVA_HOME:是jdk的目录,jdk主要包括:javac编译器(将java文件编译成.class文件),java库文件,jvm虚拟机。)添加到windows的path目录,在cmd中直接输入程序名字就能执行。(1)classpath:让jvm找到将要执行的java文件的目录。原创 2024-02-16 23:19:28 · 241 阅读 · 0 评论 -
Mybatis的使用
mybatis是通过对JDBC的封装实现的,他是针对ORM的。‘datasource也是对于JDBC的封装,但是它是针对连接管理的。半ORM框架Object Relationship Mapping 对象关系映射半ORM:需要在mapper文件中配置映射关系作用:用来操作数据库,解决原始jdbc代码冗余(1)environment设置数据源(2)类型别名(3)mapper文件的注册mapper文件(1)dao方法的实现—sql语句。原创 2024-02-16 15:09:50 · 690 阅读 · 0 评论 -
java项目的常用目录列表
全称为:Plain Ordinary Java Object,即简单普通的java对象。一般用在数据层映射到数据库表的类,类的属性与表字段一一对应。原创 2024-02-16 14:43:13 · 1284 阅读 · 0 评论 -
java泛型
泛型类型必须是引用类型(非基本数据类型)定义泛型类,在类名后添加一对尖括号,并在尖括号中填写类型参数,参数可以有多个,多个参数使用逗号分隔:public class GenericClass {}泛型通配符// 1:表示类型参数可以是任何类型public class Apple{}// 2:表示类型参数必须是A或者是A的子类public class Apple{}// 3: 表示类型参数必须是A或者是A的超类型public class Apple{}(4)E:E原创 2024-02-15 08:20:28 · 166 阅读 · 0 评论 -
《Think in Java》
java的一个优点就是,一开始就内置了异常处理,并且强制程序员必须去使用,java将异常也当作一种对象,从错误的地点抛出,异常不能被忽略,必须在程序运行的某处得到处理,被专门设计用来处理特定类型错误的异常处理器捕获,异常处理就像和程序运行并行的,错误发生时执行另一个路径,不会干扰正常代码的执行。比如我们向circle类发送请求,我们就将其当成shape类,我们不需要关系其所属的特定类,因为所有shape子类都实现了shape类的绘制,擦除与移动的方法,我们不需要担心其如何实现。第二是出于效率原因。原创 2024-02-14 21:53:48 · 494 阅读 · 0 评论 -
Java读取配置文件
store ( OutputStream out, String comments): 以适合使用 load 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键和元素对)写入输出流。getClass().getResourceAsStream()和this.getClass().getClassLoader().getResourceAsStream()这两个方法使用classloader是为了定位类目录,而不是使用类加载器加载文件。该方法在基类中提供。原创 2024-02-13 19:50:02 · 358 阅读 · 0 评论 -
Java反射
/返回jvm中的唯一的Class类。Class类包括包名,类名,成员变量,成员方法,构造方法和接口。getDeclaredMethod()获取全部方法(包括私有)(3)通过: Class.forName(“name”);在程序运行期间,动态获取类的信息以及动态调用对象方法。(1)通过 : 对象.getClass()获取。运行期调用,创建不确定的类和对象(动态效果)。不同的对象返回的Class文件时相同的。(2)通过: 类名.class获取。因为返回的是相同的,所以可以作为锁。原创 2024-02-13 19:47:35 · 224 阅读 · 0 评论 -
jvm类加载器
Thread.currentThread().getContextClassLoader() 方法通常会返回当前线程的上下文类加载器,而通常情况下,这个上下文类加载器就是由JVM创建的应用程序类加载器(Application Class Loader)。应用程序类加载器(也称为系统类加载器)是在JVM启动时创建的,它负责加载应用程序类路径(classpath)中的类。下面是jvm加载启动类加载器,扩展类加载器,应用程序类加载器。分为jvm使用的类加载器,程序员使用的类加载器。jvm使用的类加载器。原创 2024-02-13 19:44:32 · 771 阅读 · 0 评论 -
java中的流
java的io系统是高度抽象的,剥离了底层的文件操作或者网络操作,我们直接用就行了。缓冲读流:一次性从磁盘,网络中取出很多字节放到内存中,从而降低开销。缓冲写流:将写入先缓存到内存,缓冲满了以后再写入磁盘或者网络。原创 2024-01-17 19:14:39 · 376 阅读 · 0 评论 -
加载资源文件的方法
类加载器主要用于从类路径加载类和资源,适合在应用程序的类路径下查找和加载资源,尤其是打包成jar包下。无论是通过类加载器还是file操作,最后都是将文件返回流。通常使用System加载器或者线程上下文加载器。加载资源文件的方法:类加载器,file操作。class底层也是用的类加载器加载资源的。文件操作主要用于读取本地文件系统中的文件。原创 2024-01-17 17:47:57 · 405 阅读 · 0 评论