1:枚举

1-1:enum 线程安全

因为枚举类的实例都是静态常量,而静态属性都是在类加载之后就初始化。当一个 Java 类第一次被真正使用到的时候静态资源被初始化、Java 类的加载和初始化过程都是线程安全的。所以,创建一个 enum 类型是线程安全的。

1-2: switch 是否可用于 String 类型的判断

可以,实际上会将 String 转为 hashcode,再通过 equals 判断是否相等。

2:时间类

2-1:SimpDateFormat 是线程不安全的类,如何改为线程安全

因为 SimpDateFormat 内部有一个 Calendar 类的引用,多线程或者设为静态属性会共用这个引用,导致处理时会出现错误。

  1. 加锁
  2. 使用 ThreadLocal
  3. DateUtils
  4. 使用 jdk1.8 的 DateTimeFormatter 代替。

3:Object 类

3-1:Object 类有哪些方法

  1. getClass()
  2. hashCode()
  3. equals()
  4. clone()
  5. toString()
  6. notify()
  7. notifyAll()
  8. wait()
  9. finalize()

3-1-1:XX.toString 和 String.valueOf()

将对象转为字符串常用三种方法:(String) xxx, xxx.toString(), String.valueOf(xxx)

  1. (String) :强制转换,将 object 转成 String 类型的值。使用这种方法时,需要注意的是类型必须能转成 String 类型。否则容易抛出 CalssCastException 异常
  2. toString() :在使用时要注意,必须保证转换的对象不是 null 值,否则将抛出 NullPointerException 异常。采用这种方法时,通常派生类会覆盖 Object 里的 toString()方法。
  3. String.valueOf() :String 的静态方法,避免了前两个的不足和缺点。在内部加了非空判断,不会抛出空指针异常,但是需要注意:对象为 null 时,会转换成字符串”null”,而不是 null !
1
2
3
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}

3-1-2:为什么操作线程方法在 Object 对象中

因为这些方法在操作同步线程时,都必须要标识它们操作线程的锁,只有同一个锁上的被等待线程,可以被同一个锁上的 notify 唤醒,不可以对不同锁中的线程进行唤醒。