博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java android面试题分析总结
阅读量:5341 次
发布时间:2019-06-15

本文共 4261 字,大约阅读时间需要 14 分钟。

本文参考多处,一并感谢!

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运行时的系统错误,资源耗尽,是一种严重的,
程序无法修复的问题
例子 NullPointerException
ArrayOutOfIndexException
ClassCastException
ArithmeticException
UnsupportedOperationException
ClassNotFoundException
IOException
FileNotFoundException
VirtualMachineError
StackOverflowError
OutOfMemoryError

 

 

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必须持有当前对象锁的情况下调用 无特别
抛出异常
静态方法

 

 

 

转载于:https://www.cnblogs.com/dyllove98/p/3149516.html

你可能感兴趣的文章
MySQL添加、修改、撤销用户数据库操作权限的一些记录
查看>>
ViewBag & ViewData
查看>>
关于谷歌浏览器Chrome正在处理请求的问题解决
查看>>
Git核心技术:在Ubuntu下部署Gitolite服务端
查看>>
平面波展开法总结
查看>>
建造者模式
查看>>
ArraySort--冒泡排序、选择排序、插入排序工具类demo
查看>>
composer 安装laravel
查看>>
8-EasyNetQ之Send & Receive
查看>>
Android反编译教程
查看>>
java重写LinkedList
查看>>
zTree节点重叠或者遮挡
查看>>
List<string> 去重复 并且出现次数最多的排前面
查看>>
js日志管理-log4javascript学习小结
查看>>
Android之布局androidmanifest.xml 资源清单 概述
查看>>
How to Find Research Problems
查看>>
Linux用户管理
查看>>
数据库第1,2,3范式学习
查看>>
《Linux内核设计与实现》第四章学习笔记
查看>>
使用iperf测试网络性能
查看>>