JDK版本变化
- Java5:自动装拆箱,枚举,可变参数(String…),泛型,for-each,注解
- Java6:JDBC4.0,通用的注解
- Java7:泛型实例化的自动推断,try-with-resouces
- Java8:default方法,lambda表达式,Stream类,function接口,日期API(Clock,Timezones,LocalTime,LocalDate),多重注解,函数引用
Object方法
- wait()
- notify(), notifyAll()
- equals(), hashCode()
- getClass()
- clone()
- toString()
- finalize()
== 与 equals()的区别
- 基本类型==比较相等性
- 引用类型==比较是否是同一个对象
- equals()可以自己实现,不重写的话和==一样
equals() 与 hashCode() 的关系
- 覆盖equals方法时总要覆盖hashCode方法
- 两个对象根据equals方法返回true,那么这两个对象调用hashCode的值必须相等
- 但两个对象根据equals方法返回false,那么这两个对象调用hashCode的值不一定相等,但是最好不相等。
异常与错误的关系与区别
- Execption与Error都实现了Throwable接口
- 主要分为受检的异常,运行时异常,错误
- 受检的异常会希望用户处理这种异常,或传播出去,如Java.lang.ClassNotFoundException,Java.lang.NoSuchMetodException
- 运行时异常表明编程错误,如Java.lang.ArrayIndexOutOfBoundsException,Java.lang.IllegalArgumentException,Java.lang.ArithmeticException,Java.lang.NullPointerException
- 错误一般被JVM作为保留,不要自己继承。自己继承自RuntimeException
final,finally,finalize
- final域:永不改变的编译时常量或不希望被改变的初始化值,类初始化阶段要有确定的值,也可以在构造函数中赋值。
- final方法参数:无法在方法中改变参数引用所指向的对象
- final方法:禁止子类修改这个方法。(所有private方法隐含final)
- final类:禁止继承这个类
- finally:在try-catch中用于抛出异常时也可以顺利的关闭一些资源连接
- finalize: Object的一个方法,在对象被回收之前执行。
String,StringBuilder,StringBuffer
- String: final类,内部有一个value[], 用+拼接的过程:ClassLoader.loadClass(StringBuilder)
- StringBuffer与StringBuilder都是继承于AbstractStringBuilder
- StringBuffer线程安全,StringBuilder线程不安全,但单线程的效率上StringBuilder比较高。
序列化与反序列化
- 实现Serializable接口,并声明一个long类型的私有常量,serialVersionUID
- transient申明的属性,在序列化时不会保存,如对象的密码属性
- 有时将数据格式转换为json也是一种很好的做法
public class User implements Serializable {
private static final long serialVersionUID = 49494133484133L;
private String name;
private transient String pwd;
//省略getter和setter
}
public static void serial(Object obj,String filename){
try (
ObjectOutputStream outputStream = new ObjectOutputStream(
new FileOutputStream(filename));
){
outputStream.writeObject(obj);
} catch (IOException e) {
e.printStackTrace();
}
}
public static Object unSerial(String filename){
Object obj = null;
try (
ObjectInputStream inputStream = new ObjectInputStream(
new FileInputStream(filename));
){
obj = inputStream.readObject();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return obj;
}
public static void main(String[] args) throws IOException {
String filename = "F://obj.txt";
User user = new User("Owen","123456");
serial(user,filename);
User serialUser = (User) unSerial(filename);
System.out.println(user.getName()); //输出Owen
System.out.println(user.getPwd()); //输出null,因为被transient修饰
}
泛型的super和extends
面向对象
继承(组合),封装,多态,抽象
try…finally的try里面有return会执行finally吗?会!先执行finally再return
对象的强、软、弱和虚引用
- ### 强引用:强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。
Object obj = new Object();
- ### 软引用:描述一些还有用但并非必需的对象.如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。如浏览器的浏览页面。
//软引用
SoftReference<User>softReference=new SoftReference<User>(new User());
strangeReference=softReference.get();//通过get方法获得强引用
- ### 弱引用:弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。WeakReference
public class ReferenceTest{
public static void main(String... args){
String str = new String("哈哈哈哈");
WeakReference wr = new WeakReference(str); //创建一个弱引用
str = null; //切断强引用
System.out.println(wr.get()); //输出:哈哈哈哈
System.gc(); //强制垃圾回收
System.runFinalization(); //方法运行的任何待最后确定的对象的终止方法。
System.out.println(wr.get()); //输出null
}
}
- ### 虚引用:顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。PhantomReference