自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

程序猿说你好

我是猴子007,一只非常特殊的动物,可以从事程序的开发、维护,经常因寻找香蕉或母猿而无心工作。

  • 博客(22)
  • 资源 (1)
  • 收藏
  • 关注

原创 Java中如何恰当的表达“继承”与“扩展”的语义?

”继承“是Java的面向对象学习过程中的大难题,原因有二: ”is-A“的关系本身就不好理解 Java中的extends“扩展”与面向对象中的“继承”inheritance不是一一对应的。 很多书里认为继承与扩展是一一对应的,但个人不这样认为。并且以我的观点,能更好的指导开发工作如何进行继承与扩展的程序设计和编码实现。本文尝试以通俗的语言陈述Java中如何恰当的表达“继承”与“扩展”的语义。继承和扩

2017-12-11 10:26:27 845

原创 实现不可变类如何禁止子类化?

实现不可变类时要求禁止子类化。本文先讲禁止子类化的方式,最后解释为什么要禁止子类化。 JDK版本:oracle java 1.8.0_102 如何禁止子类化常用姿势最简单的手段是将类声明为final,如String、Integer等常用的值类。但这样缺乏灵活性:不仅禁止了用户的子类化,开发者也无法利用子类化减少编码工作。 尽管这种手段完全没有变通,却是我们使用最多的一种。只有你需要上述灵活性

2017-12-11 10:25:19 620

原创 Builder模式中,为什么必须在对象域而不是builder域中检查参数?

这个问题仅对于构造不可变类有意义,如果构造可变类,放在哪里都无法保障安全。 使用Builder模式构建不可变类ImmutableObj的实例imObj时,应该把字段的检查放在对象域。可以从两个角度分析: 如果放在builder域(一般是Builder#build()方法中),会存在TOC攻击,即:时刻T1参数检查通过,时刻T2修改其中可变的参数,时刻T3调用构造器,则时刻T3时,参数又变得不合法了。

2017-12-11 10:04:02 269

原创 静态工厂方法的一些惯用名称?举例?

静态工厂的优势见源码|静态工厂返回声明的返回类型的子类型的实例。 本文记录静态工厂方法的一些惯用名称,开发中应遵循这些好的习惯。valueOf该方法返回的实例与它的参数具有相同的“值”。如Integer.valueOf()方法: public static Integer valueOf(String s) throws NumberFormatException { retu

2017-12-07 14:59:17 651

原创 源码|静态工厂返回声明的返回类型的子类型的实例

与构造方法相比,静态工厂方法拥有三大优势: 有名称 不必在每次调用它们的时候都创建一个新的对象 可以返回声明的返回类型的子类型的实例 优势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 892

原创 程序猿应该记住的几条基本规则

简简单单几条原则: 模块的用户永远也不应该被模块的行为所迷惑 模块要尽可能小,但又不能太小 代码应该被重用,而不是被拷贝 模块之间的依赖性应该尽可能降到最小 错误应该尽早被检测出来,最好是在编译时刻 重点讲两个。模块的用户永远也不应该被模块的行为所迷惑最简单的方式是写下多且准确的注释,不过我相信大部分很难做到“准确”。我习惯引用涛神的话,将该条规则表述为要求“代码能够自解释”。看起来简单做起来难。对

2017-12-07 14:56:45 176

原创 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 133

原创 【刷题】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 112

原创 【面经】陌陌-2017年8月28日,散招实习生

现在坐着公交车回学校,刚面试完脑仁炸疼,实在无力复习,写篇面经权当放松了。陌陌面试只问了项目和源码,最后据HR说前面两面的面试官评价都不错,向人力总监确认后可能会发offer,不过随便发不发吧,竟然还想让我做监控工具,饶了我吧T_T。一面HR向内容可能是陌陌对散招实习生的面试风格吧,上来先围绕“如何保障实习时间”、“为什么从上个公司离职”聊了20多分钟。项目经历然后就开始聊我在搜狗做的Hadoop集

2017-11-27 13:00:47 1200

原创 【刷题】strStr II - Rabin Karp

原题戳我介绍另一种更通用的算法,可以代替KMP以O(n+m)的时间复杂度完成字符串查找问题。KMP本科一般都学习过KMP算法,它能在O(n+m)的时间内解决字符串查找问题,不赘述,可参考KMP戳我。很容易理解,KMP已经是效率最高的字符串查找算法。整个算法的重点在next数组的生成上,该过程不是很难理解,实现起来却不太方便,又没什么通用性,特意去记忆的性价比太低。不管在面试还是实际问题中,都不是一个

2017-11-27 12:58:48 187

原创 【面经】猿题库-2017年8月25日,散招实习生

首先感谢热心助人的崔同学,耐心给我讲解猿题库的面试风格,让我能安心只准备了算法和system design。不过算法也没准备,最近正常刷题而已;system design也只是复习了下搜狗的项目。相当于是裸面了。。。万幸其他方面一点都没有问,最后也拿到了实习offer。一面一面的面试官看起来不到30,应该是普通研发,当然很可能是准mentor。进屋介绍了下面试流程和公司,然后让我问问题。我觉得过不过

2017-11-20 23:58:11 832

原创 【刷题】二叉树非递归遍历

原题链接: binary-tree-preorder-traversal binary-tree-inorder-traversal binary-tree-postorder-traversal 整体思路三道题的解决思路可统一,模板也极其相似,比九章提供的更漂亮。 将二叉树分为“左”(包括一路向左,经过的所有实际左+根)、“右”(包括实际的右)两种节点 使用同样的顺序将“左”节点入栈 在合适的时机

2017-11-20 23:56:26 141

原创 【刷题】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 193

原创 Java高并发综合

这篇文章是研一刚入学时写的,今天整理草稿时才被我挖出来。当时混混沌沌的面试,记下来了一些并发的面试问题,很多还没有回答。到现在也学习了不少并发的知识,回过头来看这些问题和当时整理的答案,漏洞百出又十分可笑。发表出来权当对自己的一个提醒——如果不能一直进步,你就看不到当初傻逼的自己。 曾经,我在面试Java研发实习生时最常听到的一句话就是: 搞Java怎么能不学并发呢? 没错,真的是经过了面试

2017-11-06 09:50:58 149

原创 从Exchager数据交换到基于trade-off的系统设计

可以使用JDK提供的Exchager类进行同步交换:进行数据交换的双方将互相等待对方,直到双方的数据都准备完毕,才进行交换。Exchager类很少用到,但理解数据交换的时机却十分重要,这是一个基于trade-off的系统设计。下述分析方法能扩展到诸多系统设计的场景中,帮助我们更好的进行trade-off。《Java并发编程实战》中介绍了判定数据交换时机的两种方案,却不甚清晰。从“时机选择的目的”出发

2017-10-30 10:07:25 209

原创 从源码分析非线程安全集合类的不安全迭代器

非线程安全集合类(这里的集合指容器Collection,非Set)的迭代器结合了及时失败机制,但仍然是不安全的。这种不安全表现在许多方面: 并发修改“通常”导致及时失败 单线程修改也可能导致及时失败的“误报” 迭代器会“丢失”某些并发修改行为,让及时失败失效 如果不了解其不安全之处就随意使用,就像给程序埋下了地雷,随时可能引爆,却不可预知。 ArrayList是一个常用的非线程安全集合,下面以

2017-10-30 10:06:39 260

转载 Date类为什么设计为可变的,而不是像String一样?

首先,不得不承认,这确实是类库设计的一个错误,所以“为什么”进行了这个错误设计并没有意义。但没有事物一诞生就是完美的,我们的Java只是反应的慢了一点,再慢了一点。 更何况,Date类等日期/时间API又不是只有这一个问题。Java8之前,日期/时间API的问题在Java8之前,日期和时间相关的类存在诸多问题: Java的日期/时间类的定义并不一致,在java.util和java.sql的包中都有

2017-10-20 10:16:24 761

原创 volatile关键字的作用、原理

在只有双重检查锁,没有volatile的懒加载单例模式中,由于指令重排序的问题,我确实不会拿到两个不同的单例了,但我会拿到“半个”单例。而发挥神奇作用的volatile,可以当之无愧的被称为Java并发编程中“出现频率最高的关键字”,常用于保持内存可见性和防止指令重排序。保持内存可见性 内存可见性(Memory Visibility):所有线程都能看到共享内存的最新状态。 失效数据以下是一个简单

2017-10-20 10:15:19 279

原创 源码|ThreadLocal的实现原理

ThreadLocal也叫“线程本地变量”、“线程局部变量”: 其作用域覆盖线程,而不是某个具体任务; 其“自然”的生命周期与线程的生命周期“相同”(但在JDK实现中比线程的生命周期更短,减少了内存泄漏的可能)。 ThreadLocal代表了一种线程与任务剥离的思想,从而达到线程封闭的目的,帮助我们设计出更“健康”(简单,美观,易维护)的线程安全类。 一种假象ThreadLocal的使用方法往往给我

2017-10-19 08:55:51 150

转载 Java内存模型

面试中问到“内存模型”,通常是考察Java内存结构和GC,而不是Happens-Before等更深入、细致的内容。内存模型是考察coder对一门语言的理解能力,从而进一步延伸到对JVM优化,和平时学习的深度上,是Java面试中最重要的一部分。这里整理了内存结构和GC的知识点,Happens-Before模型预计在以后学习过JVM过再来整理。 如果把内存模型看做一个数据结构,那么面试中考察的重点分

2017-10-19 08:54:08 141

转载 事务的ACID和四个隔离级别

在实际的业务场景中,并发读写引出了和事务控制的需求。优秀的事务处理能力是关系型数据库(特别是oracle等商用RDBMS)相对于正当风口的NoSQL数据库的一大亮点。但这也从另一方面说明了事务控制的复杂性——正因为过于复杂,大部分NoSQL都没提供事务支持或只提供部分事务支持。ACID一个数据库事务是"一个被视为单一的工作单元的操作序列"。一个良好的事务处理系统,必须具备四个标准特性: 原子性(At

2017-10-18 22:15:45 203

原创 Java集合类综合

Java集合类是JDK学习中的一个经典切入点,也是让初学者最初感受到Java魅力的地方之一,你一定不会忘记不需要关心大小的ArrayList,不用自己实现的Queue,和随处可见的HashMap。面试中,对Java基础的考察中,集合类和String相关是两个重点,这里集中整理了关于集合类的一些知识点。 集合类的结构要求手绘结构图,同时抛出一些简单的线索勾引面试官提问(比如讲HashMap的Hash

2017-10-18 22:10:55 137

XFastUsb_破解.exe

从硬件水平上加速一切以USB接口传输数据的速度,使速度接近于硬件的峰速。

2014-04-02

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除