2.1 集合
2.1.1 List
- ArrayList:基于数组;查询快、增删慢;线程不安全。
- Vector:基于数组;查询快、增删慢;线程安全;拥有Stack(栈)子类。
- LinkedList:基于双向链表;查询慢、增删快;线程不安全;实现Deque(双向队列)接口。
2.1.2 Queue
非阻塞队列(略) | 阻塞队列 |
---|---|
ArrayDeque | ArrayBlockingQueue |
LinkedList | LinkedBlockingQueue |
IdentityLinkedList | LinkedBlockingDeque |
ConcurrentLinkedQueue | LinkedTransferQueue |
ConcurrentLinkedDeque | SynchronousQueue |
PriorityQueue | PriorityBlockingQueue |
DelayQueue |
阻塞队列的主要操作
失败抛异常/阻塞 | 失败返回false/不阻塞 |
---|---|
add(E e):添加一个元索,如果队列已满则抛出异常。 | offer(E e):添加一个元索并返回true,如果队列已满则返回false。 |
remove():移除并返问队列头部的元素,如果队列为空则抛出异常。 | poll():移除并返问队列头部的元素,如果队列为空则返回null。 |
element():返回队列头部的元素,如果队列为空则抛出异常。 | peek():返回队列头部的元素,如果队列为空则返回null。 |
put(E e):添加一个元素,如果队列满则阻塞。 | drainTo(Collection c):从该队列中删除所有可用的元素,并将它们添加到给定的集合中。 |
take():移除并返回队列头部的元素,如果队列为空则阻塞。 | drainTo(Collection c, int maxElements):最多从该队列中删除给定数量的可用元素,并将它们添加到给定的集合中。 |
Java中的阻塞队列实现
- ArrayBlockingQueue:数组阻塞队列。
- LinkedBlockingQueue:链表阻塞队列。
- LinkedBlockingDeque:双向的链表阻塞队列。队头队尾都可以入队出队。
- LinkedTransferQueue:提供transfer、tryTransfer方法的链表阻塞队列。transfer()、tryTransfer()、tryTransfer(E e, long timeout, TimeUnit unit)。
- SynchronousQueue:没有容量的同步阻塞队列。
- PriorityBlockingQueue:优先级阻塞队列。比较器。
- DelayQueue:延时的优先级阻塞队列。比机器、延时时间。
2.1.3 Set
- HashSet:基于HashMap;无序。
- LinkedHashSet:基于LinkedHashMap;按存入先后有序。
- TreeSet:基于TreeMap;按元素大小有序。
2.1.4 Map
Map | Entry<K,V> |
---|---|
HashMap、HashTable、ConcurrentHashMap | key、value、hash、next |
LinkedHashMap | key、value、hash、next、before、after |
TreeMap | key、value、parent、left、right、color |
能否存null | key | value |
---|---|---|
HashMap、LinkedHashMap | √ | √ |
HashTable、ConcurrentHashMap | × | × |
TreeMap | × | √ |
- HashMap:(底层结构、插入元素、查询元素、长度、扩容)基于数组+单向链表或红黑树(链表元素超过8个时,转换红黑树);线程不安全;默认容量16,负载因子0.75。
- LinkedHashMap:按存入先后有序。
- HashTable:基于HashMap+锁;线程安全。
- ConcurrentHashMap:(底层结构、size())基于Segment(extends ReentrantLock)数组+HashMap;需要进行两次hash散列;线程安全;默认并发度16。
- TreeMap:基于红黑树;按Key大小有序。
学习笔记:《程序员小灰》HashMap
学习笔记:《程序员小灰》ConcurrentHashMap
2.2 异常分类及处理
2.2.1 异常的概念
2.2.2 异常分类
- Error:不能被异常处理机制处理。常见的有VirtualMachineError、StackOverflowError、OutOfMemoryError等。
- Exception:可以被异常处理机制处理。
- RuntimeException:运行阶段抛出的异常。常见的有NullPointerException、ClassCastException、ArrayIndexOutOfBundsException等。
- CheckedException:编译阶段抛出的异常。常见的有IOException、SQLException、ClassNotFoundException等。
2.2.3 异常处理方式
- 抛出异常:throw、throws。
- 捕获并处理异常:try catch finally。
2.3 反射机制
2.3.1 动态语言的概念
动态语言指程序在运行时可以改变其结构的语言,比如属性或方法的添加、删除等结构上的变化。
- 动态语言:Python、JavaScript、Ruby
- 非动态语言:C、C++
- 半动态语言:Java
2.3.2 反射机制的概念
在程序运行过程中,对任意一个类都能获取其对象、所有的属性、所有的方法。
2.3.3 反射的应用
核心功能:Java中对象的类型分为编译时类型(引用的类型)和运行时类型(对象的类型)。编译阶段无法预知该对象和类的真实信息;运行阶段通过反射机制获取该对象和类的真实信息。
2.3.4 Java的反射API
Class类、Constructor类、Field类、Method类、AccessibleObject类。
2.3.5 反射的步骤
- 获取Class对象:对象.getClass()、类.class、Class.forname(类的完全限定名)。
- 通过Class对象获取该类的实例对象、方法、属性。
2.4 注解
2.4.1 注解的概念
注解(Annotation)是Java提供的设置程序中元素的关联信息和元数据(MetaData)的方法,它是一个接口。程序可以通过反射获取指定程序中元素的注解对象,然后通过该注解对象获取注解中的元数据信息。
2.4.2 标准元注解:@Target、@Retention、@Documented、@Inherited
- @Target
- @Retention:SOURCE、CLASS、RUNTIME。
- @Documented:javadoc
- @Inherited:子类会继承父类使用的被@Inherited修饰的注解。
2.4.3 注解处理器
通过反射获取指定程序中元素的注解对象,然后通过该注解对象获取注解中的元数据信息。
2.5 内部类
静态内部类、成员内部类、局部内部类、匿名内部类(继承类或实现接口)。
2.6 泛型
泛型的本质是参数化类型。
- 使用Object类型:强制显式数据类型转换。
- 使用泛型:自动隐式数据类型转换。
2.6.1 泛型标记和泛型限定:E、T、K、V、N、?
- 对泛型上限的限定:<? extends T>
- 对泛型下限的限定:<? super T>
2.6.2 泛型方法
public static void generalMethod(T… inputArray) {}
2.6.3 泛型类
public class GeneralClass {}
2.6.4 泛型接口
public interface IGeneral {}
2.6.5 类型擦除
在编码阶段采用泛型时加上的类型参数,会被编译器在编译时去掉。
发生在编译阶段的类型擦除过程如下:
- 查找类型参数的上界(无指定时为Object类型)用来替换类型参数;
- 把代码中的类型参数都替换为具体的类。
2.7 序列化
2.7.1 Java序列化API的使用
- 类要序列化,那么类需要实现java.io.Serializable接口。
- 子类要序列化父类,那么父类也需要实现Serializable接口。
- 静态变量不能序列化。
- 使用transient关键字修饰的变量不能序列化。。
- 序列化和反序列化必须保持序列化ID的一致性,一般使用private static final long serialVersionUID定义序列化ID。
2.7.2 序列化与反序列化
ObjectOutputStream和ObjectInputStream、fastjson、arvo、protobuf、thrift。