Q:Transient 作用
A:1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问
2)transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口
3)一个静态变量不管是否被transient修饰,均不能被序列化
4)若实现的是Externalizable接口,则没有任何东西可以自动序列化,需要在writeExternal方法中进行手工指定所要序列化的变量,这与是否被transient修饰无关
Q:接口和抽象类的区别
A:抽象类:
1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。
2)抽象类不能用来创建对象;
3)如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类
接口:
1)接口中的变量会被隐式地指定为public static final变量
2)方法会被隐式地指定为public abstract方法且只能是public abstract方法
继承是一个 “是不是”的关系,而 接口 实现则是 “有没有”的关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口
Q:serialVersionUID 作用
A:Java 的序列化机制是通过在运行时判断类的 serialVersionUID 来验证版本一致性的。在进行反序列化时,JVM 会把传来的字节流中的serialVersionUID 与本地相应实体(类)的 serialVersionUID 进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。(InvalidCastException)
1)两端不一致,无法序列化
2)两端一致,增的字段会序列化成默认值
3)两端一致,减的字段会序列化丢失
Q:多线程相关
A:
1) 并行:多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时;并发:通过cpu调度算法,让用户看上去同时执行,实际上从cpu操作层面不是真正的同时
2)线程安全:代码在多线程中使用,线程的调度顺序不影响结果
3)线程状态:NEW,RUNNABLE,WAITING,BLOCKED,TERMINATED,TIMED_WAITING

4)sleep 和 wait 区别:前者不会释放锁,后者会
5)三种线程实现方式:Thread,Runnable,Callable(Future),后者可以返回线程执行结果
6)容器类:BlockingQueue、ConcurrentHashMap
7)ConcurrentHashMap 是用 lock 实现并发(锁的方式是稍微细粒度的。将hash表分为16个桶(默认值),诸如get, put, remove等常用操作只锁当前需要用到的桶)而 HashTable 是用 synchronized 实现并发(对整个集合加锁,加锁期间集合不可访问)
Q:String 类是不可变的吗
A:从语法上来讲,是的,因为 String 类是用 final 修饰的,绝对吗?不绝对,因为可以用 UnSafe 来修改 String 值;多个相同值的 String,可以用 intern() 来返回存储在字符串池的值,需要注意:采用new 创建的字符串对象不进入字符串池,见以下代码
1 |
|