一、 Java基础知识
1. 作用域public,,protected, private以及不写时的区别
作用域 当前类 同一package 子孙类 其他package
public √ √ √ √
protected √ √ √ ×
friendly √ √ × ×
private √ × × ×
不写时默认为friendly
2. HashMap和Hashtable的区别
HashMap 是不同步的,线程不安全; Hashtable是同步的,线程安全的。
HashMap 允许null 作为key或value;Hashtable不允许。
3. ArrayList和Vector的区别
ArrayList是不同步的,线程不安全;Vector是同步的,线程安全的。
当需要增长时, ArrayList默认增长原来的一半;Vector默认增长原来的一倍。
4. Collection 和 Collections的区别
Collection是集合类的接口,Set和List 继承于它;
Collections是集合类的一个帮助类,提供了一系列的静态方法,如对集合的搜索、排序等操作。
5. Compartor 接口和 Comparable接口的区别
Comparator是比较器,用来比较别人的,需要比较两个对象,所以是public int compare(Object, Object);
Comparable是自比较的,拿自己和别人比,所以是public int compareTo(Object);
对两个对象o1和o2进行比较,如果o1位于o2的前面,则返回负值,如果在排序顺序中认为o1和o2是相同的,返回0,如果o1位于o2的后面,则返回正值
用Comparator 是策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变它的行为。
strategy design pattern:Define a family of algorithms, encapsulate each one, and make them interchange. Strategy lets the algorithm very independently from clients that use it.
6. String和StringBuffer的区别
String 是final class,不可变;StringBuffer不是,可变。 多个字符串连接用StringBuffer的append方法。
7. int 和 Integer 的区别
int是基本数据类型(Primitive);Integer是int的包装类(Wrapper)。
Int一般用在数值计算中;Integer用在要使用对象的地方,如Map的Key与Value中, Set或List的Element中。JDK1.5 中会自动进行类型转换。
8. &和&&的区别
在两个运算符都能用在布尔运算中,
当使用&&运算符时, 如果第一表达式为假 , 就不再判断第二表达式的真假
当使用&运算符, 当第一表达式为假, 还是会去第二表达式
&也能用在位运算中。
9. final, finally, finalize的区别
final是修饰符。 当一个类被声明为final时,它就不能派生子类;当一个方法被声明为final时,它就不能被重写(override);当一个变量被声明为final时,它就不能被修改。
finally 异常处理时的finally块。
finalize 垃圾收集器在删除对象前调用的方法。
final的成员变量:
1.声明时直接赋值
2.声明时不赋值,在所有的构造方法中赋值。
注意点:
final的成员变量不会被自动初始化,即使被static 修饰。
final修饰引用类型的成员变量时,表示该引用的值不能改变,而不是该引用所指向对象的内容不能改变。
一个类不能既是abstract的又是final的。
如果我们将一个成员变量声明为final的,通常又将它设为static,目的是为了节省内存。
10. error和exception的区别
error 表示系统级的错误和程序无法处理的异常,如内存泄漏。
exception 表示需要捕捉或需要程序处理的异常。
Exception分类:
运行时异常:继承RuntimeException。(UnChecked Exception)
非运行时异常: 如IOException。(Checked Exception)
对于非运行时异常的两种处理方式:继续抛出或者 try catch
11. sleep() 和 wait() 的区别
sleep()是线程类Thread的方法,不释放对象锁,暂停指定时间后,到时就自动恢复。
wait()是Object类的方法,释放对象锁,只有这个对象发出notify或notifyAll方法,它才能重新获得对象锁进入运行状态。
12. Overloading和Overriding的区别
它们是java多态性的不同表现。
Overriding是父类和子类之间多态性的表现,如果子类中定义的方法与父类有相同的名称和参数和返回类型,就叫方法的重写 (Overriding);子类Overriding方法的visibility不能比父类低.
Overloading是同一个类中多态性的表现,如果一个类中定义了多个同名的方法,它们有不同的参数个数或不同的参数类型或不同的参数次序,就叫方法的重载(Overloading)。Overloading的方法是可以改变返回值的类型。
重写(override)的三个要点:
子类的方法名,返回值,参数类型必须完全一制。
子类抛出的异常不能超过父类。
子类的访问级别不能低于父类。
父类或接口类型的引用可以指向子类或实现该接口的类实现。
13. abstract class和interface的区别
interface中只能有static final的成员和抽象方法;abstract class 中除了必须有一个抽象方法,还可以有具体的方法,成员变量。
一个类只能extends 一个类,可以implements 多个interface。
interface表现的是一种规格;abstract class抽象出共性的东西,经常表现的是“is-a”的关系。
14.父类与子类的初始化先后顺序:静态先行。
父类的静态
子类的静态
父类的构造
子类的构造
15. 数组里存放的是对象的引用,而不是对象本身。
16. Java中的transient,是用于声明序列化的时候不被存储的。