
Java
oldmee
这个作者很懒,什么都没留下…
展开
-
Effective Java(Third Edition) item8:避免使用终结方法(finalizer)和清除方法(cleaner)
注:Java9之前只有终结方法,Java9出现了新的清除方法取代了终结方法。终结方法(finalizer)通常是不可预测的,也是很危险的,一般情况下是不必要的。清除方法没有终结方法那么危险,但仍然是不可预测、运行缓慢,一般情况下也是不必要的。talk is cheap,show me the code。定义一个Room类,实现AutoCloseable接口(使用try-with-res...原创 2019-02-02 11:44:02 · 795 阅读 · 0 评论 -
Spring REST Docs 介绍
Spring REST Docs 是一个为 Spring 项目生成 API 文档的框架,它通过在单元测试中额外添加 API 信息描述,从而自动生成对应的文档片段。本文会以一个最简单的示例介绍如何在一个 Spring Boot 应用中使用 Spring REST Docs,并在最后与目前最常见的 SpringFox 进行一些对比,分别介绍其特点和优劣。 基础准备首先需要一个 Spri...原创 2019-02-26 14:38:27 · 7906 阅读 · 4 评论 -
双重验证模式(新)
public class DoubleClick { // Double-check idiom for lazy initialization of instance fields private volatile FieldType field; private FieldType getField() { FieldType result =...原创 2019-02-14 15:33:50 · 359 阅读 · 2 评论 -
Java 7新特性之ForkJoin框架
Fork/Join框架Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。我们再通过Fork和Join这两个单词来理解下Fork/Join框架,Fork就是把一个大任务切分为若干子任务并行的执行,Join就是合并这些子任务的执行结果,最后得到这个大任务的结果。比如计算1+2+3+4,可以分割...原创 2019-02-14 14:25:57 · 150 阅读 · 0 评论 -
一秒钟搞懂zookeeper实现的分布式锁
分布式锁获取思路a、在zookeeper指定节点(locker)下创建临时顺序节点。b、客户端调用createNode方法在locker下创建临时顺序节点,然后调用getChildren(“locker”)来获取locker下面的所有子节点,注意此时不用设置任何Watcher。c、客户端获取到所有的子节点path之后,如果发现自己创建的子节点序号最小,那么就认为该客户端获取到了锁。...原创 2019-02-19 21:46:09 · 145 阅读 · 0 评论 -
else if的运作流程
今天工作中碰到了一个else if,我一直以为else if跟if一样都会判断,然而,事情并不是我想的那样。 /** * @author R.oldmee * @date 2019/2/19 5:59 PM */public class ElseIfTest { @org.junit.Test public void test() { int...原创 2019-02-19 18:10:25 · 810 阅读 · 0 评论 -
图书列表清单
阅读清单2018-12-08第一批次Java编程思想 第4版 Head First 设计模式 深入理解Java虚拟机 JVM高级特性与最佳实践 Effective Java英文版 第三版 重构 改善既有代码的设计 Docker技术入门与实战 Hadoop权威指南第四版 Hive编程指南 Spark快速大数据分析 2019-01-24第二批次Effect...原创 2019-02-25 09:46:29 · 1723 阅读 · 0 评论 -
Effective Java(Third Edition) item76:努力使失败保持原子性
一般而言,失败的方法调用应该使对象保持在被调用之前的状态。具有这种属性的方法被称为具有失败原子性(failure atomic)public Object pop() { if (size == 0) throw new EmptyStackException(); Object result = elements[--size]; elements[...原创 2019-02-13 15:39:40 · 235 阅读 · 0 评论 -
Effective Java(Third Edition) item73:抛出与抽象对应的异常
如果方法抛出的异常与它所执行的任务没有明显的联系,这种情况将使人不知所措。当方法传递由低层抽象抛出异常时,往往会发生这种情况。除了使人感到困惑之外,这也“污染”了具有实现细节的更高层的API。如果高层的实现在后续的发行版本中发生了变化,它所抛出的异常也可能跟着发生变化,从而潜在地破坏现有的客户端程序。为了避免这个问题,更高层的实现应该捕获低层的异常,同时抛出可以按照高层抽象进行解释的异常。这种...原创 2019-02-13 15:08:44 · 176 阅读 · 0 评论 -
Class.forName("com.mysql.jdbc.Driver")到底在干啥
Class.forName("com.mysql.jdbc.Driver").newInstance() (Java 9开始newInstance()就已经不赞成使用了) 等价于 com.mysql.jdbc.Driver driver = new com.mysql.jdbc.Driver();Class.forName()的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态...原创 2019-02-13 12:39:51 · 1015 阅读 · 0 评论 -
StringBuffer中的toStringCache字段
不知道大家有没有注意到,StringBuffer中比StringBuilder多了一个toStringCache字段,字段上的解释是返回最后一次toString的缓存值,一旦StringBuffer被修改就清除这个缓存值。/** * A cache of the last value returned by toString. Cleared * whenever the...原创 2019-02-13 10:31:40 · 3110 阅读 · 3 评论 -
Java 9新增的一个方法InputStream.transferTo()
在Java每个重要的发型版本中,都会有许多新的特性被加入到类库中,所以与这些新特性保持同步是值得的。假设想要编写一个程序,用它打印出命令行中指定的一条URL的实际内容(类似于curl命令)。在Java 9之前,这些代码有点烦琐,但是Java 9在InputStream中增加了transferTo方法,程序一下子就简单了很多:public class Curl { public s...原创 2019-02-12 17:49:53 · 1147 阅读 · 0 评论 -
关于Java中的随机数库
一、Random 1、生成伪随机数(流),使用48位种子,使用线性同余公式进行修改。可以通过构造器传入初始seed,或者通过setSeed重置(同步);默认seed生成主导变量为系统时间的纳秒数。 2、如果两个(多个)不同的Random实例,使用相同的seed,按照相同的顺序调用相同方法,那么它们得到的数字序列也是相同的。这种设计策略,既有优点也有缺点,优点是“相同seed”生...原创 2019-02-12 17:33:34 · 761 阅读 · 0 评论 -
Java8 如何正确使用 Optional
Optional是Java8提供的为了解决null安全问题的一个API。善用Optional可以使我们代码中很多繁琐、丑陋的设计变得十分优雅。不使用Optional,代码是这样的:public static String getName(User u) { if (u == null) return "Unknown"; retur...原创 2019-02-12 15:17:07 · 222 阅读 · 0 评论 -
Effective Java(Third Edition) item52:慎用重载
public class SetList { public static void main(String[] args) { Set<Integer> set = new TreeSet<>(); List<Integer> list = new ArrayList<>(); for (i...原创 2019-02-12 13:23:17 · 255 阅读 · 0 评论 -
关于注解@FunctionalInterface
什么是函数式接口(Functional Interface)其实之前在讲Lambda表达式的时候提到过,所谓的函数式接口,当然首先是一个接口,然后就是在这个接口里面只能有一个抽象方法。这种类型的接口也称为SAM接口,即Single Abstract Method interfaces。 函数式接口用途它们主要用在Lambda表达式和方法引用(实际上也可认为是Lambda表达式)...原创 2019-02-12 10:43:17 · 387 阅读 · 0 评论 -
再谈类型擦除
之前写过一篇泛型的帖子,里面讲到了类型擦除,当时写的不够清楚,现在根据字节码再来解释一下 类型擦除前:public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>(); map.put("hello", "你好"); map.p...原创 2019-01-29 14:54:16 · 211 阅读 · 0 评论 -
Java单例模式的五种写法
在设计模式中单例模式看上去是最简单的一种模式,但是考虑安全性和性能的话,它并不简单。第一种(懒汉,线程安全): public class Singleton { private static Singleton instance; private Singleton (){} public static synchronized Singlet...原创 2019-03-22 13:41:00 · 234 阅读 · 0 评论