Java
毛小树
Explore the unknown world!
展开
-
Java8的 merge() 骚操作
今天下班路上听一个妈妈问她儿子这么晚才出校门,孩子委屈极了,说在帮助老师统计全班同学的月考总分。如果是我拿到一个包含学生姓名和学生各科成绩list 的list,应该怎样快速而又简洁地求出每个学生对应的总成绩呢?查了下,原来 Java8 的 merge() 可以实现类似场景。记录一下~package dream_2020.java8.lambda.merge;import com.faster...原创 2019-11-27 21:41:03 · 2210 阅读 · 0 评论 -
一个简单的业务重试方案[EventBus+Executor+AOP]
对于系统中出现的异常,有的需要告警出来,譬如参数校验不通过,写操作因为幂等的原因失败;有的则需要进行业务重试,譬如 rpc 调用超时。如何设计一个优良的重试机制呢?个人认为应当具备下面几点。侵入性小:实现重试的代码逻辑与现有的业务逻辑应尽可能地分离,所谓不侵入,少耦合,重试逻辑与正常逻辑解耦。动态配置:重试的最大次数、重试的间隔时间、是否采用线程池进行重试、是否异步重试等,可在项目正常运行...原创 2019-11-27 20:55:34 · 881 阅读 · 0 评论 -
堆的应用之——求前K最大值和求中值
今天和大家一块学习下面试中常见的两个关于堆的面试题,第一:求K个最大值;第二:求中值元素。算法和数据结构算是笔者的死穴了。 一、求前K个最大的值 首先能想到的是使用Arrays.sort()进行排序后取前K个值即可,效率是O(N*log2^N)。 其次可以进行循环选择K次,每次都从剩下的数据中选择最大值,效率是O(N*K)。但若K值大于log2^(N),其效率还不如完全排序。 ...原创 2018-05-28 22:34:25 · 1332 阅读 · 0 评论 -
HashMap桶中链表转红黑树为什么选择数字8?
在JDK8及以后的版本中,HashMap引入了红黑树结构,其底层的数据结构变成了数组+链表或数组+红黑树。添加元素时,若桶中链表个数超过8,链表会转换成红黑树。 翻了一下HashMap的源码,发现其源码中有这样一段注释:Because TreeNodes are about twice the size of regular nodes, we use them only when bins ...转载 2018-05-24 22:34:13 · 12635 阅读 · 8 评论 -
谈谈设计模式——以手动实现单例模式和Spring中使用到的设计模式为例
设计模式也算是面试高频考点,理解典型的设计模式,有利于我们提高沟通、设计的效率和质量,在某种程度上也代表了一些特定情况的最佳实践。 设计模式的分类 大致上按照应用目标进行分类,可分为创建型模式、结构型模式、行为型模式。创建型模式:对对象创建过程中的各类问题和解决方案的总结,包含工厂模式、单例模式、构建器模式、原型模式。结构型模式:针对软件设计结构的总结,关于类、对象继承、组合方式的实践...原创 2018-06-05 18:21:02 · 465 阅读 · 0 评论 -
浅析Java中的深克隆和浅克隆
说实话,目前为止还没在项目中遇到过关于Java深克隆和浅克隆的场景。今天手抖戳开了花呗账单,双十二败家的战绩真是惨不忍睹,若能在我的客户端“篡改”下账单金额,那该(简)有(止)多(做)好(梦)啊!于是乎,有了以下的设想。采用工厂模式,根据所传入的帐户名accountName 得到账单bill返回客户端client,代码实现如下:账单类Bill/** * @Author: mollychi...原创 2019-01-02 13:08:26 · 2124 阅读 · 0 评论 -
Why override hashCode() & equals()?
有这样一个场景:在一个长为n的线性序列中查找某一个数值A,不得不从头到尾遍历,此时的平均查找次数是n/2;但如果将n个数据存放在Hash表中,其平均查找次数接近于1,代价大大地减小。因为在Hash表的存储中,存放其中的数据和其存储位置是存在某种Hash函数关联的。背景方便起见,我们假设数据A的Hash函数为A*A%5,而我们设置的Hash表的initialSize是8,如果我们把6和7放入其中...原创 2019-04-23 21:57:14 · 557 阅读 · 0 评论 -
Daily-Notes-June
20190603函数式编程 一切皆是表达式。命令式编程 是 告诉程序怎么做函数式编程 是 告诉程序做什么防止又臭又长的代码:Optional.of(user).map(User::getAddress).map(Address::getCountry).map(Country::getIsoCode).orElse(null);https://segmentfault.com/a/1...原创 2019-06-03 18:43:01 · 208 阅读 · 0 评论 -
关于消息队列的一些思考
在一个事务中,A系统使用rpc调用了B系统的service,在本地调试时经常会出现rpc调用超时的问题,将会导致整个事务的回滚,况且随着业务量的增大,调用rpc的次数也会急剧增加。组内大佬一排砖头决定:将rpc调用改成消息队列MQ的方式,A系统成功将请求发送给MQ后便会继续执行后续操作。作为组内十万个为什么的我就会思考:为什么会使用消息队列呢?使用了消息队列会带来什么好处呢?它会有什么缺点...原创 2019-06-16 08:43:06 · 294 阅读 · 0 评论 -
Java中String类的温故知新
Java中主要用以处理字符串的类是String,StringBuffer和StringBuilder。也是面试中的常见考点,一块来温故而知新吧~String常见用法 String str1 = "I love China."; String str2 = new String("I love China."); String str3 = "I lov...原创 2018-06-04 19:35:41 · 289 阅读 · 0 评论 -
HashMap学习笔记
HashMap学习笔记今天来学习面试以及平时工作学习中常用到的一个类HashMap。概述:什么是HashMap常见操作(get和put)的工作原理Hash函数的实现Resize是什么一、什么是HashMap官方描述: 关键信息:基于Map、和HashTable类似但HashMap不能保证线程安全且允许键值对为null、不保证有序(个人觉得所谓的序是指“...原创 2018-04-17 16:14:53 · 250 阅读 · 1 评论 -
Java8 新添两宝——默认方法和静态方法
在Java8之前,我们只能在接口中使用方法的声明,随着需求的更变,我们需要在原有的接口中新添方法声明,这将导致所有实现该接口的类必须重写新添的方法。那么如何设计出更为“优质”的接口呢? 在Java8新特性中包含在接口中允许使用默认方法和静态方法。Java Interface Default Method 栗子interface Interface1 { default void log(Stri翻译 2017-11-28 17:52:00 · 561 阅读 · 0 评论 -
深入理解JVM——Java运行时数据区域浅析
JVM在运行时将其内存区域划分为不同的区域,各区域承担的职责和生命周期不尽相同,有的随着JVM进程的存在(消亡)而存在(消亡),而有些则是线程私有的,生命周期与其所在线程一致。和笔者一块学习一下吧~方法区(Method Area)Java堆(Heap)虚拟机栈(VM Stack)本地方法栈(Native Method Stack)程序计数器(PCR)方法区(别名:Non-H...原创 2018-03-02 10:49:55 · 285 阅读 · 0 评论 -
深入理解JVM——volatile in Java
第一次面试时,interviewer问“你对volatile了解多少?”由于interviewer的发音(英:[ˈvɒlətaɪl]))有些不准,笔者很傻地问了好几遍“您说什么?”,然后…直接GG了。volatile是JVM提供的最轻量级的同步机制,作为应届生面试中常见的关键字考察点,一块来学习下吧~Java内存模型volatile语义: 可见性禁止重排序无法保证一致性应用场景...原创 2018-03-03 10:50:57 · 673 阅读 · 0 评论 -
Java8新特性——Lambda表达式应用场景
之前在学习Java8的新特性时,十分喜欢Lambda的简洁性,而真正地用以解决项目中的技术点时,更为之惊叹不已。现在有这样的需求:从由Project这个类组成的List中取出id和name组成对应的键值对。 有下面这样的实体类,简洁起见,将多余的字段和注解以及类的继承关系去除。import java.util.Date;/** * Created by Mollychin ...原创 2018-03-04 20:55:47 · 5063 阅读 · 1 评论 -
在SSM下使用POI解析Excel数据并实现批量导入到数据库
暑假实习期间,作为一名Java后台开发的小白实习生,项目组老大分发给我的一项任务就是实现在SSM下实现Excel数据的导入/导出,咱总不能手动Ctrl+C/Ctrl+V实现吧hhh,于是经过查阅资料,发现Apache的一个子项目POI可以帮助解析Office文档并实现需求。分享如下:Apache POI是Apache软件基金会的开源项目,POI提供API给Java程序对Microsoft Of...原创 2018-03-04 20:58:21 · 3825 阅读 · 6 评论 -
深入理解JVM——垃圾回收算法
一、标记—清除算法介绍 最基础的收集算法涉及“标记”和“清除”:首先标记所需回收的对象,一并清除。特征 效率不高空间问题:结束后产生大量不连续的内存碎片,导致后续分配大内存对象时不得不提前触发垃圾收集操作。 二、复制算法1.介绍内存均分成两块,但只使用其中一块,这块用完了就将还存在的对象复制到第二块中,一次性清除使用过的内存空间。无需考虑内存碎片问题2...原创 2018-03-05 09:48:35 · 274 阅读 · 0 评论 -
IDEA中添加Google CheckStyle 完美指南
所谓“一千个读者就有一千个哈姆雷特”,不同的程序员,有着截然不同的代码风格。譬如抛出使用空格键还是TAB键的问题,就足以让程序员演化成风格迥异的不同色系。但在真正的产品开发中,如何写出高质量、易维护、强可读的代码尤为重要,这就需要一个普遍认可的编码规范,今天就和大家一块学习如何在IDEA中添加Google CheckStyle来保证项目代码的和谐一致。一.在IntelliJ IDE...原创 2018-03-05 11:31:58 · 26835 阅读 · 0 评论 -
学习笔记——JVM,JDK,JRE&OpenJDK之间的差异
本文翻译自What is the difference between JVM, JDK, JRE & OpenJDK?,如有不恰当之处,欢迎留言指出。观点一: - JVM:Java虚拟机用以运行Java二进制代码,它不认识Java的源代码,所以咱必须将*.java文件编译得到 *.class字节码文件,*.class文件中包含的二进制代码可以被JVM所理解。这也使得Java...翻译 2018-04-14 18:10:42 · 3639 阅读 · 0 评论 -
二叉树的三种遍历还不清楚?赶紧上车吧。
本文将从代码实现的视角和大家一块学习二叉树的前序、中序以及后续遍历,还没整明白的盆友们赶紧上车吧。打开你的IDEA,新建一个类BinarySearchTree,为什么要<T extends Comparable<? extends T>>呢?:package com.mollychin.tree;/** * Created by Mollychin on ...原创 2018-04-15 15:24:07 · 302 阅读 · 0 评论 -
深入理解JVM——Java的四种引用类型浅析
强引用,软引用,弱引用,虚引用.不同的引用类型主要体现在GC上:强引用:如果一个对象具有强引用,它就不会被垃圾回收器回收。即使当前内存空间不足,JVM也不会回收它,而是抛出 OutOfMemoryError 错误,使程序异常终止。如果想中断强引用和某个对象之间的关联,可以显式地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象。Object object = new ...原创 2017-09-22 09:26:17 · 842 阅读 · 0 评论