java基础-廖雪峰

一位数组打印 Arrays.toString
二维数组打印 Arrays.deepToString

可以在一个构造方法中通过this()调用另一个构造方法

StringBuffer是StringBuilder的线程安全版本 没有必要使用StringBuffer

接口可以定义default方法(JDK>=1.8)

catch可以匹配多个非继承关系的异常(JDK>=1.7)
使用multi-catch捕获多种类型异常
try {

} catch (InstantiationException | IllegalAccessException e) {

}

finally如果抛出异常会导致suppressed exception
用getSuppressed()获取所有异常信息
处理suppressed exception要求JDK>=1.7
java基础-廖雪峰
获取一个class的Class实例:
Class cls = String.class;
Class cls = “str”.getClass();
Class cls = Class.forName(“java.lang.String”);
调用Method
Object invoke(Object obj, Object… args)
通过设置setAccessible(true)来访问非public方法

获取父类的Class:
Class getSuperclass()
Object的父类是null
interface的父类是null
获取当前类直接实现的interface:
Class[] getInterfaces()
不包括间接实现的interface
没有interface的class返回空数组
interface返回继承的interface
判断一个向上转型是否成立:
bool isAssignableFrom(Class)

使用@interface定义注解(Annotation)
使用元注解定义注解:
@Target
@Retention
@Repeatable
@Inherited
定义Annotation的步骤:

  1. 用@interface定义注解
  2. 用元注解(meta annotation)配置注解
    Target:必须设置
    Retention:一般设置为RUNTIME
    通常不必写@Inherited, @Repeatable等等
  3. 定义注解参数和默认值

Arrays.asList

Objects.equals(p.name, this.name) (JDK>=1.7)
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}

使用try(resource)可以保证InputStream正确关闭(JDK>=1.7)
java基础-廖雪峰

java.time提供了新的API(JDK>=1.8)
可以对日期和时间进行加减、调整、判断先后,计算Period
LocalDateTime没有时区信息,无法与long进行转换

创建新线程

  1. 从Thread派生
  2. 实现Runnable接口

中断线程
调用interrupt()方法可以中断一个线程
通过标志位判断需要正确使用volatile关键字

jvm规范了几种原子操作
1.基本类型(long和double除外)赋值:
int n=100;
2.引用类型赋值:
List list = anotherList;

局部变量在各个线程中是完全独立的 所以不需要同步
对JVM定的单个原子操作不需要同步

创建守护线程: setDaemon(true)
java基础-廖雪峰
java基础-廖雪峰
java基础-廖雪峰
ReentrantLock可以替代synchronized
ReentrantLock获取锁更安全
必须使用try … finally保证正确获取和释放锁
tryLock()可指定超时