
java
文章平均质量分 72
主要介绍java基础知识
半夏_2021
系统恒久远,代码永流传!
展开
-
Java代码重复:搞定代码重复的三个绝招
Java代码重复:搞定代码重复的三个绝招原创 2022-07-28 15:11:05 · 2538 阅读 · 0 评论 -
java并发编程: Semaphore如何快速实现一个限流器?
java并发编程: Semaphore如何快速实现一个限流器?原创 2022-07-28 09:22:46 · 702 阅读 · 0 评论 -
高性能限流器Guava RateLimiter
高性能限流器Guava RateLimiter原创 2022-07-28 09:16:36 · 863 阅读 · 0 评论 -
Tomcat I/O和线程池的并发调优
Tomcat I/O和线程池的并发调优原创 2022-07-26 09:23:31 · 746 阅读 · 0 评论 -
Tomcat进程占用CPU过高怎么办?
Tomcat进程占用CPU过高怎么办?原创 2022-07-26 09:09:55 · 1961 阅读 · 1 评论 -
@PathVariable 中url变量,不存在的情况下(为空),会抛出404错误
@PathVariable 中url变量,不存在的情况下(为空),会抛出404错误原创 2022-06-05 10:26:59 · 645 阅读 · 0 评论 -
Java8 Optional解决NPE问题
Java8 Optional解决NPE问题原创 2022-05-08 13:34:42 · 332 阅读 · 0 评论 -
软件设计原则与模式
Java软件设计原则与模式原创 2022-05-08 13:32:29 · 2121 阅读 · 0 评论 -
Java Code Review 介绍
Code Review介绍原创 2022-04-20 21:52:43 · 1412 阅读 · 0 评论 -
java 对象创建的几种方式
文章目录记录日志的原因日志规范日志级别不同日志级别的处理方式记录日志考虑三个问题记录日志的原因记录操作轨迹监控系统运行状况回溯系统故障日志规范命名规范: appName_logType_logNamelogType : 日志类型,推荐有 status、monitor、visit 等logName : 日志描述日志级别DEBUGINFOWARNERRORTATAL不同日志级别的处理方式预先判断日志级别对DEBUG、INFO级别的日志,必须使用条件输出或者使用占原创 2021-08-01 10:07:38 · 153 阅读 · 0 评论 -
别再用正则表达式匹配数字和字母了?一行代码搞定!
String s = "a1b2c3d4"; // 第一种方法 Pattern pattern = Pattern.compile("\\d"); Matcher matcher = pattern.matcher(s); while(matcher.find()){ System.out.println(matcher.group()); } // 第二种方法 ...原创 2021-07-27 16:49:36 · 163 阅读 · 0 评论 -
Java控制循环结构 break continue return区别
break用于结束一个循环,跳出循环体break 语句不仅可以结束其所在的循环,还可以直接结束其外层循环,此时,需要在break后紧跟一个标签,这个标签用于标识一个外层循环。continuecontinue: 只是忽略本次循环剩下语句,接着开始下一次循环,并不会终止循环break: 完全终止循环本身for(int i=0;i<3;i++){if(i==1){ continue;}}returnreturn 关键字并不是专门用于结束循环的,return 功能是结束一个方法。原创 2021-07-27 09:57:51 · 200 阅读 · 0 评论 -
Java 通过反射获取父类和子类的所有方法
public final class ReflectionUtils { public static Method getDeclaredMethod(Object object, String methodName, Class<?> ... parameterTypes){ Method method = null ; for(Class<?> clazz = object.getClass() ; clazz != Object.cla原创 2021-07-27 09:50:41 · 1756 阅读 · 0 评论 -
Java 反射详解
功能在运行时判断任意一个对象所属的类在运行时构造任意一个类的对象在运行时判断任意一个类所具有的成员变量和方法在运行时调用任意一个对象的方法Class类获得类相关的方法getClassLoader():获得类的加载器forName(String className):根据类名返回类的对象getName() :获得类的完整路径名字newInstance():创建类的实例getPackage():获得类的包getSimpleName():获得类的名字getInterfaces():原创 2021-07-27 09:02:09 · 211 阅读 · 0 评论 -
JDK版本对应的十进制
JDK1.8 = 52JDK1.7 = 51JDK1.6 = 50JDK1.5 = 49JDK1.4 = 48原创 2021-07-26 11:33:39 · 1239 阅读 · 0 评论 -
Java 静态变量能够被序列化吗?
静态变量能够被序列化吗?我们先定义一个类,定义一个静态变量 staticVar = 5,将它被序列化后,再把 staticVar 设置成10,最后反序列化后得出的对象的staticVar 是5还是10呢?代码如下:public class StaticSerializableTest implements Serializable { public static int staticVar = 5; @Override public String toString() {原创 2021-07-26 09:48:51 · 1886 阅读 · 0 评论 -
序列化&反序列化
文章目录序列化的意义什么是序列化和反序列化?序列化的挑战序列化的高阶认识serialVersionUID的作用静态变量序列化父类的序列化Transient关键字序列化的存储规则序列化实现深克隆常见的序列化方式**基于JDK序列化方式实现**XML序列化JSON序列化Hessian 序列化框架子Protobuf 序列化框架总结序列化技术的选型序列化的意义Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周原创 2021-07-25 16:26:22 · 190 阅读 · 0 评论 -
Java 中的四种引用类型
了解内存布局和垃圾回收,对象在堆上创建之后所持有的引用其实是一种变量类型,引用之间可以通过赋值构成一条引用链。从GC Roots 开始 遍历,判断引用是否可达。引用的可达性是判断能够被垃圾回收的基本条件。在某些场景下,即使引用可达,也希望能够根据语义的 强弱引用进行有选择的回收,以保证系统的正常运行。根据引用类型语义的强弱来决定垃圾回收的阶段,我们可以把引用分为强引用、软引用、弱引用和虚引用。后三类引用,本质上可以让开发工程师 通过代码方式来决定对象的垃圾回收时机。强引用,即Strong Refere原创 2021-07-21 21:28:14 · 326 阅读 · 0 评论 -
WeakHashMap 垃圾回收原理
与 HashMap 区别:HashMap 的 key保留了对实际对象的 强引用,这意味着只要该HashMap对象不被销毁,该HashMap的所有Key所引用的对象就不会被垃圾回收,HashMap也不会自动删除这些Key所对应的key-valueWeakHashMap的key只保留了对 实际对象的弱引用,这意味着如果WeakHashMap对象的key所引用的对象没有被其他强引用变量所一弄,则这些key所引用的对象可能被垃圾回收,WeakHashMap也可能自动删除这些Key所随影的key-value对。原创 2021-07-21 16:23:13 · 776 阅读 · 0 评论 -
Java TreeMap的使用
TreeMap 按照 Key 的排序结果来组织内部结构的Map类集合,它改变了Map类散乱无序的形象。虽然TreeMap没有ConcurrentHashMap 和 HashMap 普及,但是在Key有排序的要求的场景下,使用 TreeMap 可以事半功倍。在集合框架如中,他们都继承AbstractMap 抽象类,TreeMap 与 HashMap 、ConcurrentHashMap 的类图关系如下:TreeMap 继承于AbstractMap,所以它是一个Map,即一个key-value集合。T原创 2021-07-21 12:03:59 · 8403 阅读 · 0 评论 -
利用LinkedHashMap实现LRU算法缓存
LinkedHashMap 简介HashSet 有一个LinkedHashSet 子类,HashMap 也有一个LinkedHashMap 子类;LinkedHashMap 也使用双向链表来维护 key-value 对的次序。该链表负责维护Map的迭代顺序,迭代顺序与 key-value 对的插入顺序保持一直。LinkedHashMap 可以避免对HashMap、HashTable 里的key-value进行排序,同时又可避免使用TreeMap 所增加的成本。LinkedHashMap 需要维护元素的原创 2021-07-20 21:34:33 · 739 阅读 · 0 评论 -
jdk8 Map接口 putIfAbsent 和 computeIfAbsent的区别?
computeIfAbsent 和 putIfAbsent 区别有以下三点:当key 存在的时候,如果value获取比较昂贵的话,putifAbsent 就白白浪费时间在获取这个昂贵的value上。key 不存在的时候,putIfAbsent 返回null, 小心空指针,而computeIfAbsent 返回计算后的值。当key 不存在的时候,putifAbsent 允许put null 进去,而 computeIfAbsent 不能,之后进行containsKey查询是有区别的。具体用法如下原创 2021-07-20 11:33:23 · 6335 阅读 · 0 评论 -
JDK1.8 HashMap源码分析
文章目录HashMap简介Jdk1.7 存储结构HashMap put 原理HashMap get原理HashMap简介HashMap底层是基于 数组+链表(JDK8之前) 数组+链表/红黑树(JDK8)HashMap 是一个用于存储 key-value 键值对的集合,每一个键值对也叫 Entry 。这些键值对分布在一个数组当中。HashMap 最多允许一条记录的键值为null .允许多条记录的值为nullJdk1.7 存储结构JDK1.7 的存储结构采用的是数组+链表的结合,当创建一个Ha原创 2021-07-20 10:20:37 · 274 阅读 · 0 评论 -
集合元素的比较需要注意的事项
文章目录Comparable 和 ComparatorhashCode 和 equalsComparable 和 ComparatorJava中两个对象相比较的方法通常在元素排序中,常用的两个接口分别是 Comparable和 Comparator ,前者是自己和自己比较,可以看作是自营性质的比较器;后者是第三方比较器,可以看作是平台性质的比较器。我们熟知的Integer 和 String 实现的就是Comparaable的自然排序。而我们在使用某个自定义对象时,可能需要按照自己定义的方式排序,比如在原创 2021-07-14 15:47:09 · 279 阅读 · 0 评论 -
ArrayList源码和多线程安全问题分析
文章目录使用 Arrays.asList 把数据转换为List的三个坑坑一:不能直接使用Arrays.asList来转换基本类型数组坑二:Arrays.asList 返回的List不支持增删操作坑三:对原始数据的修改会影响到我们获取到的List总结使用 Arrays.asList 把数据转换为List的三个坑坑一:不能直接使用Arrays.asList来转换基本类型数组我们来看一个把基本数组类型转List的示例:如下代码,我们初始化一个int[]数组,然后使用Arrays.asList 把数组转换为转载 2021-07-14 11:29:35 · 463 阅读 · 0 评论 -
ArrayList中modCount 和 fail-fast 有什么关系呢?
文章目录什么是fail-fast机制怎样解决fail-fast什么是COW呢?CopyOnWriteArrayList 的 继承关系源码分析属性方法add(E e) 方法什么是fail-fast机制fail-fast 是集合中比较常见的错误监测机制,通常出现在集合的遍历之中。我们首先可看一下例子:public class ListTest { public static void main(String[] args) { List<String> list原创 2021-07-13 21:41:29 · 289 阅读 · 1 评论 -
Java ArrayList源码分析
文章目录ArrayList 简介ArrayList 概述ArrayList 数据结构ArrayList 源码分析类中的属性构造方法无参构造方法有参构造方法ArrayList(Collection<? extends E>)型构造函数核心方法add 方法remove 方法ArrayList 简介ArrayList 概述ArrayList 集合中允许出现重复的元素,所有的元素是以一种线性方式进行存储的,在程序中可以通过索引访问集合中的指定元素。另外,List集合中还有一个特点就是元素有序,即元原创 2021-07-13 12:48:59 · 175 阅读 · 0 评论 -
Java Runtime类
Runtime l类用于表示虚拟机运行时的状态,它用于封装JVM虚拟机进行。每次使用java命令启动虚拟机都对应一个Runtime实例,并且只有一个实例,因此该类采用单例模式进行设计,对象不可以直接实例化。如果想在程序中获得一个Runtime实例,只能通过以下方式:Runtime run = Runtime.getRuntime():由于Runtime类封装了虚拟机进程,因此,在程序中通常会通过该类的示例对象来获取当前虚拟机的相关信息。public class RuntimeTest { p原创 2021-07-12 21:06:58 · 1366 阅读 · 0 评论 -
Java 泛型的详解
在Java中定义了一个static关键字,可以用于修饰类的成员,如成员变量。成员方法以及代码块等,被static 修饰的成员就别一些特殊性,如下:静态变量在一个类中,主要的组成就是属性和方法,在每一个对象都分别拥有各自的属性内容,如果现在在类中某个属性希望定义为公共属性-所有对象都可以使用的属性,则可以在声明属性前加上 static 关键字。public class Person { private String name; private int age; static St原创 2021-07-11 21:24:57 · 172 阅读 · 0 评论 -
继承和组合,我该怎么选择?
在面向对象编程中,有一条非常经典的设计原则,那就是:**组合优于继承,多用组合少用继承。为什么不推荐使用继承?组合相比继承有哪些优势?为什么不推荐使用继承继承是面向对象的四大特征之一,表示表示类之间的is-a关系,可以解决代码复用的问题,但是继承带来了一个最大的坏处破坏封装,相比之下,组合也是实现类复用的重要方式,而采用组合方式来实现类复用则能提供很好的封装。虽然继承有很多的作用,但继承层次过深、过复杂,也会影响代码的可维护性。我们看下面这个例子:我们定义一个 鸟类的抽象类AbstractBird,原创 2021-07-11 17:12:26 · 603 阅读 · 0 评论 -
“危险“的 Double,使用的时候要小心了!
浮点数的精度问题我们首先看一个例子: System.out.println(0.1 +0.2); System.out.println(1.0-0.8); System.out.println(4.015*100); System.out.println(123.3/100); double amount1 = 2.15; double amount2 = 1.10; if (amount1 - amount2 == 1.05) System.out.println("OK")原创 2021-07-10 17:02:18 · 982 阅读 · 0 评论 -
Java访问权限控制,你知道多少?
文章目录当前时间加上时间戳使用Calendarjava 8 日期时间当前时间加上时间戳关于日期的计算,很多朋友们都喜欢用时间戳来直接相加,比如希望得到当前时间之后30天的时间,会这么写代码: 直接把 new Data().getTime() 方法得到的时间戳加上30天对应的毫秒数,也就是30天 * 24小时 * 3600秒 * 1000毫秒 Date today = new Date(); Date nextMonth = new Date(today.getTime()原创 2021-07-10 09:39:17 · 284 阅读 · 0 评论 -
SimpleDateFormat两个著名的坑
文章目录坑1:定义的static的SimpleDateFormat 可能出现线程安全问题坑2:当需要解析的字符串和格式不匹配的时候,SimpleDateFormat 并不报错,而是返回其他日期坑1:定义的static的SimpleDateFormat 可能出现线程安全问题SimpleDateFormat是线程不安全的类,定义为static对象,会有数据同步风险。通过源码可以看出,SimpleDateFormat内部有一个Calendar对象,在日期转字符串或字符串转日期的过程中,多线程共享时有非常高的概原创 2021-07-09 17:04:16 · 3760 阅读 · 3 评论 -
接口和抽象类的选择
文章目录1. Java 中接口的概念2. 接口用来干什么?3. 接口思想4. 使用接口的好处接口和抽象类的选择1. Java 中接口的概念在Java中接口时一个特殊的抽象类,跟一般的抽象类相比,接口里面的所有方法都是抽象方法(jdk7以下),JDK8以后可以有静态和默认方法,接口里面的所有属性都是常量。2. 接口用来干什么?通常用接口来定义实现类的外观,也就是实现类的行为定义,用来约束实现类的行为。接口就相当于一份契约,根据外部应用需要的功能,约定了实现类应该要实现的功能,但是具体的实现类除了实现接原创 2021-07-09 08:57:20 · 641 阅读 · 0 评论 -
深入浅出Java中的clone克隆方法
Java 中除了 调用构造函数来创建以外,还可以通clone来创建一个对象,而克隆又分为浅克隆和深度克隆,那么两者有什么区别呢?浅克隆我们先举一个例子,我们定义一个Person类,有 名字、年龄、地址对象public class Address { // 公司地址 private String companyAddress; // 家庭地址 private String homeAddress; }public class Person implements原创 2021-07-08 17:21:58 · 334 阅读 · 0 评论 -
java enum枚举类的用法以及高级玩法
Random 类专门用于生成一个伪随机数,它有两个构造器:一个构造器使用默认的种子(以当前时间作为种子),另一个构造器需要程序员显式传入一个long型整数的种子。ThreadLocalRandom 类是java7新增的一个类,它是Ramdom的增项版。在并发访问的环境下,使用ThreadLocalRandom 来代替Random可以减少线程资源竞争,最终保证系统具有更好的线程安全性。Random 的使用Random类位于java.util包下,是一种伪随机,使用非常简单:public class Ra原创 2021-07-08 09:09:29 · 1030 阅读 · 0 评论 -
ThreadLocalRandom 与 Random
文章目录java枚举介绍为什么要使用枚举而不适用static 关键字呢?枚举的基本用法用作常量用在Switch中自定义属性java枚举介绍枚举类的构造器只能使用private 访问控制符,如果省略了构造器的访问控制符,则默认使用private 修饰枚举的所有实例必须在枚举类的第一行显示出,否则这个枚举类永远都不能产生实例枚举类默认提供了values() 方法,该方法可以很方便的遍历所有的枚举值。为什么要使用枚举而不适用static 关键字呢?在某些情况下,一个类的对象时有限而且 是固定的,比原创 2021-07-07 22:12:15 · 1039 阅读 · 1 评论