本文参考多处,一并感谢!
1.short转换相关的
其一,
package com.jue.test;public class TestMain { public static void main(String args[]){ short s1 = 1; s1 = s1 + 1; }}
编译结果
DescriptionResourcePathLocationType
Type mismatch: cannot convert from int to short TestMain.java/TestShort/src/com/jue/testline 6Java Problem分析:
s1+1会自动转换成int类型,导致s1= s1+1;损失精度。
其二,
package com.jue.test;public class TestMain { public static void main(String args[]){ short s2 = 2; s2 += 2; }}
编译结果:成功
分析:
反编译之后
package com.jue.test;public class TestMain{ public static void main(String[] args) { short s2 = 2; s2 = (short)(s2 + 2); }}
故猜测:这可能是java编译器的语法糖。
2.RuntimeException与普通异常,error的区别。
Checked Exception:在编译时就能够被Java编译器所检测到的。
UncheckedException:则是编译时,java编译器不能检查到。
RuntimeException | 普通Exception | Error | |
受控异常 | 否 | 是 | 否 |
产生原因 | 开发者的编程错误 | 由于外界环境所限, 本身潜在的一些问题 | Java运行时的系统错误,资源耗尽,是一种严重的, 程序无法修复的问题 |
例子 | NullPointerExceptionArrayOutOfIndexExceptionClassCastExceptionArithmeticException UnsupportedOperationException | ClassNotFoundExceptionIOExceptionFileNotFoundException | VirtualMachineErrorStackOverflowErrorOutOfMemoryError |
3.finally的一个面试题
package com.jue.test;import java.util.ArrayList;import java.util.List;public class TestMain { public static void main(String[] args) { test(); } private static void test() { List list = new ArrayList(); try { System.out.println("return!!"); return; } catch (Exception e) { System.out.println("catch Exception !!"); } finally { System.out.println("finally!!"); } }}结果:
return!!
finally!!分析:即便在try中return;finally总会被执行的意义不变,仍然会执行。
4.final,finalize,finally的区别
final:关键字,表不变
修饰:
- 方法:方法不可Override
- 类:不可被继承
- 基本类型量:常量,值不可变
- 符合类型量:引用不可变,即引用的值不可变
final Object o1 = new Object();o1 = new Object();
finally:关键字,Java异常处理机制的一部分,在异常发生时,用来提供一个必要的清理的机会。
finalize:Object类的方法(参考自)
意义:Java技术允许使用finalize()方法在垃圾回收器将对象回收之前,做一些必要的清理操作。
调用前提:这个对象确定没有被引用到。
工作原理:
- 垃圾收集器准备好释放对象占用的空间。
- 首先调用其finalize方法。
- 下一次垃圾收集过程中,真正回收内存。
不确定性:
- finalize的执行时间是不缺定的。
- 一个对象引用另一个对象,并不能保证finalize的方法按照特定的执行顺序。
5.Override,Overload
Override Overload 签名+返回值 相同 方法名相同,签名不同 关系 父子类继承关系 通常是同一类层次中 识别 运行时多态 根据具体的对象, 查询对象的虚方法表,确定调用关系 编译时多态 由对象的外观类型(即声明类型)决定 修饰符限制 非private 非static 非final 无特别 异常关系 子类方法不能抛出被父类方法更多的异常 无特别 可见性关系 子类不能比父类访问权限更窄 (里氏替换原则决定) 无特别
6.Collection Collections
Collection:接口,集合类的接口,一个契约,提供了集合基本的大小,添加,清除,遍历方法等。
Collections:工具类,提供了很多静态方法,给集合提供一些查询,比较,排序,交换,线程安全化等方法。
7.Integer 缓存
package com.jue.test;public class TestMain { public static void main(String[] args) { Integer i1 = 1; Integer i11 = 1; System.out.println(i1 == i11); Integer i2 = 200; Integer i22 = 200; System.out.println(i2 == i22); }}结果 :
true
false
分析:反编译结果为
package com.jue.test;import java.io.PrintStream;public class TestMain{ public static void main(String[] args) { Integer i1 = Integer.valueOf(1); Integer i11 = Integer.valueOf(1); System.out.println(i1 == i11); Integer i2 = Integer.valueOf(200); Integer i22 = Integer.valueOf(200); System.out.println(i2 == i22); }}
可以看出,对于Integer i = 1;编译器做了额外的处理,即Integer.valueof();
Integer source code
public static Integer valueOf(int i) { assert IntegerCache.high >= 127; if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i);}
可以看出Integer对于一定 范围内的数字从Cache中取得,对于额外的,调用new创建。
IntegerCache源码如下:
private static class IntegerCache { static final int low = -128; static final int high; static final Integer cache[]; static { // high value may be configured by property int h = 127; String integerCacheHighPropValue = sun.misc.VM .getSavedProperty("java.lang.Integer.IntegerCache.high"); if (integerCacheHighPropValue != null) { int i = parseInt(integerCacheHighPropValue); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - (-low)); } high = h; cache = new Integer[(high - low) + 1]; int j = low; for (int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); } private IntegerCache() { }}故可以知道Integer的大小,默认是从-128到127,对于这个范围内的数组做了缓存的处理。
8.sleep方法和wait方法的区别
wait sleep 所属类 Object Thread 意义 让线程挂起 让线程休眠指定的时间 释放锁 是 否(这个跟锁本来就没有关系) 恢复 1.有参:wait指定时间 2.无参:等待其他线程notify 1.根据参数长度自动恢复。 2.异常打断 使用限制 wait,notify必须持有当前对象锁的情况下调用 无特别 抛出异常 否 是 静态方法 否 是