Java
文章平均质量分 69
Java
每天都要进步一点点
工作日常技术学习、积累、总结
展开
-
迭代时移除List中的元素的正确方式
一、简介本篇文章总结一下另外一个很常见的错误:迭代的时候对集合对象进行删除操作的正确使用方式。二、使用详解如果遇到需要循环删除List中匹配的元素,相信很多小伙伴第一个想到的办法就是使用for循环遍历,然后使用挨个比较,如果相等则删除元素,即如下面的代码所示:List<String> list = new ArrayList<>();list.add("...原创 2019-12-24 20:18:42 · 2114 阅读 · 0 评论 -
数组转ArrayList的正确方式
一、简介今天,我们讲讲开发中常见的错误之一 - 数组转ArrayList的正确方式。二、数组转ArrayList项目中难免会有数组对象转换为List对象的需求,很多小伙伴们可能会这样写:String[] array = new String[]{"a", "b", "c"};//数组转ListList<String> list = Arrays.asList(ar...原创 2019-12-24 20:09:08 · 3576 阅读 · 0 评论 -
线上故障排查大体思路
一般线上故障排查思路需要从以下几个方面入手:服务器层面,如CPU、内存、磁盘等; 应用层面,JVM虚拟机调优参数、GC垃圾回收等; 数据库层面,慢查询、SQL优化; Redis缓存层面,网络延迟,大key,内存淘汰策略等; 网络层面;...原创 2021-03-25 17:26:03 · 327 阅读 · 0 评论 -
为什么要重写 hashcode 和 equals 方法?
一、简介相信大家对HashMap都很很熟悉了,最常见的就是:Map<String, Object> map = new HashMap<String,Object>();可以看到这里我们的key是字符串类型的,当我们想使用对象类型作为hashmap的key,使用不当的话,有没有想过会不会有什么问题呢?HashMap是一个数组+链表的数据结构,在HashMap中,当我们put一个元素的时候,是通过Hash函数来计算元素在数组中的下标的。下面我们通过一个简单的例子说明一原创 2021-03-19 15:01:27 · 623 阅读 · 0 评论 -
浅谈系统如何对接社交登录之微博登录功能
一、简介本篇文章主要分享一下系统如何对接社交登录功能,社交登录有好多种方式,比如QQ、微信、微博等,本篇文章以微博为例简单总结一下大体的实现步骤。二、新建应用浏览器访问:https://open.weibo.com/,使用自己的微博账号登录。我们首先需要建议一个自己的用,其实就是申请App Key和App Secret。【a】点击网站接入【b】创建新应用【c】查看App Key和App Secret【d】OAuth2.0 授权设置三、分析OAuth2.原创 2021-02-26 16:17:42 · 1107 阅读 · 0 评论 -
使用Groovy将一段代码动态构造成一个类的方法
一、简介在项目中,有时候需要将动态调用Java代码,但是代码可能是通过富文本编辑器保存在库里面的,并且使用CLOB数据类型保存。那么在使用的时候,我们必然需要将库里面的代码动态构造成一个Class类,然后通过反射调用类的方法实现功能。下面总结一下如何使用Groovy将一段代码动态构造成一个类。二、使用方法【a】pom文件引入groovy依赖包<dependency> <groupId>org.codehaus.groovy</groupId>原创 2020-07-15 11:36:15 · 1057 阅读 · 0 评论 -
XML解析成实体类统一工具类
一、简介最近在项目中需要用到XML解析成实体类,并将值封装到实体类属性中,于是封装了一个工具类。下面是具体的代码:NHXmlParseUtils.java:package com.ly.cloud.common.webservice;import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Node;import org.slf4j.Logger;import org.slf4j.Logge原创 2020-06-28 16:27:33 · 1689 阅读 · 0 评论 -
SpringBoot调用.asmx后缀的webservice接口
目录一、简介二、示例一、简介最近在项目中,在与其他公司做对接中需要回调一个对方的接口,根据对方提供的接口地址,发现是webservice的接口,而且接口后缀名为.asmx,因为现在webservice接口基本上都是wsdl这种形式,所以使用wsdl调用方式不能用,得使用其他方法。WebService是一个SOA(面向服务的编程)的架构,它是不依赖于语言,不依赖于平台,可以实现不同的语言间的相互调用,通过Internet进行基于Http协议的网络应用间的交互。其实WebService.原创 2020-06-28 09:36:38 · 4506 阅读 · 1 评论 -
并发修改异常ConcurrentModificationException详解
目录一、简介二、异常原因分析三、异常原因追踪五、如何避免并发修改异常?六、总结一、简介在多线程编程中,相信很多小伙伴都遇到过并发修改异常ConcurrentModificationException,本篇文章我们就来讲解并发修改异常的现象以及分析一下它是如何产生的。异常产生原因:并发修改异常指的是在并发环境下,当方法检测到对象的并发修改,但不允许这种修改时,抛出该异常。下面看一个示例:public class TestConcurrentModifyException原创 2020-06-14 10:05:51 · 9654 阅读 · 3 评论 -
开放接口API安全性之签名验证【url签名算法】
一、简介首先谈谈什么是接口安全问题?接口安全,其实就是保证自己应用程序对外暴露接口的安全,即我这个接口只能某些第三方应用进行访问,不应该被别人随意访问。服务端对外开放API接口,必须关注接口安全性的问题,要确保第三方应用程序与API接口之间的安全通信,防止数据被恶意篡改、伪造参数等攻击。常见保证接口安全的方式有下面几种方式:【a】签名验证方式( 本篇文章以本方式为例 ):服务端从某种层面来说需要验证接受到数据是否和客户端发来的数据是否一致,要验证数据在传输过程中有没有被注入攻击。这时候客户端原创 2020-05-29 11:16:31 · 5395 阅读 · 1 评论 -
面试题之对象创建的五种方式
一、简介在Java中,创建对象的方式有五种,分别为:通过new()调用构造方法创建对象; 通过反射xxx.getClass().newInstance()创建对象; 通过反射construct.newInstance()创建对象; 通过xxx.clone()克隆方法创建对象; 通过readObject()反序列化创建对象;下面通过示例分别说明五种方法。二、示例首先创建一个...原创 2020-02-11 21:04:56 · 377 阅读 · 0 评论 -
面试题之wait()和sleep()方法区别
一、简介sleep()和wait()方法区别 方法 sleep() wait() 概念 使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行) 导致当前线程等待,直到另一个线程调用该对象的notify()方法或notifyAll()方法 方法属于哪一个类...原创 2020-02-09 15:30:48 · 748 阅读 · 0 评论 -
面试题之Java中线程的几种状态
一、简介Java线程主要有以下六种状态: 状态名称 说明 NEW 初始状态,线程刚被构建,但是还没有调用start()方法 RUNNABLE 运行状态,Java系统系统中将操作系统中的就绪和运行两种状态笼统地称为“运行中” BLOCKED ...原创 2020-02-09 15:07:04 · 592 阅读 · 0 评论 -
面试题之Error和Exception总结
一、异常体系简介异常机制其实是帮助我们找到程序中的问题,异常的根类是 java.lang.Throwable ,其下有两个子类:java.lang.Error java.lang.Exception概念:Error:程序中发生的严重错误Error,无法处理的错误,只能事先避免; 如内存溢出等 Exception:表示异常,异常产生后程序员可以通过代码的方式纠正,使程序继续运行,是...原创 2020-02-08 15:36:51 · 474 阅读 · 0 评论 -
LinkedList类源码阅读
一、简介LinkedList位于java.util包中,也是我们比较常见的集合对象。LinkedList底层是基于双向链表实现的,适合于插入和删除比较多的场景,查询速度相对来说比较慢,由于需要沿着链表挨个查找。防止意外对列表的非同步访问: List list = Collections.synchronizedList(new LinkedList(...));链表是一种物理存储上非连...原创 2020-01-05 19:58:55 · 277 阅读 · 0 评论 -
面试题之序列化与反序列化
一、简介概念: 序列化:把对象转换为字节序列的过程称为对象的序列化。 反序列化:把字节序列恢复为对象的过程称为对象的反序列化。 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。一般将一个对象存储至一个储存媒介,例如档案或是记亿体缓冲等。在网络传输过程中,可以是字节或是XML等格式。而字节的或XML编码格式可以还原完全相等的对象,这个相反的过...原创 2020-01-05 00:17:02 · 1632 阅读 · 0 评论 -
通过自定义注解排除不需要过滤URL的方法
一、简介最近在项目中,使用过滤器的时候,在设置哪些URL需要过滤,哪些URL不需过滤时,一开始想着用配置文件的形式进行配置(当然这种方法也可行),但是我想了想有没有更加优雅的方式,这种URL硬编码在配置文件里面并不太友好,也不好维护,于是我想到了用自定义注解的形式来配置哪些URL进行排除在外,下面就介绍详细的实现步骤。二、实现步骤【a】创建springboot项目,pom.xml依赖文...原创 2019-10-16 17:37:59 · 3315 阅读 · 2 评论 -
List中根据某个实体的属性去重
一、简介最近在项目中有需要对List<T>我们自定义对象中的某个字段属性进行去重,于是封装了一些方法来进行去重。下面将总结三种方法根据某个字段属性进行List去重的方法。二、去重【a】工具类:ListDistinctUtils.javapublic class ListDistinctUtils { /** * 使用TreeSet结合Comparator比较器...原创 2019-08-21 11:11:48 · 4584 阅读 · 0 评论 -
Java线程 生产者--消费者模式总结(一)
一、简介所谓生产者消费者模式,简单理解,就是当生产者在生产资源的时候,消费者在等待,直到生产者生产完成之后,消费者才能进行消费操作。二、示例下面我们以一个生产消费面包的示例说明生产者消费者,达到: 生产者做好面包后,消费者消费; 生产者做好面包后,消费者消费; 生产者做好面包后,消费者消费。。。依次循环。【a】首先,我们先创建资源共享类【面包类】Bread.java:该类提供了...原创 2018-11-25 21:21:19 · 453 阅读 · 0 评论 -
Java集合Collection之遍历方法总结(List、Map、Set)
一、简介实际项目中,通常会用到循环遍历List、Map等,今天有空总结了一下List/Map/Set的遍历方法,如下: 二、List遍历List遍历的方法一般有三种: 【a】使用普通的for循环;【b】使用增强for循环;【c】使用Iterator接口遍历;下面以一个示例说明一下List的遍历方法:package com.wsh;import java.u...原创 2018-10-04 16:17:12 · 778 阅读 · 0 评论 -
window.open实现post方式复杂参数传递
一、需求分析最近在项目中,有个导出word的需求,但是需要传递一些复杂的参数到后端进行数据查询后再进行导出,需要使用window.open()方法实现。如果是简单参数并且参数不重要的话,可以使用get方式直接在url上进行参数拼接,然后后台直接获取即可。但是目前我需要传递的参数有好几个,并且还有一些是序列化后的json等等,有可能会超长。这个时候如果是使用get方式的话,就可能会存在一些问题。...原创 2019-08-08 11:05:36 · 3701 阅读 · 1 评论 -
Java 反射Reflection总结二
一、简介上一篇文章总结了一些如何使用反射机制获取类的字段、方法以及构造方法信息的方法;本节主要总结如何通过反射动态调用类的方法、动态创建对象以及一些示例等。 二、反射使用示例首先,本节的User类需要做一些修改,主要加入了一些静态属性以及静态方法,后面会用到,具体代码如下:public class User { private int id; private...原创 2018-12-25 13:52:43 · 245 阅读 · 0 评论 -
Java 注解Annotation总结二
一、简介上篇文章主要介绍了注解的概念以及怎么自定义一些注解,本文将通过SpringBoot中实现获取当前登录用户的自定义注解示例,进一步熟悉自定义注解的实际应用场景。二、实现思路【a】定义用户实体类User:public class User implements Serializable { private String loginId; private St...原创 2018-12-19 11:41:29 · 286 阅读 · 0 评论 -
Java集合Collection之实现原理解读(ArrayList)
一、简介在项目中,相信大家都已经用过集合List,它提供了一系列的API,方便我们使用。今天有空去看了下ArrayList的源码,本章将会模仿源码实现一个简单的ArrayList,只是帮助理解ArrayList底层是怎么实现的,并没有必要去自定义ArrayList。二、实现原理ArrayList底层是通过数组实现的,所有对数据的操作其实底层都是对Object[]数组的操作, 具体的增删...原创 2018-10-03 16:16:26 · 382 阅读 · 0 评论 -
Java集合Collection之实现原理解读(LinkedList)
一、简介LinkedList与ArrayList一样都实现了List接口,不过LinkedList底层实现是双向链表,对于插入、修改、删除速度比较快,对于查询就比较慢,因为要循环遍历查找。本章将模仿LinkedList源码实现一个简单的自定义LinkedList,以帮助饿哦们理解LinkedList底层是怎么实现的。二、实现原理LinkedList底层是通过双向链表实现的,通过一系列的...原创 2018-10-03 20:58:00 · 1315 阅读 · 1 评论 -
Java集合Collection之实现原理解读(Map)
一、简介除了List,平时在项目中用的比较多的还有Map,Map是存放键值对的数据结构,键不允许重复,如果键重复会覆盖之前的值。比较常用到的有: HashMap和HashTable。本文将会模仿Map的源码实现两个自定义的Map(一个是没有用hashcode的效率低的版本,一个是用hashcode优化版),只是帮助理解Map底层实现原理,实际项目中没有必要去自定义Map。二、实现原理M...原创 2018-10-04 09:32:23 · 1120 阅读 · 0 评论 -
Java集合Collection之实现原理解读(HashSet)
一、简介HashSet实现Set接口,底层是由哈希表实现(实际上是HashMap),Set里面的元素无序不重复,可以允许null值。对于熟悉HashMap底层实现的同学相信很容易理解HashSet底层实现原理。 二、实现原理HashSet底层是通过HashMap实现的,通过HashMap来保存所有的元素,HashSet对数据的操作基本上都是调用HashMap的一些方法进行操作,所以...原创 2018-10-04 15:56:12 · 409 阅读 · 0 评论 -
HashMap分拣存储示例
一、前言众所周知,HashMap是存放键值对的数据结构,但是在实际项目中,还有一个比较常用的HashMap分拣存储思想,本文将通过"统计一句英文中各个单词出现的次数"示例来说明HashMap分拣存储的思想。二、分拣存储原理简单的理解,举一个生活中的例子,分拣存储类似于我们平日生活中的快递分包裹,大家都知道包裹发往全国各地,在打包过程中,假设其中一个包裹是发往北京的,那我们事先准备一个袋...原创 2018-10-14 21:28:56 · 436 阅读 · 0 评论 -
Java代码优化的一些方法(总结)
一、简介代码优化,目的有两个,第一个就是为了让我们的代码体积尽可能变小,看起来比较清晰,第二个就是为了提高代码运行效率。个人觉得,在平时编写代码的同时,尽量要求自己,养成良好的编码习惯,一个小的优化点,积攒起来肯定会有好处,也能对我们自己以后的代码风格有好处。本文参考了阿里巴巴开发者手册以及网上一些博客,个人进行编码实践之后,重新总结了一些平时项目中常用的一些代码优化技巧,供大家参考学习。...原创 2018-10-10 11:11:30 · 1634 阅读 · 0 评论 -
Java排序之Comparable与Comparator详解
一、简介本文主要讲解Comparable接口以及Comparator接口的比较原理以及在实际场景的一些使用方法,以及两者的区别。二、Comparable接口Comparable是一个排序接口,如果一个类实现了Comparable接口,并且实现了compareTo()方法,那么这个类就支持排序。Comparable接口是一个内比较器,这些类可以与自身进行比较。实现了Comparable接...原创 2018-10-21 10:30:29 · 772 阅读 · 0 评论 -
Java创建多线程的方法总结
一、简介Java中创建线程主要有四种方式,分别是:【a】继承Thread类,实现run()方法;【b】实现Runnable接口,实现run()方法;【c】通过实现Callable接口,实现call()方法,结合FutureTask创建线程;【d】通过线程池创建,主要使用ExecutorService、Executors等下面将具体对每一种方法进行讲解。二、继承Threa...原创 2018-11-06 20:48:33 · 858 阅读 · 0 评论 -
Java IO流常用操作方法总结
一、简介在实际工作中,基本上每个项目难免都会有文件相关的操作,比如文件上传、文件下载等,这些操作都是使用IO流进行操作的,本文将通过简单的示例对常用的一些IO流进行总结。二、使用详解【a】FileInputStream与FileOutputStream首先通过查看jdk文档,了解下FileInputStream与FileOutputStream的操作方法:FileInputSt...原创 2018-11-04 10:35:07 · 1496 阅读 · 0 评论 -
Java 序列化与反序列化详解
一、简介序列化:把对象存储为二进制格式(字节序列)的过程(我们看不懂,但是计算机能够识别这些字节序列)。反序列化:把二进制格式(字节序列)还原为相应的对象的过程。二、序列化的应用场景实际工作中用到序列化的场景主要有两个:【a】对象持久化: 对象持久化操作的时候,可以保存在文件也可以保存在数据库中,常见的都是保存在数据库中。【b】网络传输: 当对象需要在网络上传输的时候,...原创 2018-11-04 20:38:52 · 329 阅读 · 0 评论 -
Java Thread之Sleep()使用方法总结
一、API简介Thread.sleep()是Thread类的一个静态方法,使当前线程休眠,进入阻塞状态(暂停执行),如果线程在睡眠状态被中断,将会抛出IterruptedException中断异常。。主要方法如下:【a】sleep(long millis) 线程睡眠 millis 毫秒【b】sleep(long millis, int nanos) 线程睡眠 millis 毫秒 +...原创 2018-11-12 17:19:45 · 97735 阅读 · 4 评论 -
Java sychronized关键字总结(二)
一、简介上篇文章我们主要讲解了synchronized(this)以及synchronized修改非静态方法的简单用法,大致了解了如何使用synchronized在多线程环境中对共享资源的访问问题,本篇将对synchronized修饰静态方法以及synchronized(类名.class)两种用法做一个简单的介绍。在Java中,不管一个类对应生成了多少个对象,他们都对应一个.class字节...原创 2018-11-20 17:43:21 · 231 阅读 · 0 评论 -
Java sychronized关键字总结(一)
一、简介synchronized,是java的关键字,它代表这个方法加锁,相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程B(或者C、 D等)正在用这个方法(或者该类的其他同步方法),有的话要等正在使用synchronized方法的线程B(或者C 、D)运行完这个方法后再运行此线程A,没有的话,锁定调用者,然后直接运行。它包括两种用法:synchronized 同步...原创 2018-11-16 20:29:09 · 291 阅读 · 0 评论 -
Java 线程死锁初理解
一、死锁的概念大家都知道,过多的多线程操作容易造成死锁。死锁,简单的理解就是多个线程因竞争资源造成一种互相等待的现场,以致于程序一直卡住,只能通过中止并重启的方式来让程序重新执行。 二、死锁理解示例2个人一起吃饭但是只有一双筷子,2人轮流吃(同时拥有2只筷子才能吃)。某一个时候,一个拿了左筷子,一人拿了右筷子,2个人都同时占用一个资源,等待另一个资源,这个时候甲在等待乙吃完并释放它...原创 2018-11-25 09:40:33 · 227 阅读 · 0 评论 -
Java线程 生产者--消费者模式总结(二)
一、简介上篇文章对生产者--消费者模式进行了初步的讲解,并通过一个简单的示例说明了怎么使用信号灯法实现生产者-消费者模式,本文将继续通过一个示例说明多生产者多消费者的场景。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。二、多生产者多消费者示...原创 2018-11-26 20:54:33 · 253 阅读 · 0 评论 -
Java 反射Reflection总结一
一、反射的概念反射,英文Reflection,是指运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的功能就称为java语言的反射机制。简单理解就是,通过反射机制,我们可以获取到类的全部信息(方法、字段属性、构造方法等)。要实现反射机制,就必须获取到类对应的Clas...原创 2018-12-19 15:36:01 · 283 阅读 · 0 评论 -
Java 注解Annotation总结一
一、注解的概念注解,英文Annontation,注解就像修饰符一样,应用于包、类型、构造方法、方法、成员变量、参数及本地变量的声明语句中,起到说明、配置的功能。注解相关的API都在包含在 java.lang.annotation 包中。 二、注解的作用【a】生成文档:如@param/@return等注解。【b】跟踪代码依赖性,实现替代配置文件功能:可以实现注入配置文件的内容,如...原创 2018-12-19 10:11:18 · 300 阅读 · 0 评论