程序猿说你好
文章平均质量分 82
猴子007
我是猴子007,一只非常特殊的动物,可以从事程序的开发、维护,经常因寻找香蕉或母猿而无心工作。
展开
-
【刷题】二叉树非递归遍历
原题链接:binary-tree-preorder-traversalbinary-tree-inorder-traversalbinary-tree-postorder-traversal整体思路三道题的解决思路可统一,模板也极其相似,比九章提供的更漂亮。将二叉树分为“左”(包括一路向左,经过的所有实际左+根)、“右”(包括实际的右)两种节点使用同样的顺序将“左”节点入栈在合适的时机原创 2017-11-20 23:56:26 · 141 阅读 · 0 评论 -
从Exchager数据交换到基于trade-off的系统设计
可以使用JDK提供的Exchager类进行同步交换:进行数据交换的双方将互相等待对方,直到双方的数据都准备完毕,才进行交换。Exchager类很少用到,但理解数据交换的时机却十分重要,这是一个基于trade-off的系统设计。下述分析方法能扩展到诸多系统设计的场景中,帮助我们更好的进行trade-off。《Java并发编程实战》中介绍了判定数据交换时机的两种方案,却不甚清晰。从“时机选择的目的”出发原创 2017-10-30 10:07:25 · 210 阅读 · 0 评论 -
从源码分析非线程安全集合类的不安全迭代器
非线程安全集合类(这里的集合指容器Collection,非Set)的迭代器结合了及时失败机制,但仍然是不安全的。这种不安全表现在许多方面: 并发修改“通常”导致及时失败单线程修改也可能导致及时失败的“误报”迭代器会“丢失”某些并发修改行为,让及时失败失效如果不了解其不安全之处就随意使用,就像给程序埋下了地雷,随时可能引爆,却不可预知。 ArrayList是一个常用的非线程安全集合,下面以原创 2017-10-30 10:06:39 · 261 阅读 · 0 评论 -
Date类为什么设计为可变的,而不是像String一样?
首先,不得不承认,这确实是类库设计的一个错误,所以“为什么”进行了这个错误设计并没有意义。但没有事物一诞生就是完美的,我们的Java只是反应的慢了一点,再慢了一点。 更何况,Date类等日期/时间API又不是只有这一个问题。Java8之前,日期/时间API的问题在Java8之前,日期和时间相关的类存在诸多问题:Java的日期/时间类的定义并不一致,在java.util和java.sql的包中都有转载 2017-10-20 10:16:24 · 764 阅读 · 0 评论 -
volatile关键字的作用、原理
在只有双重检查锁,没有volatile的懒加载单例模式中,由于指令重排序的问题,我确实不会拿到两个不同的单例了,但我会拿到“半个”单例。而发挥神奇作用的volatile,可以当之无愧的被称为Java并发编程中“出现频率最高的关键字”,常用于保持内存可见性和防止指令重排序。保持内存可见性 内存可见性(Memory Visibility):所有线程都能看到共享内存的最新状态。失效数据以下是一个简单原创 2017-10-20 10:15:19 · 287 阅读 · 0 评论 -
源码|ThreadLocal的实现原理
ThreadLocal也叫“线程本地变量”、“线程局部变量”:其作用域覆盖线程,而不是某个具体任务;其“自然”的生命周期与线程的生命周期“相同”(但在JDK实现中比线程的生命周期更短,减少了内存泄漏的可能)。ThreadLocal代表了一种线程与任务剥离的思想,从而达到线程封闭的目的,帮助我们设计出更“健康”(简单,美观,易维护)的线程安全类。 一种假象ThreadLocal的使用方法往往给我原创 2017-10-19 08:55:51 · 155 阅读 · 0 评论 -
Java内存模型
面试中问到“内存模型”,通常是考察Java内存结构和GC,而不是Happens-Before等更深入、细致的内容。内存模型是考察coder对一门语言的理解能力,从而进一步延伸到对JVM优化,和平时学习的深度上,是Java面试中最重要的一部分。这里整理了内存结构和GC的知识点,Happens-Before模型预计在以后学习过JVM过再来整理。 如果把内存模型看做一个数据结构,那么面试中考察的重点分转载 2017-10-19 08:54:08 · 145 阅读 · 0 评论 -
事务的ACID和四个隔离级别
在实际的业务场景中,并发读写引出了和事务控制的需求。优秀的事务处理能力是关系型数据库(特别是oracle等商用RDBMS)相对于正当风口的NoSQL数据库的一大亮点。但这也从另一方面说明了事务控制的复杂性——正因为过于复杂,大部分NoSQL都没提供事务支持或只提供部分事务支持。ACID一个数据库事务是"一个被视为单一的工作单元的操作序列"。一个良好的事务处理系统,必须具备四个标准特性:原子性(At转载 2017-10-18 22:15:45 · 206 阅读 · 0 评论 -
程序猿应该记住的几条基本规则
简简单单几条原则:模块的用户永远也不应该被模块的行为所迷惑模块要尽可能小,但又不能太小代码应该被重用,而不是被拷贝模块之间的依赖性应该尽可能降到最小错误应该尽早被检测出来,最好是在编译时刻重点讲两个。模块的用户永远也不应该被模块的行为所迷惑最简单的方式是写下多且准确的注释,不过我相信大部分很难做到“准确”。我习惯引用涛神的话,将该条规则表述为要求“代码能够自解释”。看起来简单做起来难。对原创 2017-12-07 14:56:45 · 178 阅读 · 0 评论 -
源码|静态工厂返回声明的返回类型的子类型的实例
与构造方法相比,静态工厂方法拥有三大优势:有名称不必在每次调用它们的时候都创建一个新的对象可以返回声明的返回类型的子类型的实例优势1、2显然。这里在Java8源码里找一个证明优势3的例子,备忘。 JDK版本:oracle java 1.8.0_102可以返回声明的返回类型的子类型的实例见Java8的Collections类: public static <T> Set<T> un原创 2017-12-07 14:58:23 · 895 阅读 · 0 评论 -
Java高并发综合
这篇文章是研一刚入学时写的,今天整理草稿时才被我挖出来。当时混混沌沌的面试,记下来了一些并发的面试问题,很多还没有回答。到现在也学习了不少并发的知识,回过头来看这些问题和当时整理的答案,漏洞百出又十分可笑。发表出来权当对自己的一个提醒——如果不能一直进步,你就看不到当初傻逼的自己。 曾经,我在面试Java研发实习生时最常听到的一句话就是: 搞Java怎么能不学并发呢?没错,真的是经过了面试原创 2017-11-06 09:50:58 · 151 阅读 · 0 评论 -
【刷题】Search in a Big Sorted Array
原题戳我。题目DescriptionGiven a big sorted array with positive integers sorted by ascending order. The array is so big so that you can not get the length of the whole array directly, and you can only access原创 2017-11-06 09:52:11 · 198 阅读 · 0 评论 -
【面经】猿题库-2017年8月25日,散招实习生
首先感谢热心助人的崔同学,耐心给我讲解猿题库的面试风格,让我能安心只准备了算法和system design。不过算法也没准备,最近正常刷题而已;system design也只是复习了下搜狗的项目。相当于是裸面了。。。万幸其他方面一点都没有问,最后也拿到了实习offer。一面一面的面试官看起来不到30,应该是普通研发,当然很可能是准mentor。进屋介绍了下面试流程和公司,然后让我问问题。我觉得过不过原创 2017-11-20 23:58:11 · 835 阅读 · 0 评论 -
Builder模式中,为什么必须在对象域而不是builder域中检查参数?
这个问题仅对于构造不可变类有意义,如果构造可变类,放在哪里都无法保障安全。使用Builder模式构建不可变类ImmutableObj的实例imObj时,应该把字段的检查放在对象域。可以从两个角度分析:如果放在builder域(一般是Builder#build()方法中),会存在TOC攻击,即:时刻T1参数检查通过,时刻T2修改其中可变的参数,时刻T3调用构造器,则时刻T3时,参数又变得不合法了。原创 2017-12-11 10:04:02 · 275 阅读 · 0 评论 -
实现不可变类如何禁止子类化?
实现不可变类时要求禁止子类化。本文先讲禁止子类化的方式,最后解释为什么要禁止子类化。 JDK版本:oracle java 1.8.0_102如何禁止子类化常用姿势最简单的手段是将类声明为final,如String、Integer等常用的值类。但这样缺乏灵活性:不仅禁止了用户的子类化,开发者也无法利用子类化减少编码工作。 尽管这种手段完全没有变通,却是我们使用最多的一种。只有你需要上述灵活性原创 2017-12-11 10:25:19 · 623 阅读 · 0 评论 -
Java中如何恰当的表达“继承”与“扩展”的语义?
”继承“是Java的面向对象学习过程中的大难题,原因有二:”is-A“的关系本身就不好理解Java中的extends“扩展”与面向对象中的“继承”inheritance不是一一对应的。很多书里认为继承与扩展是一一对应的,但个人不这样认为。并且以我的观点,能更好的指导开发工作如何进行继承与扩展的程序设计和编码实现。本文尝试以通俗的语言陈述Java中如何恰当的表达“继承”与“扩展”的语义。继承和扩原创 2017-12-11 10:26:27 · 849 阅读 · 0 评论 -
【刷题】Linked List Cycle II
原题戳我题目DescriptionGiven a linked list, return the node where the cycle begins.If there is no cycle, return null.ExampleGiven -21->10->4->5, tail connects to node index 1,return 10ChallengeFollow up:Can原创 2017-12-04 11:20:57 · 117 阅读 · 0 评论 -
HashMap实现原理
HashMap是常考点,而一般不问List的几个实现类(偏简单)。以下基于JDK1.8.0_102分析。 JDK版本:oracle java 1.8.0_102内部存储HashMap的内部存储是一个数组(bucket),数组的元素Node实现了是Map.Entry接口(hash, key, value, next),next非空时指向定位相同的另一个Entry,如图:容量(capacity)和原创 2017-12-04 11:22:23 · 137 阅读 · 0 评论 -
【刷题】strStr II - Rabin Karp
原题戳我介绍另一种更通用的算法,可以代替KMP以O(n+m)的时间复杂度完成字符串查找问题。KMP本科一般都学习过KMP算法,它能在O(n+m)的时间内解决字符串查找问题,不赘述,可参考KMP戳我。很容易理解,KMP已经是效率最高的字符串查找算法。整个算法的重点在next数组的生成上,该过程不是很难理解,实现起来却不太方便,又没什么通用性,特意去记忆的性价比太低。不管在面试还是实际问题中,都不是一个原创 2017-11-27 12:58:48 · 192 阅读 · 0 评论 -
【面经】陌陌-2017年8月28日,散招实习生
现在坐着公交车回学校,刚面试完脑仁炸疼,实在无力复习,写篇面经权当放松了。陌陌面试只问了项目和源码,最后据HR说前面两面的面试官评价都不错,向人力总监确认后可能会发offer,不过随便发不发吧,竟然还想让我做监控工具,饶了我吧T_T。一面HR向内容可能是陌陌对散招实习生的面试风格吧,上来先围绕“如何保障实习时间”、“为什么从上个公司离职”聊了20多分钟。项目经历然后就开始聊我在搜狗做的Hadoop集原创 2017-11-27 13:00:47 · 1209 阅读 · 0 评论 -
Java集合类综合
Java集合类是JDK学习中的一个经典切入点,也是让初学者最初感受到Java魅力的地方之一,你一定不会忘记不需要关心大小的ArrayList,不用自己实现的Queue,和随处可见的HashMap。面试中,对Java基础的考察中,集合类和String相关是两个重点,这里集中整理了关于集合类的一些知识点。 集合类的结构要求手绘结构图,同时抛出一些简单的线索勾引面试官提问(比如讲HashMap的Hash原创 2017-10-18 22:10:55 · 140 阅读 · 0 评论 -
静态工厂方法的一些惯用名称?举例?
静态工厂的优势见源码|静态工厂返回声明的返回类型的子类型的实例。本文记录静态工厂方法的一些惯用名称,开发中应遵循这些好的习惯。valueOf该方法返回的实例与它的参数具有相同的“值”。如Integer.valueOf()方法: public static Integer valueOf(String s) throws NumberFormatException { retu原创 2017-12-07 14:59:17 · 655 阅读 · 0 评论