基础知识-Java 语法

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
2
3
4
5
6
7
8
9
10
11

String str1 = "a";
String str2 = "b";
String str3 = "ab";
String str4 = str1 + str2;
String str5 = new String("ab");

System.out.println(str5.equals(str3)); // true
System.out.println(str5 == str3); // false
System.out.println(str5.intern() == str3); // true: str3 是直接声明的,进入字符串池
System.out.println(str5.intern() == str4); // false: str5 是 new 声明的,不进入字符串池
如需转载,请注明出处