理解java
程序员之道
就职于阿里巴巴,专注于java后端开发,工作7年有余。公众号[程序员之道]。大学之道,在明明德;程序员之道,在无止境。无论是在校,还是已参加工作,对未来的路怎么走,怎么提升自己,怎么合理配置财产,都是需要思索和探究的。一人之言未必对,理越辨越明,希望大家多多留言讨论,知无不言,言不全对。
展开
-
单例模式你真的会了吗?(下篇)
距离《单例模式上篇》写出去已经很久了,竟然久久没有更新下篇,这是庸俗人的普遍表现,只有开始,没有继续,也没有结束;干什么事都没有恒心,只有三天热度。要坚持啊!《单例模式上篇》描述了单例的几个核心问题:为什么要有单例?正确单例应该怎么写?典型的单例模式写法?接下来,我们来进阶一下,拓展一下单例的高级用法,所谓开拓思路,不亦乐乎嘛!单例模式的唯一性如何理解?线程唯一的单例怎么实现?如何实现集群模式下的单例?怎么实现“多例”模式?看着是不是有些头大,不要急,听我慢慢道来。单例模式的唯.原创 2020-07-01 19:44:29 · 319 阅读 · 0 评论 -
Set里添加自定义对象,如何去重,不重写equals和hashcode不行吗?
写在前面学习很难,克服惰性。每天学一点,不会的就少一点。懦夫从不启程,弱者死于路中,只剩我们前行,一步都不能停。养成习惯很重要,先从点赞开始吧!set是如何去重的?Set只是一个接口,我们平时使用最多的是HashSet,那么HashSet是如何去重的呢?来看下是如何往set中添加一个对象的: public boolean add(E e) { return ...原创 2020-04-12 17:29:30 · 1227 阅读 · 1 评论 -
头条面试官问了几个equals的问题,我竟然没答上来!呜呜呜!
写在前面学习很难,克服惰性。每天学一点,不会的就少一点。懦夫从不启程,弱者死于路中,只剩我们前行,一步都不能停。养成习惯很重要,先从点赞开始吧!关注[程序员之道],程序员之路不再迷茫!擦,这两个值明明应该是相等的啊,为啥我用==判断的结果时不等于,真是活见鬼了。我来debug看看。关于对象、值一些相等的判断不知道你有没有踩过坑,或者面试的时候有没有被面试官坑过?如果你还没注意过这些...原创 2020-04-07 13:59:43 · 781 阅读 · 1 评论 -
map.containsKey()我再也不想使用这个api了
平时写代码时,经常有一些这样的处理:例如:如果key存在,则在原来的基础之上+1,或其他操作,如果key不存在,那么赋一个初始值,假设为1。JDK8之前写法每次都需要判断下map.containsKey(),真的好烦啊! public void jdk7Access(int[] nums, Map<Integer, Integer> map) { fo...原创 2020-03-21 23:39:54 · 1819 阅读 · 0 评论 -
java基础面试题-String深入理解
知识要点String实现源码不可变性的好处String使用优化String经典问题对象地址是否相同String、StringBuffer、StringBuilder区别String实现源码不可变性的好处不可变对象不会被恶意修改,所以多线程共享时是线程安全的。hash属性值一旦确定,不会被变更,确保唯一性。可以节约内存,实现字符串常量池。String str = “abc”,Stri...原创 2019-05-29 08:07:36 · 950 阅读 · 0 评论 -
java基础数据结构算法面试题-彻底搞懂二分查找
二分查找,最基本的查找算法之一,根据我的面试经验,能够真正写出bugfree的二分查找的人,连1/10的人都不到。下面我们就来剖析一下各种二分查找,希望读了此文以后,配合练习,都可以写出bugfree的代码。前提条件,待排序数组从小到大有序。二分查找的核心思想,有点类似分治思想,每次将给定数字与中间元素对比,若相等直接返回索引;若比中间元素大,则在后半部分区间继续查找;若比中间元素小...原创 2019-04-15 08:04:41 · 1077 阅读 · 0 评论 -
java基础面试题-new Integer, Integer.valueOf区别
知识要点java基本数据类型拆箱装箱缓冲池缓冲池范围要理解这个问题,我们首先要知道java的基本数据类型有哪些?java基本数据类型基本类型包装类型占用空间booleanBoolean1字节byteByte2字节charCharacter2字节shortShort2字节intInteger4字节floatFloat4...原创 2019-05-28 13:49:09 · 1680 阅读 · 0 评论 -
java程序启动时设置打印gc log及一些常见jvm参数
java程序启动时怎么设置打印gc log-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/work/log/dump -verbose:gc -Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCApplicationStoppedTime -X...原创 2019-05-17 17:42:02 · 9033 阅读 · 0 评论 -
java代码中获取full gc、young gc情况
对于大型的高并发服务,我们可能需要定时或实时获取进程的gc情况,很荣幸,java给我们提供了现成的方法。 private static void reportGC(ReportAPI reporter) { long fullCount = 0, fullTime = 0, youngCount = 0, youngTime = 0; List<G...原创 2019-05-17 17:32:27 · 6052 阅读 · 1 评论 -
ThreadPoolExecutor中addWorker,continue retry和break retry是什么意思
今天看ThreadPoolExecutor的代码,其中有一个addWorker的函数,里面有个retry的标签,从来没遇到过这种用法。来深入探究一下。先看一下addWorker的代码。private boolean addWorker(Runnable firstTask, boolean core) { retry: for (;;) { ...原创 2019-05-16 16:34:31 · 1661 阅读 · 0 评论 -
java html标签替换
工作中有时候需要爬取其他平台的文章,或者自己由于兴趣爬取文章,文章后续的处理或展示,一般都是自定义的标签格式,可能与标准的html格式不一致,这里就需要标签替换。有不少文章都是使用正则表达式来替换,正则表达式替换可能由于匹配问题导致多换或少换。最靠谱的方式当然还是根据index查找某个标签的beginIndex和endIndex,然后进行内容的替换,这样肯定是最准确的,不过效率稍微低一些!...原创 2019-05-21 13:03:54 · 1174 阅读 · 0 评论 -
看了这篇文章,还不理解线程池执行流程,过来找我要钱
实际编程中,频繁创建和销毁线程开销很大,所以一般使用线程的方式是线程池。很方便的,java给我们提供了现成的线程池创建函数ThreadPoolExecutor,这个创建函数也成了不少公司面试必考题,当然,要想彻底理清线程池执行过程,需要剖析源码,这里我们就来仔细分析分析。首先是线程池创建函数。public ThreadPoolExecutor(int corePoolSize, ...原创 2019-05-24 15:22:27 · 843 阅读 · 0 评论 -
java static成员变量初始化java.lang.NullPointerException异常
最近碰到一个奇怪的问题,在一个类(类名MyHandler)中有类似初始化: private static MyConstruct myconstruct = new MyConstruct(); MyConstruct是自己写的一个类,里面有一些初始化,异常捕捉,对外提供公用方法。但是该类的初始化依赖配置文件,可能会忘配,所以初始化时可能会抛出空指针异常。 MyHandl...原创 2018-05-29 10:57:27 · 2565 阅读 · 0 评论