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:
ConstXiong 备案号:苏ICP备16009629号-3