• java android面试题分析总结


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

    http://www.blogjava.net/fanyingjie/archive/2007/06/27/126467.aspx

    http://baike.baidu.com/view/1788559.htm

    http://honda418.iteye.com/blog/315893

    http://jeff-tang.blog.163.com/blog/static/141686909201022010522906/

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




  • 相关阅读:
    Leetcode 15 3Sum
    Leetcode 383 Ransom Note
    用i个点组成高度为不超过j的二叉树的数量。
    配对问题 小于10 1.3.5
    字符矩阵的旋转 镜面对称 1.2.2
    字符串统计 连续的某个字符的数量 1.1.4
    USACO twofive 没理解
    1002 All Roads Lead to Rome
    USACO 5.5.1 求矩形并的周长
    USACO 5.5.2 字符串的最小表示法
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3149516.html
Copyright © 2020-2023  润新知