Java基础
yxh13521338301
只分享干货的码农
展开
-
想要在springboot启动后马上做些事情?源码告诉你怎么实现
话不多说,直接上源码。(springboot的启动源码不再过多阐述了哈,感兴趣的朋友可以自行查看源码或查看我的了一篇博文《springboot2.0启动原理源码剖析》)public ConfigurableApplicationContext run(String... args) { StopWatch stopWatch = new StopWatch(); stopWatch.start(); ConfigurableApplicationContext context = null;.原创 2020-12-24 09:23:49 · 406 阅读 · 2 评论 -
被解刨的JVM
作为java应用程序的基层员工,JVM总是默默无闻地辛苦工作。年近尾声,年度评优工作开始进展。往年都是框架、并发等员工当选,咱不能总让老实人吃亏。综合解剖一下JVM,看看它做了哪些了不起的事情。(主要针对java内存结构做分析)一、类加载过程Java应用程序是不能直接运行的,需要通过java complier进行编译,将其转为class字节码文件,然后交由不同环境的JVM进行运行。那么,JVM到底是干什么的呢?它如何做到存放或创建实例对象的?又是如何进行对象内存回收?别着急,我们先看看这位员工.原创 2020-12-17 16:51:15 · 283 阅读 · 0 评论 -
sql += ““,这样写字符串为什么不合适?
源于蚂蚁课堂的学习,点击这里查看(老余很给力)字符串算是所有语言的共性了,Java的字符串提供了两种拼接工具,StringBuilder和StringBuffer。但实际开发中,还是有很多猿友喜欢这样去拼接字符串。比如,写一个案例:public class Test { public static void main(String[] args) { String a = "a"; a += "b"; a += "c"; }...原创 2020-10-27 10:00:31 · 995 阅读 · 2 评论 -
关于Java类加载的回忆
源于蚂蚁课堂的学习,点击这里查看(老余很给力)Java底层是由C++去编写的,而C/C++由是封装汇编指令,进而转为二进制被计算机识别。所以当我们作为Java开发者,写好Java代码后,是需要进过JavaComplier进行编译生成class字节码文件,然后由类加载器将字节码文件加载至Java虚拟机内存中进行使用,JVM通过调用C的指令转汇编,从而使得代码生效。本文将简单聊聊博主对Java类加载机制相关知识的理解。一、Class字节码生成原理这对于大多数开发者而已,应该耳熟能详,...原创 2020-10-22 10:05:49 · 304 阅读 · 1 评论 -
Java8 stream流,list转Map
key重复,value转集合Map<Long, List<Object>> map = list.stream().collect(Collectors.toMap(Object::getId, a -> new ArrayList<>(Arrays.asList(a)), (a1, a2) -> { a1.addAll(a2); return a1; }));key重复,value覆盖Map<Lo..原创 2020-10-26 09:16:15 · 773 阅读 · 0 评论 -
线程安全的天选之子ThreadLocal
源于蚂蚁课堂的学习,点击这里查看(老余很给力)一、前言 物欲横流的信息时代下,性能和效率是产品在百花齐放中脱颖而出的致胜法宝。作为软件研发人员,在物理硬件固定的情形中,如何确保程序高效吞吐赫然是必备的看家本领。而提升效率就会涉及老生常谈的多线程处理,那么对于这种高效手段需要注意的线程安全问题,相比很多猿友一定耳濡目染了,今天帝都的雁为大家带来一种线程安全的技术手--ThreadLocal。(PS:需要有JVM垃圾回收、强引用、软引用、弱引用以及虚引用等相关理论基础)二、用...原创 2020-08-07 15:58:21 · 191 阅读 · 0 评论 -
java类加载过程
前言作为Java应用程序的开发,我们主要还是去写java代码,java文件对于JVM来说是陌生的,故需要编译器javac通过自身的机制如词法分析、语法分析等将.java文件编译为.class文件。 那么class字节码又是如何加载至JVM内存呢加载Load根据当前类字节码的全路径名称去所有数据源(如:jar)中查找此类,找到后将其映射为JVM认可的java.lang.Class对象连接Linked验证校验当前Class的一些编译上的信息,判断其是否符合JVM..原创 2020-07-16 09:52:32 · 203 阅读 · 0 评论 -
java代码仿真ajax异步等待(future)
源于蚂蚁课堂的学习,点击这里查看(老余很给力)package live.yanxiaohui.test;/** * @Description 真实数据 * @CSDN https://blog.csdn.net/yxh13521338301 * @Author: yanxh<br> * @Date 2020-05-19 14:35<br> * @Version 1.0<br> */public class Real { // 请求的结果原创 2020-05-19 14:58:57 · 212 阅读 · 0 评论 -
多线程之间的通讯(仿真生产与消费)
源于蚂蚁课堂的学习,点击这里查看(老余很给力)java内存模型(jmm)java内存模型分为两大类型即,主内存和本地内存1.主内存 也就是主进程所占用的内存2.本地内存 线程中开辟的属于线程自己的内存,其中存放着全局变量的副本数据 也就是全局共享的数据实在主内存中的,线程中复制一份放入自己的本地内存,线程执行结束后将其变动刷新至主内存。 这也就是为什么多线程会有线程安全的问题所在。 多个线程同时做了修改,都去刷新主内存,会造成结果和实际不一致。原创 2020-05-15 14:10:39 · 949 阅读 · 3 评论 -
LinkedList的增删一定比ArrayList快吗?
1.背景众所周知,arrayList底层是通过数组实现,当其超过容量时,会进行1.5的扩容,将原数组数据迁移至新数组中。而LinkedList底层为双向链表,其增加操作直接在尾部新增一个node节点即可。那么,在插入相同的数据情况下(集合默认长度都是0),到底谁更快呢?2.案例 public static void main(String[] args) {...原创 2020-04-29 10:52:10 · 1104 阅读 · 1 评论 -
浅谈为什么头插法会导致hashmap7扩容死循环而尾插法却不会
源于蚂蚁课堂的学习,点击这里查看(老余很给力)JDK1.7的HashMap在put元素时,如果key不存在,将会创建新的Entry,将其添加addEntry void addEntry(int hash, K key, V value, int bucketIndex) { if ((size >= threshold) && (...原创 2020-04-20 11:33:37 · 5828 阅读 · 7 评论 -
JDK1.8ConcurrentHashMap源码剖析
源于蚂蚁课堂的学习,点击这里查看(老余很给力)1.源码剖析a.putb.initTable2.总结ConcurrentHashMap的底层原理类似于hashMap8,但它是线程安全的,具体体现1.为数组初始化或扩容时,采用CAS去方式多线程修改共享数据2.为数组index对应的node赋值时,会将node使用同步代码块加锁3.若线程1在扩容,其...原创 2020-04-18 16:33:22 · 378 阅读 · 0 评论 -
HashMap1.8源码剖析
源于蚂蚁课堂的学习,点击这里查看(老余很给力)1.优化点对比JDK7和8两个版本,发现HashMap做了很大的改动1.数据结构上面 JDK7: 数组 + 单向链表 JDK8: 数组 + 单向链表 +红黑树 改动原因:单向链表的时间复杂度为O(N),红黑树的时间复杂度为O(logN),提升查询效率2.链表的插入方式 JDK7: 头插入 JDK8:...原创 2020-04-18 14:42:10 · 137 阅读 · 0 评论 -
手写二叉树
package live.yanxiaohui.tree;/** * @Description todo * @Author: yanxh<br> * @Date 2020-04-15 17:08<br> * @Version 1.0<br> */public class SearchTree { SearchTree left;...原创 2020-04-15 17:34:35 · 104 阅读 · 0 评论 -
HashMap1.7源码剖析
源于蚂蚁课堂的学习,点击这里查看(老余很给力)静态内部类1.构造方法2.put(K,V)3.get(k)4.resize()5.总结1.HashMap1.7实际上是基于数组+单向链表的数据结构去存储数据的,而且是使用静态内部类Entry去维护键值对...原创 2020-04-15 15:44:32 · 111 阅读 · 0 评论 -
源码分析ArrayList、LinkedList和Vector
源于蚂蚁课堂的学习,点击这里查看1.ArrayList1.add时根据当前数组的容量和需要添加数据所需要的最小容量比较,判断是否需要扩容,如果需要的话,默认扩容1.5倍,1.5倍不够的话,就扩容至最小容量;然后就此次要添加的数据放入数据对应下标位置,并有效长度+12.remove时,会先去检查数组下标是否越界。然后会根据下标将对应下标位置的之后的数...原创 2020-04-14 17:58:56 · 97 阅读 · 0 评论 -
使用spring的观察者模式(事件监听)
以实际案例出发,商城商家发货后,会通过短信和邮件方式通知买家。但后期可能会增加微信通知和qq通知,想到设计模式中的观察者模式,于是结合spring,整理一下代码流程1.定义事件 (继承ApplicationEvent抽象类 )import org.springframework.context.ApplicationEvent;import java.util.Map;...原创 2019-12-11 13:57:00 · 540 阅读 · 0 评论 -
基于LinkedList手写hashMap1.7
定义map接口package live.yanxiaohui.map;/** * @Description 自定义map * @Author: yanxh<br> * @Date 2019/12/2 14:02<br> * @Version 1.0<br> */public interface YXHMap<K,V> {...原创 2019-12-02 17:04:25 · 206 阅读 · 0 评论 -
内存溢出OutOfMemoryError
这是一个老生常谈的问题,至于这种异常产生的原因无外乎几种:JVM内存设置太小、内存泄漏、死循环和无限递归等。一、常见问题类型的原因及解决方法1. tomcat:java.lang.OutOfMemoryError: PermGen space问题类型: PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要...原创 2019-05-20 10:39:54 · 297 阅读 · 0 评论 -
自定义jar放入maven仓库
在终端输入:mvn install:install-file -Dfile=D:\xxx-2.1.5.jar -DgroupId=com.xxxx -DartifactId=aaaaa-Dversion=2.1.5 -Dpackaging=jar其中:-Dfile后为jar的物流路径-DgroupId、-DartifactId、-Dversion和maven依赖保持一直...原创 2018-12-27 15:36:04 · 436 阅读 · 0 评论 -
过滤器使用
一、过滤器1.1概述Servlet的技术规范中,定义了Servlet、Filter(过滤器)、Listener(监听器)三门技术。过滤器也被称为拦截器。过滤器(拦截器)可以拦截对资源的访问,一个资源可以被多个过滤器所拦截;一个过滤器又可以拦截多个资源。拦截下来后可以控制是否允许访问(权限控制)、在访问资源之前或之后做一些操作(比如:事务管理、乱码处理、禁止jsp页面缓存等等)1.2过...原创 2018-06-10 14:12:05 · 313 阅读 · 4 评论 -
菜鸟程序猿之浅谈泛型
一、泛型1.1泛型的概述:Java5开始新特性,表示不确定的类型。分类:集合泛型和自定义泛型注意:泛型是提供javac(编译器)使用的,它用于限定集合中的输入类型,让编译器在源码级别上,挡住向集合中添加的非法数据。但是编译器编译完之后,带有泛型的程序,生成的.class字节码文件中将不存在泛型。以此使程序在运行时效率不受影响,这个过程被称为泛型“擦除”。1.2、集合泛型集合泛型可以...原创 2018-06-10 14:10:28 · 272 阅读 · 0 评论 -
JSP+EL表达式入门学习
一、JSP1.1、jsp介绍jsp是SUN公司提供动态的web技术之一。Servlet显示功能时,非常麻烦,编写与代码维护非常麻烦;通过查看..\apache-tomcat-7.0.53\work\...\index_jsp.java发现该类继承了org.apache.jasper.runtime.HttpJspBase类,该类又继承了HttpServlet(apache-tom...原创 2018-06-10 14:06:42 · 583 阅读 · 0 评论 -
菜鸟程序猿之JDBC
一.JDBC 1.JDBC的概念: (掌握) (1)数据库驱动: 数据库厂商提供的用来操作数据库的jar包 (2)JDBC: 由于不同的数据库厂商提供的数据库驱动各不相同,导致开发人员的学习成本十分的高,于是sun公司提供了一套用来统一访问数据库的标准,其实就是一大堆的接口, 各个数据库厂商设计的jar包都实现了这套接口, 因此开发人员只需要学会这套接口,所...原创 2018-06-10 14:02:07 · 225 阅读 · 0 评论 -
java 反射入门学习
一、概述java反射机制是在运行状态中,对于任意一个类,都能够获得这个类所有的属性和方法;对于任意一个对象都能调用它的属性和方法;这种动态获取的信息以及动态调用对象的方法的功能称为java的反射机制。反射就是将类中的成员分解为一个个java对象。二、反射涉及的类反射API用来生成JVM中的类、接口或则对象的信息。★Class类:反射的核心类,可以获取类的属性,方法等信息。...原创 2018-06-07 14:47:53 · 541 阅读 · 0 评论 -
自定义注解
相信很多猿友都知道,在自定义注解的时候,需要加上三个元注解,如图是我自定义的一个注解:其中:Documented:用于标明这个注解应该被 javadoc工具记录. 默认情况下,javadoc是不包括注解的. 但如果声明注解时指定了 @Documented,则它会被 javadoc 之类的工具处理, 所以注解类型信息也会被包括在生成的文档中。Target:用于标明自定义的注解可以加...原创 2018-07-25 14:09:18 · 145 阅读 · 0 评论 -
@Inherited
被元注解Inherited修饰的注解,只有作用在类上时,会被子类继承此自定义的注解,其余情况都不会继承原创 2018-10-22 14:57:10 · 2611 阅读 · 0 评论 -
简单的加密解密算法
package com.chongdong.sso.util;import java.util.Random;/** * 简单的加密解密工具类 * @author yanxh * */public class DecoderOrEncoderUtils { /** 加密前缀长度 **/ public static final int PREFIX_LENGTH = 5;...原创 2018-11-09 11:06:25 · 248 阅读 · 0 评论 -
java动态代理的Demo
jdk的动态代理离不开两个核心的类,java.lang.reflect.Proxy和java.lang.reflect.InvocationHandler,前者创造代理对象,后者增强代理行为。话不多说,直接上代码被代理者的父类接口(游戏)package cn.yanxiaohui.service.web.test.proxy.dynamic;/** * 动态代理的测试接口 * @a...原创 2019-03-18 13:17:23 · 732 阅读 · 0 评论 -
Java模版模式DEMO
模版类package cn.yanxiaohui.service.web.test.template;/** * 模版模式 * 旅游的三要素: * 吃 * 玩 * 休息 * @author yanxh * */public abstract class Tourism { public final void comeOn() { System....原创 2019-03-22 14:23:33 · 181 阅读 · 0 评论 -
Java发送邮件附件名称乱码问题
MimeUtility.encodeText(name)使用这个方法对附件名称进行转码即可原创 2019-04-01 15:17:08 · 1147 阅读 · 0 评论 -
常用邮箱服务器及其端口整理
gmail(google.com)POP3服务器地址:pop.gmail.com(SSL启用 端口:995)SMTP服务器地址:smtp.gmail.com(SSL启用端口:587)21cn.comPOP3服务器地址:pop.21cn.com(端口:110)SMTP服务器地址:smtp.21cn.com(端口:25)sina.comPOP3服务器地址:pop3.si...原创 2019-04-01 17:43:39 · 35779 阅读 · 0 评论 -
使用JAVA发送带附件的邮件
首先定义我们的邮箱类/** * 邮件类 * * @author yanxh * */public class Mail { /** * smtp服务器 */ private String smtpHost = ""; /** * smtp服务器是否授权 true表示授权 */ private String smtpAuth = ""; /** ...原创 2019-04-01 17:44:23 · 402 阅读 · 2 评论 -
观察者模式DEMO
场景订阅号发布信息,相关读者可以自动查看信息被观察的接口package cn.yanxiaohui.service.web.test.observer;/** * 定义被观察的接口 * 一般有三个方法:订阅,取消订阅以及推送信息 * @author yanxh */public interface Observerable { /** * 在被观察...原创 2019-04-11 11:17:36 · 116 阅读 · 0 评论 -
Java获取HTML文件的代码
public static String readfile(String filePath){ File file = new File(filePath); InputStream input = null; try { input = new FileInputStream(file); } ca...原创 2019-04-09 11:07:07 · 1098 阅读 · 0 评论 -
JAVA发送邮件附件变成.bin文件的解决方法
出现此类问题,多数是由于附件名称太长或附件名称有中文导致。在发送邮件的方法类中加上静态代码块即可 /** * 后加的防止题目过长并且进行全局定义 */ static { System.setProperty("mail.mime.splitlongparameters", "false"); System.setProperty("mail.mime.charset",...原创 2019-04-01 15:17:23 · 4112 阅读 · 2 评论