String、StringBuffer、StringBuilder区别
1)三者底层都采用char[] value 存储值;String被设计为不可变,另两个可变
2)StringBuffer和StringBuilder都继承自AbsractStringBuilder,使用int count来维护存储的字符串长度;StringBuffer使用synchronized的方式保证线程安全;且维护了一个char[] toStringCache;
3)后两者使用时,通常需要设置容量,默认16,扩容方式是翻倍与所需最小值取小
HashMap与HashTable区别
1)HashTable是基于Dictionary类的,HashMap是Map接口的一个实现。
2)HashTable的方法是同步的,HashMap的方法是不同步的。
3)HashMap的key最多有一个为null,值可以有多个为null;HashTable的key和value均不允许为空。
注:Collection类的静态的synchronizedMap()方法,可以创建一个线程安全的Map对象。
final关键字详解
final修饰类不能被继承,修饰方法不能被重写但是能被重载,修饰变量不能被修改。
注:修饰引用变量,是地址不能变,地址中的内容可以变。final初始化成员变量的位置
1)非静态成员变量:定义时、构造器中、非静态代码块中
2)静态成员变量:定义时、静态代码块中
static关键字详解
1)static修饰方法不用实例化可直接通过类名去调用
2)修饰属性不用实例化可直接通过类名调用,所有实例及类本身公用一份且存储在数据存储区
3)修饰代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块。
4)static修饰内部类,则此内部类可以当做一个普通类来使用,而不用先实例其外部类。
5)静态导入,导入类时:import static 包名.类名.*; 将类的静态方法导入进来,使用这些静态方法的时候不用类名去调用,直接调用即可。
注:1)java中static不能修饰方法中的变量。
2)普通类不能用static修饰。
抽象类与接口区别
1)继承抽象类只能是单继承,继承接口可以实现多继承;
2)抽象类中的方法要用abstract修饰,public或者protected的,不能用final或static修饰;接口中的方法只能是public的;
3)抽象类中的属性可以跟正常类中的属性有一样的修饰符,接口中的属性只能是public static final的。
注:继承抽象类或接口时,只要将子类声明为抽象类并将对应的方法声明为抽象方法则可以不用在子类中提供具体实现。