![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java
mengml_smile
我就是我 不一样的自我
展开
-
spring i18n
springboot i8n 作用可以根据请求适配响应不同的语言参考文章原创 2022-03-18 15:51:36 · 346 阅读 · 0 评论 -
JVM
1.GC算法 1.标记清除算法 1.遍历GC Roots,然后将存活的对象标记 2.回收未被标记的对象 缺点 效率不高 空间会产生大量碎片 2.复制算法 将原有的内存空间一分为二,每次只用其中的一块,在垃圾回收时,将正在使用的对象复制到另外一个内存空间中,然后将该内存空间清空,交换两个内存的角色,完成垃圾回收 如果内存中的垃圾对象较多,需要复制的对象就较少,这种情况下适合使用该方式并且效率比较高,反之,则不适合 优点:在垃圾对象多的情况下,效率较高。清理后,内存无碎片 缺点:原创 2020-08-24 19:44:39 · 3245 阅读 · 0 评论 -
gson read number类型全部转换为double问题
gson read number类型全部转换为double问题问题描述gson反序列化数据时默认会将int long double等数值类型全部作为double来转换问题效果“result”:0解析出来为 0.00 会影响逻辑判断解决办法原理1.改源码ObjectTypeAdapter 解析NUMBER片段代码 打包为maven私服jar共用2.自定义MapTypeAdapter 代替 ObjectTypeAdapter 功能代码片段本文采用第二种方式解决public final c原创 2021-05-18 20:58:12 · 494 阅读 · 0 评论 -
代码重构
代码重构 link重命名方法重构模式/引入解释性变量重构模式/以查询取代临时变量重构模式(变量替换为对新方法调用)卫语句提炼方法原创 2021-03-12 14:52:56 · 72 阅读 · 0 评论 -
Exception
Exception堆栈信息打印不完全原因JVM中有个参数:OmitStackTraceInFastThrow,字面意思是省略异常栈信息从而快速抛出,那么JVM是如何做到快速抛出的呢?JVM对一些特定的异常类型做了Fast Throw优化,如果检测到在代码里某个位置连续多次抛出同一类型异常的话,C2会决定用Fast Throw方式来抛出异常,而异常Trace即详细的异常栈信息会被清空。这种异常抛出速度非常快,因为不需要在堆里分配内存,也不需要构造完整的异常栈信息效果抛出了几千次带有详细异常原创 2020-10-29 12:44:31 · 1400 阅读 · 0 评论 -
Java内存模型
主内存heap metaspace工作内存栈 程序计数器解释内存模型是java语言的一种规范影响线程安全问题 变量可见性原创 2020-10-21 13:31:05 · 1451 阅读 · 0 评论 -
jdk1.8新特性
jdk1.8新特性Lambda Lmabda表达式的语法总结: () -> () (用逗号分隔的参数列表,–>符号,函数体三部分) 无参数无返回值 () -> System.out.println(“Hello WOrld”) 有一个参数无返回值 (x) -> System.out.println(x) 有且只有一个参数无返回值 x -> System.out.println(x) 有多个参数,有返回值,有多条lambda体语句 (x,y) -> {Syst原创 2020-10-12 10:54:49 · 1648 阅读 · 0 评论 -
泛型<T>和<?>区别
<?>通配符在类上声明 <?>,是没有意义的。表示不确定的类型通配符表示不确定的类型函数里面可以对T进行操作当变量表达两个参数之间或参数与返回值的关系,即两处被使用可以使用不同的大写字母(效果一样)场景ArrayList al=new ArrayList();指定集合元素只能是T类型ArrayList<?> al=new ArrayList<?>();集合元素可以是任意类型,这种没有意义,一般是方法中,只是为了说明用法Array原创 2020-09-03 11:51:38 · 3972 阅读 · 0 评论 -
自定义注解
自定义注解1.@TargetElementType.TYPE 类 接口(包括注解类型)枚举ElementType.FIELD 属性(包括枚举中的常量)ElementType.METHOD 方法ElementType.PARAMETER 形参ElementType.CONSTRUCTOR 构造函数ElementType.LOCAL_VARIABLE 局部变量ElementType.ANNOTATION_TYPE 注解类型ElementType.PACKAGE 包2.@Retention原创 2020-09-01 16:31:58 · 3199 阅读 · 0 评论 -
java8中的default关键字
java8中的default关键字简介 接口中可以包含方法体,这打破了Java之前版本对接口的语法限制来源 java8之前的集合框架没有foreach方法,通常能想到的解决办法是在JDK里给相关的接口添加新的方法及实现。然而,对于已经发布的版本,是没法在给接口添加新方法的同时不影响已有的实现。所以引进的默认方法。他们的目的是为了解决接口的修改与现有的实现不兼容的问题。特性 1.接口方法可以有实现 2.子类实现接口可不实现该方法并且进行调用 3.子类可实现接口该方法调用相当于覆盖 4.继承优先原创 2020-09-01 14:24:15 · 3186 阅读 · 0 评论 -
poi
poi 两种模式1.用户模式一次性加载excel(xml文档以一棵DOM树的形式存放在内存中) 数据量大会OOM2.SAX模式(XSSF and SAX(event API))逐行读取xml解析(excel有03和07两种版本,两个版本数据存储方式截然不同,sax解析方式也各不一样 api复杂不利于实现)EasyExcel官网https://www.yuque.com/easyexcel/doc/easyexcel原理1.对poi的封装和改版2.文件解压文件读取通过文件形式(通过磁盘可以原创 2020-08-27 17:14:37 · 3595 阅读 · 0 评论 -
数据结构-tree
树根节点度 一个节点有多少个分支,度就是多少叶子节点 度为0的节点就是叶子节点(没有分支的节点都是叶子节点)树的度 一棵树中,最大的结点的度称为树的度深度 指从根节点到该节点的最长简单路径边的条数(根节点和叶子节点 深度和高度是一样的)高度 该节点到叶子节点的最长简单路径边的条数(根节点和叶子节点 深度和高度是一样的)二叉树树的度 不超过2的就是二叉树二叉搜索树(binary search tree)特征 左子树中所有节点的值小于根的值 右子树中所有节点的值大于或等于原创 2020-08-26 18:18:49 · 3328 阅读 · 0 评论 -
java中内存泄露
java中内存泄露1、静态集合类,如HashMap、LinkedList等(可以使用WeakHashMap) 如果这些容器为静态的,那么它们的生命周期与程序一致,则容器中的对象在程序结束之前将不能被释放, 从而造成内存泄漏。简单而言,长生命周期的对象持有短生命周期对象的引用,尽管短生命周期的对象不再使用, 但是因为长生命周期对象持有它的引用而导致不能被回收。2、各种连接,如数据库连接、网络连接和IO连接等 当不再使用时,需要调用close方法来释放与数据库的连接。只有连接被关闭后,垃圾回收器才会原创 2020-07-28 19:38:28 · 3302 阅读 · 0 评论 -
CAS和Unsafe
CASCompare-And-Swap是一条CPU的原子指令,其作用是让CPU先进行比较两个值是否相等,然后原子地更新某个位置的值,经过调查发现,其实现方式是基于硬件平台的汇编指令,就是说CAS是靠硬件实现的,JVM只是封装了汇编调用简单解释:CAS操作需要输入两个数值,一个旧值(期望操作前的值)和一个新值,在操作期间先比较下在旧值有没有发生变化,如果没有发生变化,才交换成新值,发生了变化则不交换CAS操作是原子性的,所以多线程并发使用CAS更新数据时,可以不使用锁Lock底层的AbstractQ原创 2020-07-21 19:57:06 · 3186 阅读 · 0 评论 -
ConcurrentHashMap
jdk1.8和jdk1.7对比1.取消了segment(extends ReentrantLock)分段设计,直接使用Node数组来保存数据,并且采用Node数组元素作为锁(synchronized(node))来实现每一行数据进行加锁来进一步减少并发冲突的概率2.将原本数组+单向链表的数据结构变更为了数组+单向链表+红黑树的结构 3.CAS无锁算法与synchronized保证和大量volatile修饰变量并发安全,支持并发扩容源码解读问题1.ConcurrentHashMap的get方法是原创 2020-07-21 19:31:51 · 3175 阅读 · 0 评论 -
java中的锁
java中的锁1.乐观VS悲观 乐观锁适合读操作多的场景,悲观锁适合写操作多的场景 1.悲观锁 数据库 select column from table where column='xx' for update; synchronized Lock 2.乐观锁 1.版本号 update 表 set 金额 = 120,version = version + 1 where 金额 = 100 and version = 0; 2.CAS(Compare-and-Swap比较并替原创 2020-07-20 18:07:41 · 3236 阅读 · 0 评论 -
java中数据结构
栈,队列链表## 树原创 2020-07-20 13:48:29 · 3122 阅读 · 0 评论 -
HashMap源码
属性public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable { //序列号,序列化的时候使用。 private static final long serialVersionUID = 362498820763181265L; /**默认容量,1向左移位4个,00000001变成00010000,也就是2原创 2020-07-20 12:49:25 · 3045 阅读 · 0 评论 -
自动装箱/拆箱
8种基本数据类型1.整形 byte Byte short Short int Integer long Long2.浮点型 float Float double Double3.逻辑型 boolean Boolean4.字符型 char Character编译自动加代码这些装箱(valueOf)拆箱(intValue,longValue,booleanValue)的方法是在编译成class文件时自动加上的...原创 2020-07-07 14:10:05 · 3104 阅读 · 0 评论 -
数组和List
String底层是数组(char[]数组)ArrayList1.底层是数组(Object[]数组)2.默认初始长度为103.扩容1.5倍(采用位运算int newCapacity = oldCapacity + (oldCapacity >> 1))4.为什么是size不是length因为size是逻辑长度 length是物理长度(String是length)5.可以指定长度new ArrayList<>(50)可以避免底层数组的多次拷贝,进而提高程序性能6.底层拷原创 2020-06-29 19:51:54 · 3261 阅读 · 0 评论 -
equals方法和hashCode方法
Object类源码public boolean equals(Object obj) { return (this == obj);} public native int hashCode();hashCode:是一个native方法,返回的是对象的内存地址equals:对于基本数据类型,== 比较的是两个变量的值。对于引用对象,==比较的是两个对象的地址。所以有为什么重写equals时必须重写hashCode方法这一说法...原创 2020-06-29 19:47:25 · 2567 阅读 · 0 评论 -
二进制与十进制
二进制与十进制1.二进制转十进制 从右往左开始,数每一位2的n次幂并相加,幂从0开始每次递增1 11101010 1*2^7+1*2^6+1*2^5+0*2^4+1*2^3+0*2^2+1*2^1+0*2^0=2342.十进制转二进制 除以2除到商为0即止,再把余数倒序相连 234 234 /2 商 117 余 0 117 /2 商 58 余 1 58 /2 商 29 余 0 29 /2 商 14 余 1 14 /2 商 7 余 0 7 /2 商原创 2020-06-23 16:10:38 · 2831 阅读 · 0 评论 -
线程池ThreadPoolExecutor
ThreadPoolExecutorjava.uitl.concurrent.ThreadPoolExecutor四个构造方法中重要参数corePoolSize,maximumPoolSize,keepAliveTime都是volatile 声明( volatile 变量用来保证线程之间的可见性)corePoolSize线程池的基本大小,即在没有任务需要执行的时候线程池的大小,并且只有在工作队列满了的情况下才会创建超出这个数量的线程,这个参数跟后面所说的线程池的实现原理有非常大的关系。在创建了线程原创 2020-06-23 14:25:51 · 2616 阅读 · 0 评论 -
NIO
BIO NIO NIO2(AIO)计算机用户空间(进程使用的空间) 应用程序运行在用户空间计算机内核空间 操作系统和驱动程序运行在内核空间BIO(blocking I/O) 在java进程(用户空间)向内核空间发起读取请求之后 1.系统内核和硬盘之间的复制过程(内核将硬盘中data copy到内存中) 2.内核空间把数据copy给用户空间的过程 1和2的过程 java进程一直是阻塞状态 BIO加多线程(tomcat) 这种模式具备一定的并发处理能力NIO(nonblo原创 2020-06-19 18:29:37 · 2681 阅读 · 0 评论 -
多线程
多线程1.Thread解释 是操作系统能够进行运算调度的最小单位 一个线程在一个时刻只能运行在一个处理器核心上2.多线程创建的方式 1.继承Thread类创建线程类 public class ExtendsThread extends Thread { public static void main(String[] args) { for(int i = 0;i<10;i++){ //创建并启动线程 new ExtendsThread().start(原创 2020-06-18 17:45:43 · 2574 阅读 · 0 评论 -
HashMap解读
HashMap的一些事1.new Hashmap(int initialCapacity)时设置初始化容量多少合适 hashmap在我们存放的数据大于初始化容量*负载因子(默认0.75)时就会自动扩容,自动扩容是非常消耗性能的。因为元素要重新hash分配 不设置值默认长度为16 initialCapacity = (存储元素个数 / 0.75 + 1) jdk1.8中的putAll方法就是...原创 2020-04-08 18:21:58 · 1991 阅读 · 0 评论 -
Spring中设计的Resource接口
Spring中设计的Resource接口ByteArrayResource:二进制数组表示的资源(构造方法参数为 byte[] byteArray)ClassPathResource:类路径下的资源,资源以相对于类路径的方式表示(构造方法参数为 String path)InputStreamResource:以输入流返回表示的资源(构造方法参数为 InputStream inputStrea...原创 2019-10-23 17:13:44 · 1467 阅读 · 0 评论 -
springboot和dynamic和MySQL和SqlServer多数据源配置
springboot和dynamic和MySQL和SqlServer多数据源配置配置 spring: datasource: dynamic: # 是否开启 SQL日志输出,生产环境建议关闭,有性能损耗 p6spy: true hikari: connection-timeout: 30000 max-lifetime: 1800000 ma...原创 2019-10-18 17:25:16 · 4725 阅读 · 2 评论 -
logback
logback1.性能比log4j要好2.配置获取顺序 logback在启动的时候,会按照下面的顺序加载配置文件 1.如果java程序启动时指定了logback.configurationFile属性,就用该属性指定的配置文件。如java -Dlogback.configurationFile=/path/to/mylogback.xml Test ,这样执行Test类的时候就会加载/pa...原创 2019-09-06 14:22:57 · 3371 阅读 · 0 评论 -
手动开启事务/保存点/隐式发出commit的语句
手动开启事务/保存点/隐式发出commit的语句1.手动开启事务 @Autowired DataSourceTransactionManager dataSourceTransactionManager; @Autowired TransactionDefinition transactionDefinition; TransactionStatus transactionStatus...原创 2019-09-04 16:05:38 · 4160 阅读 · 0 评论 -
java中的this
java中的thisthis.属性名称 指的是访问类中的成员变量,用来区分成员变量和局部变量(重名问题)this.方法名称 用来访问本类的成员方法this(); 在一个构造器中调用另一个构造器 1.this() 不能使用在普通方法中 只能写在构造方法中 2.必须是构造方法中的第一条语句this return this 当你使用一个对象调用该方法,该方法返回的...原创 2019-08-29 08:54:24 · 101 阅读 · 0 评论