![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 57
L.ZZ
这个作者很懒,什么都没留下…
展开
-
使用jstack排查线上故障:高CPU占用
一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环。我们以当时出现的实际故障为例,来介绍怎么定位和解决这类问题。top命令:Linux命令。可以查看实时的CPU使用情况。也可以查看最近一段时间的CPU使用情况。ps命令:Linux命令。强大的进程状态监控命令。可以查看进程以及进程中线程的当前CPU使用情况。属于当前状态的采样数据。jstack:Java提供的命令。可以查看某个进程的当前线程栈运行情况。转载 2022-10-08 17:00:23 · 2299 阅读 · 1 评论 -
java程序CPU使用率高可能的原因
在Java并发编程方面,如何在多线程环境中设置合理的线程数,那我们需要了解两个概念:计算密集型要进行大量的计算、逻辑判断等操作,消耗CPU资源,比如计算圆周率、对视频进行高清解码等等,全靠CPU的运算能力。这种计算密集型任务虽然也可以用多任务完成,但是任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低,所以,要最高效地利用CPU,计算密集型任务同时进行的数量应当等于CPU的核心数,我们设置线程数一般是:计算机。计算密集型任务由于主要消耗CPU资源,因此,代码运行效率至关重要。Python这样转载 2022-07-01 11:24:22 · 11880 阅读 · 1 评论 -
java中将方法当作参数传递的方式
1. 使用consumer接口在Java8中引入了一个函数式接口Consumer的对象,该对象可以把方法作为参数进行传递。接口定义:@FunctionalInterfacepublic interface Consumer<T> { void accept(T t); default Consumer<T> andThen(Consumer<? super T> after) { Objects.requireNo原创 2021-11-25 19:50:29 · 26163 阅读 · 1 评论 -
Java中为什么要同时重写equals()和hashcode()方法
1. 背景 String a=new String("123"); String b=new String("123");我们知道,在java中 a == b 比较的是对象的在内存中的物理地址,equals()方法的作用本来和==相同,也是比较两者的物理地址,但String类重写了equals()方法,于是String类的equals方法变成了比较两个字符串对象的字符串内容是否相等。2. equals()和hashcode()方法需要同时重写的原因首先,我们要明白ha转载 2021-11-12 17:45:26 · 1109 阅读 · 0 评论 -
关于@RequestBody无法获取boolean类型请求参数的解决
1. 问题描述不知道大家在用java写后台接口与前端联调时有没有遇到过这个坑,就是我使用@RequestBody来修饰AddUpdateDecisionFlowRequestVo对象进而来接收前端的请求时,AddUpdateDecisionFlowRequestVo对象里面的isStart这个boolean类型的变量是没有接收到任何值的,如下图所示:private boolean isStart;从上图可看到,怎么好端端的isStart请求参数变成了start了呢,从网上google了下,发现有转载 2021-09-29 17:42:21 · 1427 阅读 · 0 评论 -
Java中泛型的使用
1. 概述在前面学习集合时,我们知道了集合中是可以存放任意对象的,只要把对象存储到集合后,那么这时他们都会被提升成Object类型。当我们在取出每一个对象,并且进行相应的操作时,必须采用类型转换。比如下面程序:public static void main(String[] args) { List list = new ArrayList(); list.add("abc"); list.add("def"); list.add(123);// 由于集合没有做任何限定,任何类型转载 2021-09-15 10:57:48 · 407 阅读 · 0 评论 -
java接口的意义
1. java当中继承一个接口,要重写他的方法的话,那为什么还要多此一举的去实现一个接口呢?直接把方法写在类当中不就可以了?就是说去掉类名后面的Implements 接口 ,可以不可以呢?统一访问:接口的最主要的作用是达到统一访问,就是在创建对象的时候用接口创建,【接口名】 【对象名】=new 【实现接口的类】,这样你像用哪个类的对象就可以new哪个对象了,不需要改原来的代码,就和你的US...转载 2019-05-23 16:51:55 · 17228 阅读 · 3 评论 -
Java List转String数组与String数组转List
1. String数组转ListString title = "\t 10月上旬\t 10月中旬\t 10月下旬"; String[] arrTitles = title.split("\t");List<String> titleList = Arrays.asList(arrTitles);1.1 方法一(不推荐)List<String> titleList = Arrays.asList(arrTitles);titleList结果:注意:Arrays.转载 2021-08-28 09:25:30 · 9656 阅读 · 0 评论 -
二叉树遍历(递归实现前序/中序/后序遍历)
1. 准备工作我们先定义一棵普通的二叉树,如下图2. 前序遍历通过递归进行遍历:如果二叉树为空,则操作返回;如果非空,否则从根结点开始,然后遍历左子树,再遍历右子树。前序遍历的结果是:ABDGHEICFJK为什么会遍历出这种结果,请看上面对前序遍历的描述:先遍历左边,然后在遍历右边。JAVA代码如下://前序遍历 public static void preTraversal(Node node){ if(null!=node){ System.out.println(nod转载 2021-06-17 10:11:14 · 1265 阅读 · 0 评论 -
java代码构建二叉树(二叉查找树)
1. 前言1.1 二叉树定义二叉树是N个结点的有限集合,该集合或者为空集,或者由一个根节点跟两棵互不相交的、分别称为根节点的左子树或者右子树的二叉树组成。1.2 二叉树的特点每个结点最多有两个子树左子树跟右子树是有序的树中某个结点只有一棵子树,也要区分是左子树还是右子树1.3 二叉树的形态空二叉树只有一个根结点根结点只有左子树根结点只有右子树根结点既有左子树,又有右子树2. java构建二叉树代码示例2.1 二叉树的存储结构以二叉链表存储为例转载 2021-06-16 16:10:03 · 4520 阅读 · 0 评论 -
java获取一个时间段内的所有年份/月份/天
代码示例:public enum DateUnit { YEAR("year"), MONTH("month"), DAY("day"); private String unit; DateUnit(String unit) { this.unit = unit; } public String getUnit() { return this转载 2021-06-10 15:31:10 · 3958 阅读 · 0 评论 -
关于MySQL的wait_timeout连接超时问题报错解决方案
1. 问题描述想必大家在用MySQL时都会遇到连接超时的问题,如下图所示:### Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 47,795,922 milliseconds ago. The last packet sent successfully to the server was 47,795,92转载 2021-05-09 16:38:24 · 4365 阅读 · 0 评论 -
关于数据库mysql连接超时以及连接池超时的一些问题
1. 数据库连接超时数据库连接超时是指当服务连接到数据库但不对其做任何操作时等待到一定时间之后,这个链接就会与数据库断开,当再次对数据库进行操作时会报数据库连接超时或者连接关闭异常。mysql的连接默认最长等待时间为28800s也就是8个小时。解决办法:重新建立连接;把链接等待超时timeout设置长一点1.1 查看mysql连接最大超时时间查看mysql数据库服务连接最大超时时间,默认是28800S也就是8小时show global variables like '%timeout%';转载 2021-05-09 16:12:02 · 14833 阅读 · 0 评论 -
MySQL CST时区协商问题导致的数据库时间戳错误
1. 背景插入timestamp类型与datetime类型数据比预计结果早13在这里插入代码片小时2. 原因如果说相差8小时不够让人惊讶,那相差13小时可能会让很多人摸不着头脑。出现这个问题的原因是JDBC与MySQL对 “CST” 时区协商不一致。因为CST时区是一个很混乱的时区,有四种含义:美国中部时间 Central Standard Time (USA) UTC-05:00或UTC-06:00澳大利亚中部时间 Central Standard Time (Australia) UTC+0转载 2021-05-08 14:57:30 · 962 阅读 · 0 评论 -
JAVA:finally块中的代码什么时候被执行
1. 当try{}有return语句,finally{}有return语句1.1 代码示例public class TestFinally{ public static int testFinally1() { try{ return 1; }catch(Exception e){ return 0; }finally{ System.out.println("ex转载 2021-05-07 11:12:48 · 545 阅读 · 0 评论 -
@RequestParam和@RequestBody的使用
0. 前言发现一篇讲@RequestParam和@RequestBody的区别的文章,感觉写的挺好。在编写项目的过程中,老出现前后端传递参数格式不一致、不统一的问题,@RequestParam和@RequestBody的区别,避免大家遭遇同等错误;1. @RequestParam注解@Target(ElementType.PARAMETER)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface RequestPara转载 2021-04-27 10:30:51 · 2795 阅读 · 1 评论 -
当我们在谈论内存的时候,我们在谈论什么
0. 前言内存,是程序员绕不过的一道坎。写过C和C++的人想必都会对内存的手动分配和释放难以忘怀,在Java中,得益于JVM的自动垃圾回收(GC)机制,大部分情况下编程并不需要关心内存的分配与回收。当然,有了GC并不意味着就万事大吉了,如果不了解其中的原理,以错误的姿势滥用GC,很有可能翻车酿成不可估量的损失。在经历过一次严重的线上故障之后,本文试图深入分析JVM的内存管理机制,探索如何监控和避免内存使用量过高的场景出现。难免有错误之处,还请各位指正。1. 内存是什么?这个问题看似很好回答:内存不就转载 2021-04-23 14:27:58 · 170 阅读 · 0 评论 -
JSONObject转换为Map(String, Integer)对象
1. 示例代码import com.alibaba.fastjson.JSONObject;import com.alibaba.fastjson.TypeReference;JSONObject obj = new JSONObject();{ obj.put("key1", "value1"); obj.put("key2", "value2"); obj.put("key3", "value3");}Map<String, Integer> params = JSONO转载 2021-04-02 16:30:39 · 3900 阅读 · 0 评论 -
Cache与Buffer的区别
首先cache是缓存,buffer是缓冲,虽然翻译有那么一个字的不同,但这不是重点。个人认为他们最直观的区别在于cache是随机访问,buffer往往是顺序访问。虽然这样说并没有直击本质,不过我们可以待分析完毕之后再来讨论真正的本质。为了说明这个问题,让我将他们分开来说:read cache(读缓存),read buffer(读缓冲),write cache(写缓存),write buffer(写缓冲)。无论缓存还是缓冲,其实本质上解决的都是读写速度不匹配的问题,从这个角度,他们非常相似。首先讨论读缓存跟读转载 2021-03-08 17:30:35 · 3766 阅读 · 2 评论 -
JDBC中connection.isClosed 和 connection.isValid的区别
isClosed:是判断一个connection是否被关闭,而是否被关闭是停留在java程序层的判断,不会去检测是否与数据库连通。意思是,你在程序运行过程中,即使把数据库关了,对于一个之前未被关闭的connection来说,调用connection.isClosed依然为false。但是如果用已经不能使用的connection访问数据库导致一次异常之后,connection则会自动设置为true。isValid:是检测connection是否有效,它会尝试与数据库作连接,即如果Connectio..转载 2021-03-05 10:03:12 · 4827 阅读 · 1 评论 -
Java监听者模式
1. 前言什么是监听器监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。。为什么我们要使用监听器?监听器可以用来检测网站的在线人数,统计网站的访问量等等!监听器组件监听器涉及三个组件:事件源,事件对象,事件监听器当事件源发生某个动作的时候,它会调用事件监听器的方法,并在调用事件监听器方法的时候把事件对象传递进去。我们在监听器中就可以通过事件对象获取得到事件源,从而对事件源转载 2021-02-04 14:58:39 · 1101 阅读 · 0 评论 -
Java8 Steam API中groupingBy和flatMap方法的使用
1. groupingBy分组器/** * 使用java8 stream groupingBy操作,按城市分组list */@Testpublic void groupingByTest() { Map<String, List<Employee>> employeesByCity = employees.stream().collect(Collectors.groupingBy(Employee::getCity)); Syste原创 2021-01-28 11:25:59 · 1820 阅读 · 0 评论 -
Java可重入锁ReentrantLock
1. ReentrantLock的概念ReentrantLock是一个可重入的独占锁(/互斥)锁。可重入:指任意线程在获取到锁之后能够再次获取该锁而不会被阻塞。独占:每次只能有一个线程能持有锁;与之相应的时共享锁,则允许多个线程同时获取锁,并发访问,共享资源,ReentrantReadWriteLock里的读锁,它的读锁是可以被共享的,但是它的写锁是独占的。ReentrantLock继承了Lock接口,其内部类Sync继承了队列同步器AQS,Sync有两个子类:公平锁FairSync和非公平锁N转载 2021-01-18 14:48:55 · 193 阅读 · 0 评论 -
Java中信号量Semaphore的使用
1. Semaphore的作用在java中,使用了synchronized关键字和Lock锁实现了资源的并发访问控制,在同一时间只允许唯一的线程进入临界区访问资源(读锁除外),这样子控制的主要目的是为了解决多个线程并发同一资源造成的数据不一致的问题。在另外一种场景下,一个资源有多个副本可供同时使用,比如打印机房有多个打印机、厕所有多个坑可供同时使用,这种情况下,Java提供了另外的并发访问控制–资源的多副本的并发访问控制,今天学习的信号量Semaphore即是其中的一种。2. Semaphore实现原理转载 2021-01-18 11:21:42 · 405 阅读 · 0 评论 -
Java类的加载过程
1. 什么是类的加载过程一个Java文件从编码完成到最终执行,一般主要包括两个过程:编译和运行,其中编译就是把我们写好的java文件,通过javac命令编译成字节码,也就是我们常说的.class文件,然后运行则是把编译生成的.class文件交给Java虚拟机(JVM)执行。而我们所说的类加载过程即是指JVM虚拟机把.class文件中类信息加载进内存,并进行解析生成对应的class对象的过程。举个通俗点的例子来说,JVM在执行某段代码时,遇到了class A, 然而此时内存中并没有class A的相关信息转载 2020-12-24 11:23:36 · 988 阅读 · 0 评论 -
设计模式——工厂模式详解
1. 前言神话故事——女娲造人在介绍工厂模式之前,我们先来看一个女娲造人的神话故事。东汉《风俗通》记录了这样一则神话故事:“开天辟地,未有人民,女娲搏黄土做人”,说的就是女娲造人的故事。女娲是如何造人的呢?过程大概是这样的:首先,女娲采集黄土捏成人的形状,然后放到八卦炉中烧制,最后放到大地上生长。由于女娲是第一次做人,经验不足,对火候的把控不准确,柴火放多了,火太旺,七七四十九天之后,造好拿出来一看,人都被烤黑了,于是,黑种人就诞生了;然后女娲开始少放柴火,小火慢炖,又过了七七四十九天,拿出来一看,人还转载 2020-12-21 17:01:19 · 576 阅读 · 0 评论 -
Java多线程做压力测试
写一个多线程做压力测试的例子:public interface RequestHandler<T> { public void handle(T result);} package com.arch; import java.util.ArrayList;import java.util.List;import java.util.concurrent.*; public class ConcurrentTestUtil { /**转载 2020-12-16 09:25:48 · 1500 阅读 · 0 评论 -
类序列化问题-java.io.InvalidClassException
1. 问题当一个类实现了序列化接口,有时会遇到 java.io.InvalidClassException 异常出现:java.io.InvalidClassException: com.test.Test; local class incompatible: stream classdesc serialVersionUID = 7981560250804078637, local class serialVersionUID = -83344055351741608222. 原因这是序列化兼容转载 2020-12-03 19:53:19 · 964 阅读 · 0 评论 -
Java 线程安全的集合
1. 前言在 Java 中我们使用最多的 List 就是 ArrayList 和 LinkedList,它们在单线程中可以说是”玩的不亦乐乎”,而在多线程并发操作时就不行了。Java 为我们提供了几种方式以适应多线程下的 List 操作场景。本文将介绍几个多线程中适用的 List,文章最后也会介绍线程安全的 Map、Set 以及 Queue 和 Deque 的几个实现类。2. 使用 Collections.synchronizedList(List list)因为 ArrayList 本身不是线程安全转载 2020-12-01 10:03:03 · 10180 阅读 · 0 评论 -
Java单例模式
1. 前言所谓单例,指的就是单实例,有且仅有一个类实例,这个单例不应该由人来控制,而应该由代码来限制,强制单例。单例有其独有的使用场景,一般是对于那些业务逻辑上限定不能多例只能单例的情况,例如:类似于计数器之类的存在,一般都需要使用一个实例来进行记录,若多例计数则会不准确。2. 常见的单例模式常见的单例模式有两种创建方式:所谓懒汉式与饿汉式2.1 懒汉式何为懒?顾名思义,就是不做事,这里也是同义,懒汉式就是不在系统加载时就创建类的单例,而是在第一次使用实例的时候再创建。详见下方代码示例:pu转载 2020-11-14 10:07:55 · 254 阅读 · 0 评论 -
使用Java8 Stream流更改map里value的结构
一、前言java8使用Stream流更改map中的value,key不变,仅修改原map中的value。二、代码Map<String,List<String>> map = new HashMap<>();map.put("java", Arrays.asList("1.7", "1.8"));Map<String, Java> collect = map.entrySet().stream() .collect(C转载 2020-10-27 14:50:57 · 13209 阅读 · 0 评论 -
一致性哈希算法原理
1. 一致性Hash算法背景一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简单哈希算法带来的问题,使得DHT可以在P2P环境中真正得到应用。但现在一致性hash算法在分布式系统中也得到了广泛应用,研究过memcached缓存数据库的人都知道,memcached服务器端本身不提供分布式cache的一致性,而是由客户端来提供,具体在计算一致性hash时采转载 2020-09-01 15:11:19 · 652 阅读 · 0 评论 -
Java并发编程:volatile关键字解析
0. 前言volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatile关键字的实现原理,最后给出了几个使用vola转载 2020-08-12 16:12:01 · 126 阅读 · 0 评论 -
Java获取指定时区的时间戳
1. 前言本文主要讲,在Java中如何通过一个标准格式时间字符串("yyyy-MM-dd HH:mm:ss"),来获取其对应的各个时区的时间戳信息。2. 代码示例功能代码:获取时间字符串对应的指定时区的时间戳public static long getTimeZoneTimeStr(String dateStr,String timeZone) { long result = 0L; int year; int month; int原创 2020-06-24 10:25:04 · 8757 阅读 · 1 评论 -
Java8 ParallelStream返回结果顺序问题
1. 前言之前一直以为如果是并行流,那么返回的结果一定是乱序的。其实这是错误的。Stream s = Stream.of("1","2","3","4","5","6","7");s.parallel().collect(Collectors.toList()); //一定返回有序结果2. 是否有序跟并行流还是串行流没有关系是否有序跟并行流还是串行流没有关系,只跟Collector的Characteristics有关。 enum Characteristics { /**原创 2020-06-20 15:12:12 · 9043 阅读 · 2 评论 -
Java8中List去掉重复对象方法
1. List中简单元素去重(String等)public List<String> removeStringListDupli(List<String> stringList) { Set<String> set = new LinkedHashSet<>(); set.addAll(stringList); stringList.clear(); stringList.addAll(set); return s转载 2020-06-19 16:42:56 · 21141 阅读 · 2 评论 -
Guava 缓存Cache用法介绍
1. 前言Guava Cache是在内存中缓存数据,相比较于数据库或redis存储,访问内存中的数据会更加高效。Guava官网介绍,下面的这几种情况可以考虑使用Guava Cache:愿意消耗一些内存空间来提升速度。预料到某些键会被多次查询。缓存中存放的数据总量不会超出内存容量。所以,可以将程序频繁用到的少量数据存储到Guava Cache中,以改善程序性能。下面对Guava Cache的用法进行详细的介绍。2. 构建缓存对象接口Cache代表一块缓存,它有如下方法:public int转载 2020-06-05 09:53:11 · 3689 阅读 · 0 评论 -
HashMap底层实现原理(下)
1. 前言上一篇文章我们介绍了HashMap的底层实现,但还遗留了一点内容,我们再回顾一下上一篇文章里说的内容。执行完红框里的代码,personMap里放入了8个元素,放置完成后在堆内存表现如下图:如果忽略底层实现细节,是这样的:2. 更新HashMap的值在Map中,一个key,对应了一个value,如果key的值已经存在,Map会直接替换value的内容,来看一下源码中是怎么实现的,来看以下代码:Person oldPerson1 = personMap.put("张三", new P转载 2020-06-03 16:05:02 · 275 阅读 · 0 评论 -
HashMap底层实现原理(上)
1. 前言本来想先在专栏里简单的说一下二叉树,红黑树的内容后再说HashMap的,但看到评论区里不断的出现HashMap这个词,怕大家等得着急,本篇文章就先说说HashMap吧,前面讲ArrayList和LinkedList时把源码说得很细,只要理解了这两块内容,本篇内容也很好理解,先来看看HashMap在Map这个大家族中的位置。上图中,白色部分是接口,黄色部分是要重点了解的,最好是看一遍源码,绿色部分已经过时,不常用了,但是面试中可能会问到。这里先简单的说一下这几个Map,TreeMap是基于树的转载 2020-06-03 10:46:48 · 324 阅读 · 0 评论 -
Java中new Date().getTime()时间戳问题
1. getTime()返回值Java和JavaScript都支持时间类型Date,他们的getTime()方法返回的是毫秒数。默认返回的是13位数字,单位是毫秒。2. 注意事项 /** * Returns the number of milliseconds since January 1, 1970, 00:00:00 GMT * represented by this <tt>Date</tt> object. * * @retur原创 2020-05-26 15:38:19 · 55291 阅读 · 0 评论