Johnny Shieh

人如果没有梦想,跟咸鱼有什么分别


  • 首页

  • 分类

  • 归档

  • 标签

  • 读书

  • 小伙伴

  • 关于

  • 搜索

面试精选之位操作问题集锦

发表于 2017-12-19 | 分类于 面试精选 | | 阅读次数

Java 中位运算符有与(&)、或(|)、非(~)、异或(^)、左移(<<)、右移(>>)、无符号右移(>>>),只针对 int 类型有效,也可以作用于 byte、short、char、long,当为这四种类型时,JVM 会先把它们转换为 int 再操作。使用位运算符可以优化一些场景的运行速度,有时也可以简化代码,掌握一些位操作的技巧还是很有必要的,下面是我总结的 LeetCode 上一些位操作算法问题。

1. 在 O(n)时间内求 0 ~ N 的所有整数的二进制表示中 1 的个数

LeetCode 338. Counting Bits

题目描述:给定一个非负整数 num,求 0 到 num 所有数的二进制表示中 1 的个数,最好在一次遍历 O(n)时间内完成,而且不能使用内置 API。

分析:求二进制表示中 1 的个数可以使用 Integer.bitcount() 实现,但是题目要求不能使用其他内置函数,所以好像没什么办法可以 O(1) 时间内求一个数的 bitcount。这种情况下,可以看下实际的例子。

0 1 2 3 4 5 6
0 1 10 11 100 101 110
0 1 1 2 1 2 2
阅读全文 »

Kotlin 写 Android 单元测试(四),Robolectric 在 JVM 上测试安卓相关代码

发表于 2017-12-15 | 分类于 单元测试 | | 阅读次数

Kotlin 写 Android 单元测试系列文章:

Kotlin 写 Android 单元测试(一),单元测试是什么以及为什么需要

Kotlin 写 Android 单元测试(二),JUnit 4 测试框架和 kotlin.test 库的使用

Kotlin 写 Android 单元测试(三),Mockito mocking 框架的使用

Kotlin 写 Android 单元测试(四),Robolectric 在 JVM 上测试安卓相关代码

未完待续…

通过前面几篇文章,我们知道可以使用 JUnit 4 和 Mockito 测试框架来测试纯 Java 业务逻辑,但是无法在 JVM 上测试 Android 相关代码。因为 Android 代码需要运行在 Android 平台的虚拟机 Dalvik 或 ART 上,不能直接在 Java 虚拟机(JVM)上直接运行。而我们用 Android Studio 编写 Android 代码时只需要下载 JDK 和 Android SDK,在项目的External Libraries可以看到编译所需要的 Android API,实际上就是 android.jar,这样 Android 代码就能正常开发编译了。

但是 android.jar 里的类只是个壳,里面的方法都是throw RuntimeException("stub!!");,所以在 Android Studio 中可以正常开发编译,但是在 JDK 中 JVM 下运行的话会抛 RuntimeException。我们的 app 代码能在 Dalvik 或 ART 上运行,可以运行是因为它们把 android.jar 里面替换为 Android 的系统实现,所以才能正常运行。

阅读全文 »

Kotlin 写 Android 单元测试(三),Mockito mocking 框架的使用

发表于 2017-12-01 | 分类于 单元测试 | | 阅读次数

Kotlin 写 Android 单元测试系列文章:

Kotlin 写 Android 单元测试(一),单元测试是什么以及为什么需要

Kotlin 写 Android 单元测试(二),JUnit 4 测试框架和 kotlin.test 库的使用

Kotlin 写 Android 单元测试(三),Mockito mocking 框架的使用

Kotlin 写 Android 单元测试(四),Robolectric 在 JVM 上测试安卓相关代码

未完待续…

Junit 4 测试框架可以验证有直接返回值的方法,但是对于没有返回值的 void 方法应该如何测试呢?void 方法的输出结果其实是调用了另外一个方法,所以需要验证该方法是否有被调用,调用时参数是否正确。Mocking 框架可以验证方法的调用,目前流行的 Mocking 框架有 Mockito、JMockit、EasyMock、PowerMock 等。我选择的是 Mockito 框架,原因是:(1)Mockito 是 Java 中最流行的 mocking 框架;(2)Google 的 Google Sample 下的开源库中使用也是 Mockito 框架。下面介绍 Mockito 框架一些概念和用法,以及 Kotlin 中 mockito-kotlin 库的使用。

本文是基于 Mockito 2.13.0 版本,Android Studio 3.0 环境

1. Mockito 框架

Gradle 引入

1
2
3
testImplementation 'org.mockito:mockito-core:2.13.0'
// 如果需要 mock final 类或方法的话,还要引入 mockito-inline 依赖
testImplementation 'org.mockito:mockito-inline:2.13.0'
阅读全文 »

面试精选之链表问题集锦

发表于 2017-11-24 | 分类于 面试精选 | | 阅读次数

链表问题是面试过程中经常被问到的一部分,很考查编程功底。最近刷了 LeetCode 上链表部分的面试题,我总结了一些有代表性的链表问题。

本文使用的是 Java 语言,下面是所用到的链表节点的定义:

1
2
3
4
5
6
7
8
public class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}

1. 在 O(1) 时间删除链表节点

LeetCode 237. Delete Node in a Linked List

题目描述:给定单链表中需要删除的节点(不是尾节点),在 O(1) 时间删除该节点。

分析:本题与《编程之美》上的「从无头单链表中删除节点」类似。主要思想都是「狸猫换太子」,即用下一个节点数据覆盖要删除的节点,然后删除下一个节点。但是如果节点是尾节点时,该方法就行不通了。

代码如下:

1
2
3
4
5
6
7
8
9
// 在 O(1) 时间从无头单链表中删除节点
public void deleteNode(ListNode node) {
// 不能为空,不能为尾节点
if (null == node || null == node.next) {
return;
}
node.val = node.next.val;
node.next = node.next.next;
}
阅读全文 »

线程安全之 ReentrantLock 完全解析

发表于 2017-10-24 | 分类于 Java | | 阅读次数

线程互斥同步除了使用最基本的 synchronized 关键字外(关于 synchronized 关键字的实现原理,请看之前写的线程安全之 synchronized 关键字), Java 5 之后还提供了 API 可以实现同样的功能,java.util.concurrent(简称 J.U.C)下的重入锁 ReentrantLock 不仅实现可重入的互斥锁,还有几个高级功能:等待可中断、可实现公平锁、锁可绑定多个条件、可限定最大等待时间。下面从基本使用到内部实现,层层分析 ReentrantLock 原理。

ReentrantLock 的用法

ReentrantLock 文档中写明了在 lock() 方法后,用 try 把同步代码块包起来,然后在 finally 中调用 unlock()。这样做的目的是保证解锁操作一定会被调用,防止死锁。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class X {
private final ReentrantLock lock = new ReentrantLock();
// ...
public void m() {
// block until condition holds
lock.lock();
try {
// ... method body
} finally {
lock.unlock();
}
}
}

ReentrantLock 还可以绑定多个条件,下面使用 Condition 文档中的例子来说明:

阅读全文 »
1…345…16
Johnny Shieh

Johnny Shieh

我本微末,心向天空

76 日志
13 分类
43 标签
GitHub Weibo Gmail 简书
  • 热门系列
  • Dagger 完全解析(6)
  • AspectJ in Android(3)
  • Kotlin 写 Android 单元测试(4)
  • Kotlin 协程完全解析(5)
© 2015 - 2019 Johnny Shieh
访客数 访问量