解答H大的公布的 10 道 Java 测试题

2020-04-24  

package constxiong.interview;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

/**
 * 解答阿里的十道题
 * @author ConstXiong
 * @date 2020-04-24 09:29:51
 */
public class TestAli10Questions {
	
	public static void main(String[] args) {
		t1();
		t2();
		t3();
		t4();
		t5();
		t7();
//		t8();
//		t9();
		t10();
	}
	
	/**
	 * float a = 0.125f; double b = 0.125d; System.out.println((a - b) == 0.0); 代码的输出结果是什么?
	 * A. true
	 * B. false
	 * 
	 * 答案:A
	 */
	private static void t1() {
		float a = 0.125f;
		double b = 0.125d;
		System.out.println((a - b) == 0.0);
	}
	
	/**
	 * double c = 0.8; double d = 0.7; double e = 0.6; 那么 c-d 与 d-e 是否相等?
	 * A. true
	 * B. false
	 * 
	 * 答案:B
	 */
	private static void t2() {
		double c = 0.8;
		double d = 0.7;
		double e = 0.6;
		System.out.println(c-d == d-e);
	}
	
	/**
	 * System.out.println(1.0 / 0); 的结果是什么?
	 * A. 抛出异常
	 * B. Infinity
	 * C. NaN
	 * 
	 * 答案:B
	 */
	private static void t3() {
		System.out.println(1.0 / 0);
	}
	
	/**
	 * System.out.println(0.0 / 0.0); 的结果是什么?
	 * A. 抛出异常
	 * B. Infinity
	 * C. NaN
	 * D. 1.0
	 * 
	 * 答案:C
	 */
	private static void t4() {
		System.out.println(0.0 / 0.0);
	}
	
	/**
	 * >> 和 >>> 的区别是?
	 * A. 任何整数没有区别
	 * B. 负整数一定没有区别
	 * C. 浮点数可以 >> 运算,但是不可以 >>> 运算
	 * D. 正整数一定没有区别
	 * 
	 * 分析:A 肯定不正确; >>> 是无符号右移,负数经过 >>> 后,变为正数,B 不正确; C 编译出错; D 正解
	 * 答案:D 
	 */
	private static void t5() {
		float f = -1.1f;
		System.out.println( -8 >>> 1);
//		f >> 1; //Syntax error on token ">>", invalid AssignmentOperator
//		f >>> 1;//Syntax error on token ">>>", >>>= expected
		int i = 10;
		System.out.println(i >> 10);
		System.out.println(i >>> 10);
	}
	
	/**
	 * 某个类有两个重载方法:void f(String s) 和 void f(Integer i),那么 f(null) 的会调用哪个方法?
	 * A. 前者
	 * B. 后者
	 * C. 随机调用
	 * D. 编译出错
	 * 
	 * 直接传 null,编译器无法根据字段类型辨别调用哪个方法;改为 String s = null 或 Integer i = null 可以
	 * 答案:D
	 */
	private static void t6() {
		TestAli10Questions test = new TestAli10Questions();
//		test.f(null);//编译报错 The method f(String) is ambiguous for the type TestAli10Questions
		String s = null;
		Integer i = null;
		test.f(s);
		test.f(i);
	}
	
	/**
	 * 某个类有两个重载方法:void g(double d) 和 void g(Integer i),那么 g(1) 的会调用哪个方法?
	 * A. 前者
	 * B. 后者
	 * C. 随机调用
	 * D. 编译出错
	 * 
	 * 答案:A
	 */
	private static void t7() {
		TestAli10Questions test = new TestAli10Questions();
		test.g(1);
	}
	
	/**
	 * String a = null; switch(a) 匹配 case 中的哪一项?
	 * A. null
	 * B. "null"
	 * C. 不与任何东西匹配,但不抛出异常
	 * D. 直接抛出异常
	 * 
	 * 分析:抛出Exception in thread "main" java.lang.NullPointerException
	 * 答案:D
	 */
	private static void t8() {
		String a = null; 
		switch(a) {
			case "null" :
				System.out.println(a);
				break;
		}
	}
	
	/**
	 * <String, T, Alibaba> String get(String string, T t) { return string; } 此方法:
	 * A. 编译错误,从左往右第一个 String 处
	 * B. 编译错误,T 处
	 * C. 编译错误,Alibaba 处
	 * D. 编译正确
	 * 
	 * 答案:D
	 */
	private static void t9() {
	}
	
	/**
	 * HashMap 初始容量 10000 即 new HashMap(10000),当往里 put 10000 个元素时,需要 resize 几次(初始化的那次不算)?
	 * A. 1 次
	 * B. 2 次
	 * C. 3 次
	 * D. 0 次
	 * 
	 * 分析:初始化:HashMap 构造方法只会调用 tableSizeFor(initialCapacity) 方法,不会调用 resize() 方法, threshold=16384 table=null;
	 *     第一次 put 时:调用resize()方法,threshold=12288 table=HashMap.Node[16384]
	 *     之后的put不会进行扩容
	 * 答案:A
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	private static void t10() {
		Map map = new HashMap(10000);
		printMapCapacity(map);
		for (int i = 0; i < 10000; i++) {
			map.put(i, i);
//			printMapCapacity(map);
		}
		printMapCapacity(map);
	}
	
	/**
	 * 打印map信息
	 * @param map
	 */
	private static void printMapCapacity(Map map) {
		Class<? extends Map> clazz = map.getClass();
		try {
			Field thresholdFeild = clazz.getDeclaredField("threshold");
			Field modCountFeild = clazz.getDeclaredField("modCount");
			Field tableFeild = clazz.getDeclaredField("table");
			thresholdFeild.setAccessible(true);
			modCountFeild.setAccessible(true);
			System.out.println("threshold:" + thresholdFeild.get(map));
			System.out.println("modCount:" + modCountFeild.get(map));
		} catch(Exception e) {
			e.printStackTrace();
		}
		
	}
	
	void f(String s) {
	}
	
	void f(Integer i) {
	}
	
	void g(double d) {
		System.out.println("param is double");
	}
	
	void g(Integer d) {
		System.out.println("param is Integer");
	}

	<String, T, Alibaba> String get(String string, T t) {
		return string;
	}
	
}

 

打印结果:

true
false
Infinity
NaN
2147483644
0
0
param is double
threshold:16384
modCount:0
threshold:12288
modCount:10000

 

PS:

  • 这 10 道题,不借助 IDE 调试,能答对到 8 道以上,基本算大神级别了...
  • 解题使用 JDK  1.8.0_141-b15,不同版本的 JDK,可能不会完全相同

 

ConstXiong 备案号:苏ICP备16009629号-3