
【Java】
Mandy_i
科技让生活更美好,终身学习的践行者
展开
-
【Java8新特性】——Stream的reduce及Collect使用方式
文章目录前言一、Reduce1.1一个参数的ReduceBiFunctionBinaryOperator1.2二个参数的Reduce1.3三个参数的Reduce非并行并行二、Collect定义BiConsumer三、Collector四、定制收集器总结前言本文主要讲解关于Stream中reduce的使用方式以及Collect使用方式,同时展示如何自定义收集器。提示:如果大家对lambda表达式中的四大基础函数不清楚,推荐大家优先看下四大内置核心函数式接口以及看下关于reduce相关api的使用,J原创 2020-12-20 22:21:01 · 1905 阅读 · 0 评论 -
【JavaSE】——ArrayList源码解析
面试过程中常见问题ArrayList和LinkList有什么区别?通常答:两者数据结构不同,ArrayList是基于数组,LinkList是基于链表,ArrayList查询比较快,LinkList插入比较快。那么插入过程中LinkList真的比ArrayList快吗?那为什么coding过程无论插入还是查询都是使用ArrayList的情况多呢?你真的了解日常使用的ArrayList和LinkList的吗?...原创 2020-09-28 19:18:06 · 343 阅读 · 0 评论 -
【JUC】——深入浅出搞懂线程池
线程池一个并不陌生的概念,印象中的线程池经常使用,但是却不怎么了解原理。本文主要从线程出发,讲解线程池的使用,以及线程池的底层原理。线程创建线程的方式 继承Thread类 实现Runnable接口 实现Callable接口通过FutureTask包装器来创建Thread线程 但是从本质上来讲,java中创建线程的方式只有一种,就是实现Runable接口,即所以的线程都实现了run()方法。下面可以通过java中的UML图进行证明先看个线程的使...原创 2020-09-27 00:47:52 · 366 阅读 · 0 评论 -
【Java】——命名规范
基于三件事,学习Spring源码、阅读同事之前的代码、读《重构 改善既有代码的设计》意识到命名,是代码能否阅读的重要保证,而且这种对阅读理解的帮助是注释远不能替代的,利用这个机会重新学习下命名规范,如有错误之处恳请各位大佬指出,不胜感激。项目名称全部小写,多个单词中划线分隔"-",eg spring-cloud包名全部小写,点分隔符之间有且仅有一个自然语义的英文单词或者多个单词自然连接到一块(如 springframework,deepspace不需要使用任何分割)。包名...原创 2020-08-03 00:57:23 · 1646 阅读 · 0 评论 -
【Java8新特性】——四大内置核心函数式接口
之前其实写过Java8新特性的函数式接口的文章,现在再一次重复,之前学过的内容,偏重于笔记,在工作中的使用场景并不是很多,再一次总结,除了温故而知新,也结合一些自己工作中遇到的案例,希望可以帮助到需要的朋友。1、消费型接口,有入参,没有返回值通常用于对入参的逻辑处理,简化重复定义方法的流程,优化代码简洁度。@FunctionalInterfacepublic interface Consumer<T> { /** * Performs this ...原创 2020-07-12 18:50:24 · 418 阅读 · 1 评论 -
分布式事务——理论篇
数据库事务的四个原则ACID 原子性,一致性,隔离性,持久性 微服务的软件开发,数据库相互分离,在调用多个服务的过程中,涉及到多个数据库,数据库本身事务无法满足多个数据源之间的ACID。因此引出目前业界比较难处理的分布式事务问题。分布式事务原则CAP一致性,可用性,分区容错性。在分布式事务处理过程,不可能同时满足上述三者,只能同时满足两者,后续通...原创 2020-02-16 22:14:18 · 273 阅读 · 0 评论 -
Jrebel+springboot2.0 启动失败问题
背景 最近加入了一个项目,项目是基于springboot2.0+mybatis的,从git上拉下项目之后一直启动失败。问题报错原因一直显示为 关于Error creating bean with name 'sqlSessionFactory' defined in class path resource 报错,提示sqlSessionFactory创建失...原创 2019-08-18 20:55:13 · 2887 阅读 · 0 评论 -
CMQ——多线程实现自动拉取消息
何为CMQ? 腾讯云消息队列(Cloud Message Queue,CMQ)是一种分布式消息队列服务,它能够提供可靠的基于消息的异步通信机制,能够将分布式部署的不同应用(或同一应用的不同组件)之间的收发消息,存储在可靠有效的 CMQ 队列中,防止消息丢失。 CMQ 支持多进程同时读写,收发互不干扰,无需各应用或组件始终处于运行状态。——来源以及更多内容推荐看官方文档。 ...原创 2019-07-21 17:48:41 · 6077 阅读 · 4 评论 -
拦截error日志,并发送到钉钉群
之前公司的错误日志都发送到邮箱中,但是邮箱存在响应延迟,造成问题解决不及时,结合我们正在使用的通信方式,发送到钉钉中效果会更好些。 一般上,在开发过程中,像log4j2、logback日志框架都提供了很多Appender,基本上可以满足大部分的业务需求了。但在一些特殊需求可以自定义Appender。本文主讲利用自定义Appender拦截error级别日志以及sprin...原创 2019-07-08 12:52:01 · 3007 阅读 · 6 评论 -
网络通信——BIO
网络通信在编程世界中是必不可少的一部分,到目前为止网络通信主要经历了三个阶段BIO,NIO,AIO。本文主要介绍网络通信涉及到的一些概念,并且采用一个网络通信的Demo展示何为BIO——阻塞IO。基础概念1、阻塞、非阻塞 阻塞和非阻塞是指进程在访问数据的时候,数据内部是否准备就绪的一种处理方式。当数据没有准备的时候阻塞:需要等待缓冲区的数据准备好才去处...原创 2019-05-14 23:34:50 · 673 阅读 · 2 评论 -
常用时间工具类-某小时,天,星期,月的开始结束时间
在没有使用Java8之前在封装相关时间工具类的时候都使用的是java.util.Calendar。Java.util.Calendar类将日期同时存储为与标准纪元之间的偏移量以及一组日历字段。此双精度表示导致在意外的时间重新计算日历字段,从而产生不可预测的性能特点,java.util.Calendar是可改变的。也就是说明java.util.Calendar类是线程不安全的。在Java8中推出...原创 2019-05-06 10:08:15 · 458 阅读 · 1 评论 -
从零开始学netty
Netty概述:1、netty是基于Java NIO的网络应用框架,client-server框架2、Netty是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户可以方便的主动获取或者通过通知机制获得IO操作结果。3、作为当前最流行的NIO框架,N...原创 2019-04-28 23:20:33 · 407 阅读 · 4 评论 -
四种常见的post请求中的参数形式
1)、HTTP 协议是以 ASCII 码 传输,建立在 TCP/IP 协议之上的应用层规范。规范把 HTTP 请求分为三个部分:状态行、请求头、消息主体。2)、协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须 使用什么编码方式 。实际上,开发者完全可以自己决定消息主体的格式,只要最后发送的 HTTP 请求满足上面的格式就可以。3)、数据发送出...原创 2019-02-22 18:24:26 · 36143 阅读 · 0 评论 -
api接口不再裸奔——签名认证
在第三方调用api接口的时候,可能会存在以下几个问题请求身份是否合法? 请求参数是否被篡改? 请求是否唯一?解决上述三个问题分为如下流程1、合法性,通过请求许可来进行判断为开发者分配AccessKey(开发者标识,确保唯一)和SecretKey(用于接口加密,确保不易被穷举,生成算法不易被猜测)目前广泛使用token和AccessKey作用一样,都是第三方合法性的认证标示...原创 2019-02-17 20:46:47 · 1723 阅读 · 1 评论 -
【定时任务】——Spring定时任务Scheduled
定时任务在日常开发过程中非常常见,而且在日常的项目开发中也有多种实现方式,而且做任务调度的框架有很多种,小编最近的感受,如果想真正使用好任务调度还是存在困难的,所以分步学习,逐个击破!在这篇文章小编主要写spring中Scheduled。spring定时任务设置有两种方式,注解和xml配置。推荐使用注解,在本文章也主要介绍注解方式配置。注解方式配置定时任务下面的步骤默认s...原创 2019-01-28 15:29:54 · 621 阅读 · 0 评论 -
Java8特征性使用
最近在工作中加大了lambda表达式的使用,特此记录一些,会不断更新。list转成map,收集实体本身public Map<Long, Account> getIdAccountMap(List<Account> accounts) { return accounts.stream().collect(Collectors.toMap(Account::getI...原创 2018-12-23 21:03:08 · 724 阅读 · 3 评论 -
【Springboot】——整合p6spy格式化SQL日志
项目现状介绍 项目使用Springboot+Mybatis作为基础框架,项目中日志框架采用logback+Slf4J,关于日志中SQL部分日志的打印采用的mybatis本身打印格式,sql语句正常输出,参数的位置使用占位符“?”替代。这样造成问题就是在处理项目中的sql问题,sql格式打印不规范,从sql日志查看,到sql日志运行判断都会花费一些重...原创 2018-11-11 23:11:26 · 7120 阅读 · 6 评论 -
Caused by: java.lang.NoClassDefFoundError: org/springframework/cloud/client/loadbalancer/LoadBalanc
项目版本 spring boot 2.0.0.M3 spring cloud 2.0.0.M2构建环境 gradle问题spring cloud feign 启动报错 Caused by: java.lang.NoClassDefFoundError: org/springframework/cloud/client/loadbalancer/LoadBalancedRetryF...原创 2018-07-14 10:13:55 · 16116 阅读 · 2 评论 -
【Java】——自定义注解对参数进行校验、spring扫描自定义注解
前提 上篇博客中详细介绍自定义注解的使用,本文主要是对自定义注解的进一步深入。会使用CGLIb进行动态代理来完成对方法参数是否为空的判断,以及再spring中如何扫描自定义注解自定义注解对方法参数为空校验为什么要用动态代理?因为Java的反射拿不到参数的相关信息,对方法参数进行校验,肯定是要在方法执行前进行校验,所以就需要动态代理来完成。对真实的对象进行代理,让代理对象执行参数校验这一部分的...原创 2018-07-11 16:45:41 · 20302 阅读 · 1 评论 -
【Java】——Java中使用自定义注解(Annotation)
前言 本文主要讲解自定义注解过程中需要用到的内容,以及Java中自定义注解。在以下的讲解中如有理解偏颇之处,恳请各位大神指正,小编不胜感激!如果有不清楚什么是注解的朋友,请先认识注解【从零学Java】——认识Annotation注解注解语法注解通过@interface关键字修饰public @interface TestAnnotation {}注解应用@TestAnnotationpu...原创 2018-07-11 16:03:42 · 578 阅读 · 3 评论 -
【深入浅出JVM】——浅谈Java内存模型
本文主要分析介绍Java虚拟机内存的各个区域,主要介绍这些区域的作用,而且会着重讲解了一下堆内存。程序计数器 程序计数器是一块较小的内存空间,它可以看做当前线程所执行的字节码的行号指示器。字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码执行。分支,循环,跳转,异常处理,线程恢复等基础功能都需要依赖这个技术器来完成。 在任何一个确定的时刻,一个处理器只会执行一...原创 2018-06-04 10:35:42 · 1114 阅读 · 4 评论 -
【工具】——lombok不能生成get/set方法
问题 springboot2.0框架,构建工具gradle环境 idea 2017.3 idea中安装了lombok插件,在gradle中也引入关于lombok的相关配置,但是在编译后的class中不能生成get/set方法,从而造成响应错误。原因: idea中虽然安装了lombok,但是可能没有激活配置,从而造成lombok不可用。解决方案file-》Builder,Ex...原创 2018-05-26 21:34:05 · 8817 阅读 · 17 评论 -
【Java基础】——数据类型
概要 Java中数据类型分为两种:基本类型和引用类型基本类型分为四种:基本类型的类型转换自动类型转换 当一个范围小的类型直接赋给另一个范围大的类型是,系统可以自动类型转换,下图中从左到右均为自动类型转换强制类型转换 上图中从右向左的类型转换为强制类型转换。当数值范围比较的转向数值范围比较小的可能会溢出。 因为计算机底层存储的是二进制,所以当发送溢出的时候直接从进行了截取,将...原创 2018-05-26 15:33:21 · 271 阅读 · 16 评论 -
【工具】——IntelliJ IDEA 热部署插件JRebel
前提 Idea原生并不支持热部署,当更新了class文件都需要重启服务才可以生效,在开发过程中有大量的时间都用于重启,降低开发效率。再加上最近在IDEA上安装了一些插件,启动速度又变慢了,小编终于忍受不了!经过查找发现对于Idea热部署最好的解决方案就是安装JRebel,而且这样无论是更新class类还是spring配置文件均能做到立马生效,提高开发效率! 之前JRebel插件通过Fa...原创 2018-05-22 16:05:47 · 10249 阅读 · 17 评论 -
【深入浅出JVM】——类加载过程
概念 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。类加载流程:加载;(验证,准备,解析)三者统称为连接;初始化;使用;卸载。 类加载 通过一个类的全限定名来获取定义此类的二进制流 将这个字节流所代表的静态存储结构转换为方法区的运行时数据结构 在内存中生成一个...原创 2018-05-20 16:42:18 · 533 阅读 · 53 评论 -
【异常】——javax.mail发送邮件过程常见错误
前提 最近开发发送邮件功能,出现一些问题,特此记录一下。小编开发过程一直都是单元测试,可以发送成功,但是从swagger就是一直提示错误。问题一javax.mail.MessagingException: 500 Error: bad syntax其实翻译一下错误,语法不对。再加上小编出现错误的前提,功能肯定可以能用,所以怀疑对象为传输过程出现了问题。使用debug调试了一下,发现传输过程过...原创 2018-05-05 16:46:20 · 3132 阅读 · 8 评论 -
【调试】——idea远程调试服务器上的代码
前提 有些时候难免会出现一些线上问题,可能就需要远程调试服务器上的代码,依次快速定位错误代码,进行改正。小编最近通过idea进行了远程代码调试,特此记录一下,希望可以帮需要的朋友。步骤1、保证本机的代码和服务器上部署的一样。2、添加远程tomcat2、配置远程服务器ip以及端口3、配置本地开启调试的端口号4、将调试信息拷贝到tomcat/bin/catalina文件中JAVA_OPTS="-...原创 2018-05-05 16:07:25 · 7923 阅读 · 13 评论 -
【多线程】——停止线程的三种方式
前提 停止线程是在多线程开发时非常重要的方式,掌握线程的停止可以对线程的停止进行有效的处理。停止线程在Java中不像break那样干脆,而需要一些技巧性。停止线程的方式有三种,分别展示一下方式一使用退出标识,使得线程正常退出,即当run方法完成后进程终止。public void run() { while(flag){ //do something }}利用...原创 2018-04-28 18:33:47 · 30434 阅读 · 25 评论 -
【Java8新特性】——Optional
前提 著名的NullPointerException是导致Java应用程序失败的最常见原因,而在Java8中对这种常见错误提出了Optional<T>类(java.util.Optional)是一个容器类,代表一个值存在或不存在。Optional不是对null关键字的一种替代,而是对于null判定提供了一种更加优雅的实现,还可以避免空指针异常。 空指针是运行时异常,对于这一...原创 2018-04-28 15:34:35 · 1803 阅读 · 18 评论 -
【多线程】——start() vs run() 以及this vs Thread.currentThread()
前提 最近在学习多线程这一部分的内容,学习过程遇到不太理解的方法,特此总结一下。如果从开始,先了解一下如何创建线程《Thread VS Runnable》start()和run()public class MyThread extends Thread { public MyThread() { System.out.println("构造方法的打印:" + Thr...原创 2018-04-25 12:00:34 · 310 阅读 · 17 评论 -
【Java8新特性】——强大的Stream API
前提 Java8中除了lambda表达式,Stream API(java.util.stream.*)也是神一样的存在,尤其在简化代码,提高代码质量上,十分推荐使用!何为Stream?简单说,Stream API提供高效而且易于使用的处理数据方式。Stream是Java8中处理集合的关键抽象概念,可以对集合进行非常复杂的查找,过滤和映射等操作。利用Stream API对集合数据进行操作,类似...原创 2018-04-25 11:06:25 · 746 阅读 · 53 评论 -
【Java8新特性】——方法引用\构造器引用\数组引用\接口中默认方法以及静态方法
前提 之前的博客中讲过lambda的使用以及语法,官方对lambda的使用还做了进一步的优化。方法引用传递给Lambda体的操作,已经有实现的方法了,就可以使用方法引用!实现抽象方法的参数列表,必须与方法引用方法的参数列表与返回值类型保持一致。使用操作符“::”将方法名和对象或类名分隔开。(可以理解为方法引用是Lambda表达式的另外一种表现形式)1、对象::实例方法// 使用...原创 2018-04-23 12:12:29 · 325 阅读 · 13 评论 -
【Java8新特性】——函数式接口
前提 lambda表达式需要“函数式接口”的支持,接口中只有一个抽象方法的接口称为函数式接口,可以使用注解@FunctionalInterface检查接口是否是函数式接口。有些时候不能为了使用lambda表达式而去专门创建一些接口,这样反而会降低了开发效率。其实Java8本身提供一些函数式接口,方便大家的使用!本文主要讲解核心的四大内置函数式接口!四大核心函数式接口1、Consumer<...原创 2018-04-22 10:25:09 · 314 阅读 · 13 评论 -
【Java8新特性】——Lambda表达式
前提 在Java8中提出了lambda表达式,而且众多大神也极力推荐使用lambda表达式进行编程,以此提高开发效率,同时提升代码质量。经常使用lambda表达式的同胞都知道,使用lambda表达式极大程度避免了空指针的问题,提高系统的稳定性。所以无论怎么说,lambda表达式使用也是必备技能。小编在项目中也用过一些简单lambda表达式,但是一般都是看网上人家怎么写,自己就跟着人家的写法,...原创 2018-04-21 11:54:41 · 409 阅读 · 11 评论 -
【工具】——IDEA安装lombok
前提 在做Java开发的时候,每次都会写很多JavaBean,而bean字段都需要添加getter/setter方法,而通常我们只能用idea生成getter,setter等内容。其实生成也很简单,但是每次需要修改bean中内容的时候就变比较麻烦。为了减少这种重复的劳动,减少出错的概率,可以采用lombok,提高开发效率。使用注解,每次编译后的文件lombok自动生成需要的内容。配置lombo...原创 2018-04-05 09:37:55 · 2306 阅读 · 14 评论 -
【Mybatis】——批量操作参数丢失部分数据
问题 写了一个批量更新的方法,而且是那种非常简单的,如下 <update id="updateUserCode"> <foreach collection="allusersEntityList" item="allusersEntity"> update tc_allusers set user_code= #{allus...原创 2018-03-31 16:16:01 · 2973 阅读 · 10 评论 -
Spring通过@Value给静态变量注入值
前提spring不允许/不支持把值注入到静态变量中,如 @Value("${smtpHost}") public static String smtpHost;在方法中获取的smtpHost则为null解决Spring支持set方法注入,可以利用非静态的setter方法注入静态常量。注意set方法不能有staticpublic static String smtpHost;@Val...原创 2018-03-27 16:53:04 · 12805 阅读 · 22 评论 -
【Java基础】——static和final的区别
前提 最近在项目中用到static和final,利用这个机会弥补一下之前的学习过程中不足。如有理解偏颇之处还请各位大神指正!finalfinal可以修饰:属性,方法,类,局部变量 final修饰的属性值可以在编译期,运行期进行赋值。一旦赋值后,基本类型的数据不能再被改变,final修饰的引用类型变量只保证引用的地址不会发生改变。 f...原创 2018-03-25 19:40:41 · 360 阅读 · 15 评论 -
【Java基础】——JDK动态代理VSCGLIB动态代理
前提 之前分别写过代理模式和反射机制,这篇文章主要总结一下两者结合使用的产物动态代理。 JDK动态代理 JDK实现动态代理需要实现类通过实现接口定义业务方法完成。 实现方式public interface HelloService { public void sayHe...原创 2018-03-06 20:12:42 · 444 阅读 · 51 评论 -
【Java基础】——应用配置文件的反射
前提 上篇文章 【Java基础】——反射简单介绍了反射的使用方式,这篇博客主要讲解反射通过配置文件运行的步骤以及实现方式。也是各个框架利用反射最基本demo。 在上篇博客中获取reflect类的路径使用的reflect.class.getName(),如果当类不清楚,方法不清楚的时候又该怎样使...原创 2018-03-05 08:00:09 · 352 阅读 · 3 评论