我原本是一个医学生,但出于很多考虑,我决定转行程序员。相信应该也有蛮多人和我一样,在为自己喜欢的事业奋斗着。突发奇想,想记录下每天一点自己在为Java面试所作的准备,记录下自己觉得值得记录的题目。这是一个系列,我会一直坚持下去。
1. 接口和抽象类的区别。

2. 方法重写和重载的区别:
1)方法重载:是指在同一个类中,有同名的方法,但它们的参数个数,类型,顺序不同,即参数列表不同,与返回值,修饰符无关;
2)方法重写:是指子类和父类有相同的方法,包括返回值类型,方法名和参数列表都相同,但子类的方法访问权限必须大于或者等于父类,即三同一不同。子类进行方法重写可以扩展父类的方法,或者添加子类自身特殊的功能。用@Override进行标识。重写只能针对父类实例方法,对于与父类相同的静态方法,称之为隐藏。
3. string及如Integer等包装类是不可变对象
这些对象一旦创建,状态变不可改变,任何的修改都会创建一个新对象。出于性能优化的考虑,要谨慎使用这些对象,尤其是需要进行修改的时候。但同时,由于这些对象的天生的不可变性,让它们在进行并发编程的时候有着天然的优势。如果实在是需要对这些不可变对象进行“真正意义上”的修改,可以利用反射机制对其修改。
4. 对于clone的理解
clone,顾名思义,是复制的意思,是创建一个对象的方式之一。过程:调用clone方法时,先分配一个与源对象大小一致的内存空间,再使用源对象对应的各个域对新对象进行填充,完成后,方法返回,并把这个新对象的引用发布到外部。
5. 浅拷贝和深拷贝。
object类默认的clone方法,对于一个包含其他对象引用的对象来说,其实是一种浅拷贝。因为此时对这个对象进行clone,只会创建一个新的这个对象,但其内部的其他对象的引用还是指向原来的对象。因此,要对其深拷贝的话,必须实现cloneable接口重写clone方法。以此类推,如果一个对象包含多层其他对象的引用,必须把每一层对象都进行拷贝,才能有彻底的深拷贝。这也是比较繁琐的。
6. string的intern()方法
该方法首先从常量池中查找是否存在该值,如果存在则直接返回,如果不存在则在常量池中创建同一该对象并返回。
7. 强引用、软引用、弱引用和虚引用的区别
强引用:如果一个对象具有强引用,它就不会被垃圾回收器回收,即使不惜抛出OutOfMemoryError错误。如果想中断对象和强引用的联系,可以显式的讲该引用赋值为null,jvm会对其进行回收。
软引用:具有软引用时,如果内存空间足够,就能继续使用而不会被回收。只有内存不足时才会回收软引用。
弱引用:具有弱引用的对象具有更短的生命周期。jvm进行垃圾回收,一旦发现弱引用对象,无论内存充足与否都会将其回收。但jvm是一个优先级较低的进程,也不一定能迅速发现弱引用对象。
虚引用:相当于没引用,在任何时候都有可能被回收。
8. Java中的“==”和‘equal()’,‘equal()’和hashcode()的区别
1) "=="是运算符,用于比较两个变量是否相等,equals()是object的方法,默认用于比较对象是否相等,即对象的地址是否相等。那么说,如果比较的是基本数据类型,“==”是比较他们值是否相等。而对象用“==”比较时,是比较他们的内容是否相等,而用equals时时比较的内存地址。如果需要比较对象内容,则需要重写该方法。
2)hashcode()方法是返回一个哈希值,equals方法是比较两个对象地址是否相等,如果equals方法返回相等,那么他们的哈希值也一定相等。但是,equals比较不想等,那么他们的hashcode返回值就不好说了,可等可不相等。两者常用于集合类,向集合添加对象时,先判断二者产生的hashcode是否存在,若有,则不放入集合,否则直接放入集合。如果hashcode相等,然后通过equals方法判断要放入的对象和集合的对象是否相等,不相等则放入,否则不放入。
9. b+=a 和 b = a+b的区别
+=操作符会在运算时进行隐式自动类型转换,将加操作的结果强制转换为持有结果的类型。而b=a+b不会自动进行转换。
10. final, finalize和finally的不同之处
1)final 是一个修饰符,可以修饰变量、方法和类。如果 final 修饰变量,意味着该变量的值在初始化后不能被改变。
2)finalize 方法是在对象被回收之前调用的方法,给对象自己最后一个复活的机会,但是什么时候调用 finalize 没有保证。
3)finally 是一个关键字,与 try 和 catch 一起用于异常的处理。finally 块一定会被执行,无论在 try 块中是否有发生异常。
11. final有哪些用法?
1)被final修饰的类不可被继承;
2)被final修饰的方法不可被重写;
3)被final修饰的变量不可被改变。但如果修饰引用,则表示引用不可变,但引用指向的内容可变;
4)被final修饰的方法,JVM会尝试将其内联,提高运行效率;
5)被final修饰的常量,在编译阶段会被存入常量池;
6)一个final域修饰的变量的引用,在将它赋值给一个引用变量时应该要在构造函数对其写入之后;
7)初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。