毕业入职第一个比较大的任务,就是和组内另一个校招生一起,出一套关于Java编码规范的试题。有机会为难一下这些大厂老鸟也是一件挺酷的事。当然,我们的主旨肯定不是说,故意找一些冷门知识,企图把大家难倒,这种偏难怪的题是我们作为学生所不屑的。这里把几个有意思的题分享出来。
void test() throws ParseException { SimpleDateFormat yearOfEra = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat weekBasedYear = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss"); String date = "2021-12-31 10:10:10"; Date result = yearOfEra.parse(date); String newDate = weekBasedYear.format(result); log.info("newDate: {}",newDate); }
上面这段代码中newDate结果是多少? (单选)
A. "2021-12-31 10:10:10"
B. "2022-12-31 10:10:10"
C. "2020-12-31 10:10:10”
关于数字类型的计算原则,下列说法正确的是 (不定项)
A. quotient的值为3.0f
float quotient = (float)10/3;
B. prod的值溢出
int a = Integer.MAX_VALUE; long prod = (long)a*2;
C. bar < 0
int foo = -10; int bar = foo % 3;
D. res < 0
int foo = Integer.MIN_VALUE; int res = Math.abs(foo);
下列代码的运行结果为 (单选)
public class ReturnStatementInFinallyBlockTest { public static void main(String[] args) { System.out.println(getReturnValue()); } public static int getReturnValue() { try { System.out.print("A"); return 1; } finally { System.out.print("C"); return 2; } } }
A. A1
B. A1C
C. A1C2
D. AC2
第11行代码调用的方法是hello(List list)。 T/F ?
class A { void hello(List list); void hello(ArrayList arrayList); } List arrayList = new ArrayList(); a.hello(arrayList);
执行完以下三元运算符后,会在控制台打印b的值: null。 T/F ?
Boolean a = null; Boolean b = true ? a : false; System.out.println(b);
下列代码可以编译通过。 T/F ?
public class Test { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("ab"); foo(list); } public static void foo(List<Object> list) { •••••• } }
参考答案
1.时期格式化
void test() throws ParseException { SimpleDateFormat yearOfEra = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat weekBasedYear = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss"); String date = "2021-12-31 10:10:10"; Date result = yearOfEra.parse(date); String newDate = weekBasedYear.format(result); log.info("newDate: {}",newDate); }
上面这段代码中newDate结果是多少? B
A. "2021-12-31 10:10:10"
B. "2022-12-31 10:10:10"
C. "2020-12-31 10:10:10”
Java 日期格式化规范 参考 尤其注意YYYY是week based year。日期格式化时,yyyy 表示当天所在的年,而大写的 YYYY 代表是 week in which year(JDK7 之后引入的概念), 意思是当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,返回的 YYYY 就是下一年。
2.数值计算
关于数字类型的计算原则,下列说法正确的是? CD
A. quotient的值为3.0f
float quotient = (float)10/3;
B. prod的值溢出
int a = Integer.MAX_VALUE; long prod = (long)a*2;
C. bar < 0
int foo = -10; int bar = foo % 3;
D. res < 0
int foo = Integer.MIN_VALUE; int res = Math.abs(foo);
可能会导致溢出和精度丢失的操作应该先转型, 另外转型(cast)优先级高于算术运算
3.try-catch块
下列代码的运行结果为 D
public class ReturnStatementInFinallyBlockTest { public static void main(String[] args) { System.out.println(getReturnValue()); } public static int getReturnValue() { try { System.out.print("A"); return 1; } finally { System.out.print("C"); return 2; } } }
A. A1
B. A1C
C. A1C2
D. AC2
如果try中有return语句,finally中也有return语句,最终执行的是finally中的return语句
4.重载规范
第11行代码调用的方法是hello(List list)。 T
class A { void hello(List list); void hello(ArrayList arrayList); } List arrayList = new ArrayList(); a.hello(arrayList);
不能使用有继承关系的参数类型来重载方法。因为方法重载的参数类型是根据编译时表面类型匹配的,不根据运行时的实际类型匹配。因此代码中调用的是hello(List list),因为arrayList的定义类型是List
5.三元表达式 ?:
执行完以下三元运算符后,会在控制台打印b的值: null。 F
Boolean a = null; Boolean b = true ? a : false; System.out.println(b);
三目运算符 condition ? 表达式 1:表达式 2 中,高度注意表达式 1 和 2 在类型对齐时,可能抛出因自动拆箱导致的 NPE 异常。说明:以下两种场景会触发类型对齐的拆箱操作: 1)表达式 1 或 表达式 2 的值只要有一个是原始类型。 2)表达式 1 或 表达式 2 的值的类型不一致,会强制拆箱升级成表示范围更大的那个类型。
6.范型
下列代码可以编译通过。 F
public class Test { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("ab"); foo(list); } public static void foo(List<Object> list) { •••••• } }
按照大家对Java伪范型的理解,大概率会认为这里是可以通过编译的。JVM确实允许这么做,但是javac(Java编译器)不允许。而同样使用JVM的Groovy是允许这样操作的,当然它属于弱类型的动态语言。