前言
最近发现有时候看完一本书,时间久了容易忘记,看书不总结思考效果大打折扣,故打算写这一系列文章,一是为了整理书中的要点,帮助自己消化理解;二是勉励自己多看书思考。文章中不会把书中内容讲解的非常详细,只是总结概括,适合已经阅读过该书的读者。
第3章:Java的基本程序设计结构
(1)8种基本类型
Tables | Are |
---|---|
int | 4字节 |
short | 2字节 |
long | 8字节 |
byte | 1字节 |
float | 4字节 |
double | 8字节 |
char | 不一定,至少2字节 |
boolean |
- ps:Java中上述类型占空间的大小与机器无关。对于c++,int在16位机器占2字节,32位上占4字节;long在32位上占4字节,在64位处理器上占8字节
- 二进制:前置0b;八进制:前置0;十六进制:前置0x
(2)字符串
- 一定不能用==判断两个字符串是否相等,要用 a.equals(b)
(3)大数值
- BigInteger和BigDecimal可以处理任意长度和精度的数字数值
第4章:对象与类
两个public class不能定义在同一个文件中
final修饰符大都应用于基本类型域,或不可变类域(无任何方法可以修改类,如String)。若用于可变的类,仅仅指被final修饰的对象引用不能改变,但是对象引用引用的对象是能被改变的
不要编写返回引用可变对象的访问器方法,应返回其克隆
(1)方法参数
- Java中只有按值调用,没有按引用调用(c++分按值和按引用),Java的做法是把参数的对象引用拷贝一份传入
- 一个方法不能修改一个基本数据类型的参数
- 一个方法可以改变一个对象参数的状态
- 一个方法不能让对象参数引用一个新的对象
(2)对象构造
- 数据域初始化
- 在构造器中设置值
- 在声明中赋值
- 初始化块:在类的申明中,包含多个代码块,只要构造类的对象,这些块就会被执行
- 对于静态域初始化,可提供初始化值,或静态初始化块
第5章:继承
子类的方法不能直接访问超类的私有域,需借用super.私有域
多态
- 一个对象变量可以指示多种实际类型的现象
动态绑定
- 运行时能够自动地选择调用哪个方法
final
- 修饰类,阻止继承
- 修饰方法,阻止重写
(1)访问修饰符
- private:仅对本类可见
- public:对所有类可见
- protected:对本包和所有子类可见
- 默认:对本包可见
(2)Object类
- 常用方法:equals、toString、hashCode、
(3)反射Class
- Object.getClass 获得 java.lang.Class
- Class.forName(“java.util.Date”)
第6章:接口与内部类
(1)接口
- 接口中的所有方法自动属于public
- 接口可以定义常量,接口中的域自动设为public static final
- 接口绝不能含有实例域,也不能在接口中实现方法
常用接口:Cloneable、Comparable
(2)克隆
- 默认拷贝是浅拷贝
- 用户需要自己实现深拷贝
(3)内部类
好处
- 内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据
- 内部类可以对同一个包中的其他类隐藏起来
- 匿名内部类很便捷
局部内部类
- 不能用public或private访问说明符声明
- 对外部世界可以完全隐藏
- 可以访问外部类,和被声明为final的局部变量
- 匿名内部类
- 只使用一次
- 静态内部类
- 有时候内部类只是为了把一个类隐藏在另外一个类的内部,并不需要内部类引用外部类,使用static声明,形成内部公有类
- 只有内部类可以声明static
第11章:异常、断言、日志和调试
第13章:集合
(1)集合框架
(2)具体集合
第14章:多线程
(1)线程同步(常用)
- 锁对象
public ReentrantLock myLock;
myLock.lock();
tyr {
critical section //临界区
}
finally {
myLock.unlock();
}
- 这一结构确保任何时刻只有一个线程进入临界区,一旦一个线程封锁了锁对象,其他任何线程都无法通过lock语句。
锁是可重入的,即同一线程可以重复地获得已经持有的锁。锁保持了一个持有计数
条件对象
- 一个锁对象可以有一个或多个相关的条件对象,如果线程获取锁后发现相关条件不满足,可以调用条件对象的await(),则当前线程被阻塞,并放弃了锁,其他线程可获得该锁。
public ReentrantLock myLock;
public Condition oneCondition = myLock.newCondition();
myLock.lock();
tyr {
while(....)
oneCondition.await();
critical section //临界区
oneCondition.signalAll(); //若有阻塞线程,通知解除
}
finally {
myLock.unlock();
}
- synchronized关键字
public synchronized void method() {
}
等价于
public void method() {
this.intrinsticLock.lock();
try {
method body
}
finally {
this.intrinsicLock.unlock();
}
}
- 从Java1.0版本开始,Java中的每个对象都有一个内部锁,用synchronized关键字声明方法,那对象的锁将保护整个方法
- 内部对象锁只有一个相关条件,调用wait或notifyAll等价于intrinsicCondition.await()、intrinsicCondition.notifyAll()
- 建议最好不使用lock和synchronized关键字,多使用java.util.concurrent包中的一种机制,如果要用,尽量使用synchronized
synchronized还有另外一种机制
synchronized(obj) {
临界区
}
- Volatile域
- Java 语言提供了一种稍弱的同步机制,即 volatile 变量.用来确保将变量的更新操作通知到其他线程,保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新. 当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的.
private boolean done;
public synchronized boolean isDone() { return done; }
public synchronized void setDone() { done = true; }
可替换为
private volatile boolean done;
public boolean isDone() { return done; }
public void setDone() { done = true; }
- 线程局部变量
- ThreadLocal,每个线程独享
(2)线程安全集合
阻塞队列
- 对于许多线程问题,可以通过使用一个或多个队列以优雅且安全的方式将其形式化
BlockingQueued
- 对于许多线程问题,可以通过使用一个或多个队列以优雅且安全的方式将其形式化
线程安全集合
- concurrentHashMap, concurrentSkipListMap, ConcurrentSkipListSet, ConcurrentLinkedQueue
集合size方法不必再常量时间内操作,通常采用遍历的方法
- 集合返回弱一致性的迭代器,意味着迭代器不一定反映出它们被构造之后的所有修改
任何集合类通过使用同步包装器变成线程安全的
List<E> synchArrayList = Collections.synchronizedList(new ArrayList<E>());
Map<K, V> synchHashMap = Collections.synchronizedMap(new HashMap<K, V>());
ArrayList
- CopyOnWriteArrayList(适合读多写少)
- Collections.synchronizedList(包装)
LinkedList
- ConcurrentLinkedQueue
HashMap
- ConcurrentHashMap(锁分离)
- Collections.SynchronizedMap(包装,synchronized 锁住整个Map)
- HashTable(synchronized 锁住整个HashTable)
TreeMap
- ConcurrentSkipListMap(跳表)
TreeSet
- ConcurrentSkipListSet(跳表)
(3)Callable和Future
- Runable封装一个异步运行任务,没有参数和没有返回值,方法名为run
- Callable与Runable类似,但有返回值,方法名为call
- Future用于保存异步计算结果,具备get、cancel、isCancelled、isDone等方法
- ps:FutureTask可以将Callable转换成Future和Runnable
(3)执行器
- 执行者工厂方法
- newCachedThreadPool,Excutors.newCachedThreadPool()
- newFixedThreadPool
- newSingleThreadExecutor
(4)其他线程同步方法
- CyclicBarrier
- CountDownLatch
- Exchanger
- Semaphore
- SynchronousQueue