「Core Java」读书笔记

/ 0评 / 0

对象与类

Java 程序设计语言对对象采用的不是引用调用,实际上,对象引用是按值传递的。

一个方法不能修改一个基本数据类型的参数(即数值型或布尔型)。

一个方法可以改变一个对象参数的状态。

如果多个方法(比如, StringBuilder 构造器方法)有相同的名字、不同的参数,便产生了重载。

继承

一个对象变量(例如,变量 e ) 可以指示多种实际类型的现象被称为多态(polymorphism)。 在运行时能够自动地选择调用哪个方法的现象称为动态绑定(dynamic binding )。

不允许扩展(extend)的类被称为 final 类。如果在定义类的时候使用了 final 修饰符就表明这个类是 final 类。

类中的特定方法也可以被声明为 final。如果这样做,子类就不能覆盖这个方法。

接口、lambda 表达式与内部类

接口绝不能含有实例域,在 JavaSE 8 之前,也不能在接口中实现方法。提供实例域和方法实现的任务应该由实现接口的那个类来完成。因此,可以将接口看成是没有实例域的抽象类。

Java 不支持多继承,接口可以提供多重继承的大多数好处,同时还能避免多重继承的复杂性和低效性。

集合

当在程序中使用队列时,一旦构建了集合就不需要知道究竟使用了哪种实现。因此,只有在构建集合对象时,使用具体的类才有意义。

在 Iterator 接口中没有 add 方法。相反地,集合类库提供了子接口 Listlterator,其中包含 add 方法。

在 Java 中,散列表用链表数组实现,每个列表被称为桶(bucket)

散列映射(HashMap)中,散列或比较函数只能作用于键,与键关联的值不能进行散列或比较

树集是一个有序集合,可以以任意顺序将元素插入到集合中。在对集合进行遍历时,每个值将自动地按照排序后的顺序呈现。

优先级队列使用了一个优雅且高效的数据结构,称为堆(heap)。堆是一个可以自我调整的二叉树,对树执行添加和删除操作,可以让最小的元素移动到根,而不必花费时间对元素进行排序。

并发

在任何给定时刻,一个可运行的线程可能正在运行也可能没有运行(这就是为什么将这个状态称为可运行而不是运行)。

当一个线程试图获取一个内部的对象锁(而不是 java.util.concurrent 库中的锁),而该锁被其他线程持有,则该线程进人阻塞状态。

当线程等待另一个线程通知调度器一个条件时,它自己进入等待状态。

守护线程应该永远不去访问固有资源,如文件、数据库,因为它会在任何时候甚至在一个操作的中间发生中断。

有两种机制防止代码块受并发访问的干扰。Java语言提供一个 synchronized 关键字达到这一目的,并且 Java SE 5.0引入了 ReentrantLock 类。

如果一个方法用 synchronized 关键字声明,那么对象的锁将保护整个方法。也就是说,要调用该方法,线程必须获得内部的对象锁。

volatile 关键字为实例域的同步访问提供了一种免锁机制。如果声明一个域为 volatile,那么编译器和虚拟机就知道该域是可能被另一个线程并发更新的。

发表评论

邮箱地址不会被公开。 必填项已用*标注