死磕Java之聊聊HashMap源码(基于JDK1.8)

haifeiWu

HashMap是Java程序员使用频率最高的数据结构之一。另外,JDK1.8对HashMap底层的实现进行了优化,如引入红黑树的数据结构以及扩容的优化等等来提高性能。本文结合JDK1.8的源码,探讨HashMap的结构实现和功能原理。

Java源码解析阅读全文

聊聊HashSet源码

今天聊一下HashSet源码,HashSet内部基本使用HashMap来实现,本博客将通过一下几个方向讲解。

Java源码解析阅读全文

classpath* 和 classpath使用遇到的问题

haifeiWu

在spring配置mybatis的时候需要加载mybatis的多个相关配置文件,其中mybatis的mapper对应的xml通常放在其他的jar包中,mybatis-conf文件通常在当前工程中,so,也就引出了今天遇到的问题,那么classpath* 和 classpath到底有啥区别呢?

Java阅读全文

Kotlin:Android开发技巧

ChanghuiN

Kotlin作为Android开发第一语言,然而身边做Android的大多还是使用java。Android转到Kotlin的趋势是必然的,公司隔壁部门已经全部使用Kotlin开发,我们在以后新的项目里,也会以Kotlin为主。关于Kotlin的知识,博主只是在去年下半年的时候看过官网的教程,也读了《Kotlin for Android Developers》,并写了一个练手项目,不过大半年过去了,要把以前学过的知识重新拿起来有点儿不易,于是总结了一些Kotlin在Android开发中的常用技巧。

AndroidKotlin阅读全文

死磕Java之聊聊ThreadLocal源码(基于JDK1.8)

haifeiWu

记得在一次面试中被问到ThreadLocal,答得马马虎虎,所以打算研究一下ThreadLocal的源码

面试官 : 用过ThreadLocal吗?

楼主答 : 用过,当时使用ThreadLocal的时候,使用Spring实现横切整个Controller层,使用ThreadLocal实现了统计每次请求对应方法的执行时间,具体代码如下

Java源码解析阅读全文

死磕Java之聊聊LinkedList源码(基于JDK1.8)

haifeiWu

工作快一年了,近期打算研究一下JDK的源码,也就因此有了死磕java系列

  • LinkedList 是一个继承于AbstractSequentialList的双向链表,链表不需要capacity的设定,它也可以被当作堆栈、队列或双端队列进行操作。
  • LinkedList 实现 List 接口,能对它进行队列操作,提供了相关的添加、删除、修改、遍历等功能。
  • LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用。

Java源码解析阅读全文

聊聊ArrayList源码(基于JDK1.8)

haifeiWu

工作快一年了,近期打算研究一下JDK的源码,也就因此有了死磕java系列

  • ArrayList 是一个数组队列,相当于动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。
  • ArrayList 继承了AbstractList,实现了List。它是一个数组队列,提供了相关的添加、删除、修改、遍历等功能。
  • ArrayList 实现了RandmoAccess接口,即提供了随机访问功能。RandmoAccess是java中用来被List实现,为List提供快速访问功能的。在ArrayList中,我们即可以通过元素的序号快速获取元素对象;这就是快速随机访问。

Java源码解析阅读全文

Python 数据处理

ChanghuiN

Numpy、Pandas是Python数据处理中经常用到的两个框架,都是采用C语言编写,所以运算速度快。Matplotlib是Python的的画图工具,可以把之前处理后的数据通过图像绘制出来。之前只是看过语法,没有系统学习总结过,本博文总结了这三个框架的API。

Python阅读全文

复杂业务下向Mysql导入30万条数据代码优化的踩坑记录

haifeiWu

从毕业到现在第一次接触到超过30万条数据导入MySQL的场景(有点low),就是在顺丰公司接入我司EMM产品时需要将AD中的员工数据导入MySQL中,因此楼主负责的模块connector就派上了用场。在楼主的努力下,线上数据同步代码经历了从最初的将近16个小时(并且还出现其他问题这些问题,等后面慢慢细说),到最终25分钟的性能优化。

Java阅读全文

自建脚手架之配置中心--LightConf的实现

haifeiWu

常规项目开发过程中, 通常会将配置信息位于在项目 resource 目录下的 properties 文件文件中, 配置信息通常包括有: jdbc 地址配置、redis 地址配置、活动开关……等等。因此每次上线或者服务迁移的时候都要手动修改配置,并一台一台的重启服务器,甚是麻烦,且费时费力。

Java配置中心阅读全文

《剑指Offer》50道算法面试题

ChanghuiN

《剑指Offer》50道算法面试题 - C++版,本来一开始想用Java来写,不过看看了,JDK里封装了很多算法,用Java写就没意思了,于是用选择了C++,顺便也学习一下C++。

关于刷题方法,这里要说几句:因为本人也不擅长刷题,属于跳跃性思维的那种。开始刷了十几道就放弃了,最后找到了一种方法,给大家分享出来:

总结算法阅读全文

测试环境服务器硬盘塞满问题排查

haifeiWu

某天下午测试环境服务器出现tab无法补全命令,给出的提示大概意思就是说,无可用空间无法创建临时文件,不过这次跟上次出现的问题比较像,上次服务器出现的问题,因此楼主判断可能是服务器数据盘被占满,果不其然,使用df -h命令看到服务器数据盘出现100%被占用的情况。

Java问题排查阅读全文

Java命令之javap初探

haifeiWu

javap是jdk自带的一个工具在jdk安装目录的/bin下面可以找到,可以对代码反编译,也可以查看java编译器生成的字节码,对代码的执行过程进行分析,了解jvm内部的工作。

下面列举javap命令的常用options及其功能描述,更多功能的使用请自行Google,楼主不做赘述。

Java阅读全文

个人博客折腾记

ChanghuiN

个人博客,也折腾了3年多了吧,不说已经特别稳定了,但起码也做成了自己满意样子,后续还需要继续调整。虽然现在的博客看似简单,并且用的模板,但在博客的这条路上也花了不少时间,饶了很多弯路,踩了不少坑。刚开始写博客是为了膜拜我技术路上的第一位‘导师’ - 薛x,最后博客变成了我对技术的一种追求,和对开源、共享的一种理解。这里回忆一下我折腾博客的辛酸历程~~

总结阅读全文

Java实现终止线程池中正在运行的定时任务

haifeiWu

最近项目中遇到了一个新的需求,就是实现一个可以动态添加定时任务的功能。说到这里,有人可能会说简单啊,使用quartz就好了,简单粗暴。然而quartz框架太重了,小项目根本不好操作啊。当然,也有人会说,jdk提供了timer的接口啊,完全够用啊。但是我们项目的需求完全是多线程的模型啊,而timer是单线程的,so,楼主最后还是选择了jdk的线程池。

Java阅读全文

2017年度总结

ChanghuiN

时间过的好快,这个我自写博客以来,第二次写年度总结了。很多事情还没来的急去做,时间就过去了,本来想把年度总结放到阴历年去写,那样可能会更多做一些事情,但翻一翻去年的,是在12月31,既然要坚持,那就不再拖延了。
今年是个大事年啊,毕设、毕业、工作、当然还拥有了人生第一个Mac(虽然是mini的),哈哈…
下面细细到来:

总结阅读全文

shell脚本实现自动保留最近n次备份记录

haifeiWu

某天上午服务器出现卡顿特别严重,页面加载速度奇慢,并且某些页面刷新出现404的问题,就连服务器的tab命令的自动提示都出现了问题,楼主费了九牛二虎之力,根据服务器排查发现,服务器数据盘出现100%被占用的问题,导致该问题出现的原因是,Jenkins每次部署服务器的时候,都会自动将上一次的war备份,由于开发阶段的频繁部署,最终硬盘被占满,便出现上述描述的情况。

Shell阅读全文

Kotlin委托

ChanghuiN

Kotlin中有委托,这个C#中也有,不过对于学Java的童鞋来说,这是什么鬼啊,到底是干什么用的…
在委托模式中,当有两个对象参与处理同一个请求是,接受请求的对象将请求委托给另一个对象来处理。委托模式已证明是实现继承的一个很好的替代方式。Kotlin中委托分为类委托和委托属性,Kotlin官方库也封装了一些常用的委托。

AndroidKotlin阅读全文

扒一扒spring,dom4j实现模拟实现读取xml

haifeiWu

今天leadr提出需求,原来公司项目中读取解析xml文件的代码效率太低,考虑切换一种xml为数据封装格式与读取方式以提高效率。我这灵机一动spring对bean的依赖注入就是读取xml文件,可以尝试扒一扒spring的源码,来实现一个轻量级的方案。

Java阅读全文

spring aop实现权限管理

haifeiWu

最近项目中需要做一个权限管理模块,按照之前同事的做法是在controller层的每个接口调用之前上做逻辑判断,这样做也没有不妥,但是代码重复率太高,而且是体力劳动,so,便有了如题所说的使用spring aop做一个切点来实现通用功能的权限管理,这样也就降低了项目后期开发的可扩展性。

Java阅读全文