Java: Concurrency and Multi-threading
Intro现在大多数计算机都有多核处理器,可以并行执行多个任务。这一章要讲的就是如何在代码中利用多核处理器,这能提升程序的响应速度。
Processes and Threads进程(process)是一个程序(program)或一个应用(application)的实例。当启动一个应用程序(如代码编辑器或音乐播放器)时,操作系统就会把这个应用加载到一个进程中,因此一个进程包含着这这个应用的代码的映像,它有一些内存和一些其他资源。
你的操作系统可以同时执行多个进程。例如,它可以在播放音乐的同时运行杀毒软件,这就是进程级的并发。但也可以在进程内或使用线程的应用中使用并发。
技术上来说,线程是指令序列(a sequence of instructions),它就像一条指令线。现实点说,线程就是执行代码的东西。
每个进程至少调用一个线程,称为主线程。但我们也可以创造额外的线程去同时执行多个任务。例如我们可以创建一个可以一同时服务多个用户的 web 服务器,我们将使用一个单独的线程为每个客户端服务。或者我们可以构建一个可以同时下载多个文件的应用程序,让每个线程下载一个单独的文件。这就是多线程。
如 ...
Java: Streams
IntroStream 允许我们以声明式编程的方式来处理数据集。
Imperative VS Functional Programming假设我们有一个电影列表,我们想知道有多少个电影超过十个赞。
先有 Movie 类:
1234567891011121314public class Movie { private String title; private int likes; public Movie(String title, int likes) { this.title = title; this.likes = likes; } public int getLikes() { return likes; }}
然后进行如下操作:
123456789101112131415public class StreamDemo { public static void show() { List<Mov ...
Java: Lambda Expressions and Functional Interfaces
Functional InterfacesA functional interface is a interface with a single abstract method.
之前提过的 Comparable 接口就只有一个 compareTo 方法,所以它就是一个 functional interface。
Comparator 接口虽然有很多方法,但只有 compare 方法没有默认实现,所以它也是一个 functional interface。
创建包 lambdas,类 LambdasDemo 以及接口 Printer。
123public interface Printer { void print(String message);}
作为一个接口,Printer 可能有不同的实现。
123456public class ConsolePrinter implements Printer{ @Override public void print(String message) { System.out ...
Java: Collections
Intro
上图是集合框架的概述,其中绿色的是接口,蓝色的是类。
顶部的 Iterable 接口,实现这个接口的类都可以被用于 for 循环。
下面的 Collection 接口继承了上面的 Iterable 接口。实现这个接口的类都可以充当容器,或表示一些对象的集合。它实现的功能有添加(add),移除(remove),检查对象是否存在(contains),清空(clear)等等。
接下来是 Collection 的三个子接口,列表(List)、队列(Queue)和集合(Set)。
List 允许我们使用有序集合,并使用对象的索引访问对象,就像我们在数组(Array)中做的那样。
ArrayList 是动态数组。它在内部用数组来存储对象,如果数组已满,它会自动扩充(resize)。
LinkedList 是基于链表的数据结构。
Queue 使用的情况通常是分配共享资源。比如说一个打印机一次只能打印一张纸,我们就需要把任务放入队列,然后打印机就可以一个接着一个地完成任务。
Set 表示一个没有重复元素的集合。
The Need for Iterables准确地说,Iterable 接口不 ...
Java: Generics
为何需要范性先创建一个包 generics,然后创建一个类 List,它的实现如下:
123456789101112public class List { private int[] items = new int[10]; private int count; public void add(int item) { items[count++] = item; } public int get(int index) { return items[index]; }}
这里我们忽略很多细节,比如要检查 index 的范围。
现在我们可以去主函数中为刚才创建的类构造对象,并对其进行相关操作。
但可能之后我们又会需要一个 list 去记录用户,因此我们又得创建一个类。
因为之前创建的 List 类只能用于存储整型数。
所以我们需要范性来解决这个问题。
A Poor Solution简单的方法如下:
123456789101112public class List ...