1:枚举
1-1:enum 线程安全
因为枚举类的实例都是静态常量,而静态属性都是在类加载之后就初始化。当一个 Java 类第一次被真正使用到的时候静态资源被初始化、Java 类的加载和初始化过程都是线程安全的。所以,创建一个 enum 类型是线程安全的。
1-2: switch 是否可用于 String 类型的判断
可以,实际上会将 String 转为 hashcode,再通过 equals 判断是否相等。
2:时间类
2-1:SimpDateFormat 是线程不安全的类,如何改为线程安全
因为 SimpDateFormat 内部有一个 Calendar 类的引用,多线程或者设为静态属性会共用这个引用,导致处理时会出现错误。
- 加锁
- 使用 ThreadLocal
- DateUtils
- 使用 jdk1.8 的 DateTimeFormatter 代替。
3:Object 类
3-1:Object 类有哪些方法
- getClass()
- hashCode()
- equals()
- clone()
- toString()
- notify()
- notifyAll()
- wait()
- finalize()
3-1-1:XX.toString 和 String.valueOf()
将对象转为字符串常用三种方法:(String) xxx, xxx.toString(), String.valueOf(xxx)
- (String) :强制转换,将 object 转成 String 类型的值。使用这种方法时,需要注意的是类型必须能转成 String 类型。否则容易抛出 CalssCastException 异常
- toString() :在使用时要注意,必须保证转换的对象不是 null 值,否则将抛出 NullPointerException 异常。采用这种方法时,通常派生类会覆盖 Object 里的 toString()方法。
- String.valueOf() :String 的静态方法,避免了前两个的不足和缺点。在内部加了非空判断,不会抛出空指针异常,但是需要注意:对象为 null 时,会转换成字符串”null”,而不是 null !。
1 | public static String valueOf(Object obj) { |
3-1-2:为什么操作线程方法在 Object 对象中
因为这些方法在操作同步线程时,都必须要标识它们操作线程的锁,只有同一个锁上的被等待线程,可以被同一个锁上的 notify 唤醒,不可以对不同锁中的线程进行唤醒。