Roc`s 随想录

诚信,认真,专注,踏实


  • 首页

  • 分类

  • 标签

  • 归档

  • 关于

使用Optional处理NullPointerException

发表于 2017-01-04   |   分类于 Java基础   |     |   阅读次数

一、 Java中的null

在java中,使用null表示引用的默认值(null是Java中的关键字)。引用在声明的时候不指向任何实例,此时值为null。

1
2
3
Object o1; // null
Object o2 = null; // null
Object o3 = new Object(); // not null

除此之外,在找不到对应资源的时候,除了抛异常,还可能返回null。

例如在java.util.HashMap#get中,

1
2
3
4
5
6
// 在没有输入key对应的value时,返回null
public V get(Object key) {
Node<K,V> e;
return (e = getNode(hash(key), key)) == null ? null : e.value;
}

了解更多

关于null的更多信息:Java中有关Null的9件事

综上几点,可以说null无处不在,因此导致到处需要判空操作 or 处理空指针异常(NullPointerException)。

阅读全文 »

[转] Java instanceof 关键字是如何实现的?

发表于 2016-10-18   |   分类于 Java基础   |     |   阅读次数

Q:

面试的时候碰到这个问题,面试官希望能从底层来分析一下。
我当时知道的只是在同一个类加载器加载的前提下,使用其生成的对象,去比较才有意义。不同的类加载器加载的类生成对象,互相instanceof返回false。
但我不晓得,底层是如何实现的。求各位Java,JVM大神指点迷津,感激不尽!

A:

(by RednaxelaFX) 链接:https://www.zhihu.com/question/21574535/answer/18998914

在进入正题前先得提一句:既然楼主提问的背景是“被面试问到”,那很重要的一点是揣摩面试官提问的意图。按照楼主的简单描述,面试官问的是“Java的instanceof关键字是如何实现的”,那要选择怎样的答案就得看面试官有怎样的背景。比较安全的应对方法是请求面试官澄清/细化他的问题——他想要的“底层”底到什么程度。

情形1:<3K

你在面月薪3000以下的Java码农职位。如果面试官也只是做做Java层开发的,他可能只是想让你回答Java语言层面的 instanceof 运算符的语义。Java语言的“意思”就已经是“底层”。这样的话只要参考Java语言规范对 instanceof 运算符的定义就好:
15.20.2 Type Comparison Operator instanceof, Java语言规范Java SE 7版
当然这实际上回答的不是“如何实现的”,而是“如何设计的”。但面试嘛⋯

如果用Java的伪代码来表现Java语言规范所描述的运行时语义,会是这样:

1
2
3
4
5
6
7
8
// obj instanceof T
boolean result;
try {
T temp = (T) obj; // checkcast
result = true;
} catch (ClassCastException e) {
result = false;
}

用中文说就是:如果有表达式 obj instanceof T ,那么如果 (T) obj 不抛 ClassCastException 异常则该表达式值为 true ,否则值为 false 。
注意这里完全没提到JVM啊Class对象啊啥的。另外要注意 instanceof 运算符除了运行时语义外还有部分编译时限制,详细参考规范。

如果这样回答被面试官说“这不是废话嘛”,请见情形2。

阅读全文 »

模板方法模式--设计模式

发表于 2016-08-22   |   分类于 Java基础   |     |   阅读次数

模板方法概述

在一个复杂的系统里,有很多类似的业务。整体业务有很多步骤,例如产品内部运营系统,包括销售创建、运营审核上线、商户推广等步骤。在很多业务中,有一些步骤是相同的,有一些步骤是不同的。例如销售创建部分,创建的内容类型等可能有很多种,而审核和推广则是相同的。

模板方法适合解决这种场景的问题。模板中定义一个流程的骨架,具体的差异化的步骤在子类中实现。通常基类中的某些步骤是抽象的。

定义如下:

模板方法模式:定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

Template Method Pattern: Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.

模式中的角色

  1. 抽象类(基类,AbstractClass): 定义模板方法,定义算法骨架(包括业务流程信息等)。
  2. 具体类(SubClass): 实现抽象类中的抽象方法,通常是差异化业务部分。

模式的结构和实现

模式结构

模板方法模式结构比较简单,其核心是抽象类和其中的模板方法的设计:

模板方法模式典型的结构

其中,AbstractFlow是角色中的抽象类,AbstractFlowImpl和AnotherAbstractFlowImpl是具体类。

阅读全文 »

看 ‘北大最短毕业致辞’ 的感受

发表于 2016-07-07   |   分类于 思维改变生活   |     |   阅读次数

有人说,美好的理想是廉价的,不能实在地为一个人带来金钱财富……

而我觉得,理想是昂贵的,圣洁的。理想让一个人活的更有意义,哪怕让这个世界变得美好一点点也好。理想是昂贵的,追求理想获取会让我们耗费大量的时间、精力,但这也让追求理想变得弥足珍贵。

以下是原文,演讲全文仅535字:


致辞:饶毅(教师代表、科学家)

做自己尊重的人

饶毅

在祝福裹着告诫呼啸而来的毕业季,请原谅我不敢祝愿每一位毕业生都成功、都幸福;因为历史不幸地记载着:有人的成功代价是丧失良知;有人的幸福代价是损害他人。

阅读全文 »

Thinking in Java 读书笔记 — 第1章 对象导论

发表于 2016-06-29   |     |   阅读次数

目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
第1章 对象导论
1.1 抽象过程
1.2 每个对象都有一个接口
1.3 每个对象都提供服务
1.4 被隐藏的具体实现
1.5 复用具体实现
1.6 继承
1.6.1 “是一个”与“像是一个”的关系
1.7 伴随多态的可互换现象
1.8 单根继承结构
1.9 容器
1.9.1 参数化类型
1.10 对象的创建和生命周期
1.11 异常处理:处理错误
1.12 并发编程
1.13 Java与Internet
1.13.1 Web是什么
1.13.2 客户端编程
1.13.3 服务端编程
1.14 总结
阅读全文 »

IP地址的不同格式和转化

发表于 2016-06-23   |   分类于 知识记录   |     |   阅读次数

摘要:

Internet的发展离不开IP(Internet Protocol,网络之间互联的协议),目前广泛应用的是IPv4,正在积极部署的是IPv6。

本文主要介绍IP地址的不同表达格式和转化。

阅读全文 »

Mockito初使用

发表于 2016-06-01   |   分类于 知识记录   |     |   阅读次数

作为一个研发工程师,自己的代码怎么可以不测试呢?

但是自己跑单测的时候,有的时候某些RPC服务不好配置 or 无线下测试环境,所以我们需要对这些难以实例化等的对象进行Mock(adj. 模拟的;仿制的;虚假的;不真实的)。

这里我们使用Mockito。

Mockito简介

Mockito is a mocking framework that tastes really good. It lets you write beautiful tests with a clean & simple API. Mockito doesn’t give you hangover because the tests are very readable and they produce clean verification errors. Read more about features & motivations.

Mockito 是一个模拟框架,用起来非常好用。它允许你用干净简单(too simple)的API写漂亮的测试方法。Mockito不会给你遗留物(不侵入源代码,不造成别的影响的意思吧),因为这些测试可读性非常好,产生的可验证的错误也非常简洁。阅读更多信息参考上述链接。

  • Mockito是StackOverflow社区投票选出的最好的Java Mock 框架
  • 不仅仅在策划工具中,在所有的类库中,Mockito也是排名前十的Java类库。
阅读全文 »

一致性Hash算法

发表于 2016-05-23   |   分类于 知识记录   |     |   阅读次数

一致性Hash算法是什么?

一致性哈希(Consistent Hashing),是一种特殊的哈希算法。在使用一致哈希算法后,哈希表槽位数(大小)的改变平均只需要对K/n 个关键字重新映射,其中 K是关键字的数量,n是槽位数量。然而在传统的哈希表中,添加或删除一个槽位的几乎需要对所有关键字进行重新映射。

–wiki

现在这种思想已经被广泛的应用在了其他领域,尤其是分布式系统非常流行的今天。

解决的问题

在分布式系统中,比如典型的KV型缓存系统,存储的位置一般是通过hash(key)得到的值确定的。比较简单的,例如,通过hash(key) % N,确定存储的节点,其中N是存储节点个数。这是最简单直观的做法,但是有一个比较严重的问题,如果有新的机器加入或者退出,基本上所有的映射都对用不上了。

$$
hash(Key)\pmod N
$$

为了能够随时增加、减少机器并且造成的映射变化最小,在此基础上还可以尽可能的使内容比较均匀的分布在每个存储节点上等,1997年由麻省理工学院提出的一种分布式哈希(DHT,Distributed Hash Table,分布式哈希表)实现算法,即一致性哈希算法。

阅读全文 »

怎样阅读别人的代码?

发表于 2015-12-28   |     |   阅读次数

背景:

最近接到一个任务, 在原有的项目基础上进行开发, 增加一个新功能, 有之前的类似功能对照.看起来挺简单的, 然后立刻准备开发, 但是碰壁一头雾水, 工程太复杂了, 涉及的子工程比较多, 类/配置文件等特别多.

简要:

然后开始从网上搜索–”怎样阅读别人的代码”, 总结了下:
收集相关的资料, 阅读代码,追踪数据流,仿写,测试。

阅读全文 »
12…6
Coder_Roc

Coder_Roc

关注技术趋势,服务端技术细节,Java语言,技术热点等,关注思维和最佳实践。

58 日志
10 分类
80 标签
RSS
GitHub Weibo Zhihu
© 2014 - 2017 Coder_Roc
由 Hexo 强力驱动
主题 - NexT.Pisces