众安保险数据开发工程师实习生招聘一面面经。同学门一定不要等准备好了再去面试。先投递简历进行面试,将每次被问到的问题都记录下来,可以发现自己成长非常快。祝好。给出了面试中遇到的问题。
1.自我介绍
自由发挥。
2.对什么编程语言最熟悉?
回答了 Java。从这个问题可以看出可以准备自己熟悉的语言,就算是数据研发也不一定是 Java。
3.对 Java 中如下代码的讨论
String s1 = "abc";
String s2 = new String("abc");
问题 1: s1 == s2 的结果是什么?
问题2: s2 = new String(“abc”)创建了几个对象?
解释:
不看上面的代码,我们有如下结论:
- 当使用 “=” 直接赋值时,字符串“abc”会被存储在常量池(String Pool)中,只有1份
- 若 “abc” 已经在常量池中,则创建 0 个对象,直接将引用赋值给s1
- 若 “abc” 不在常量池中,则创建 1 个对象,并将引用赋值给s1
- 当使用 new String(“abc”) 创建字符串时,JVM会先检索常量池中是否存在“abc”
- 若 “abc” 不在常量池中,则会在常量池中创建这个字符串,然后执行 new 操作,将 “abc“ 传入构造方法,在堆内存中创建一个存储“abc”的 String 对象,将对象的引用赋值给 s2,此过程创建了 2 个对象。
- 若 “abc” 已经在常量池中,则直接执行 new 操作,将 “abc“ 传入构造方法,在堆内存中创建一个存储“abc”的 String 对象,将对象的引用赋值给 s2,此过程创建了 1 个对象。
通过上面的分析可以得到答案:
- 问题 1 中 s1 执行 String Pool 中的 “abc”,而 s2 是在堆中创建的对象,因此答案是 false。
- 问题 2 中由于在创建 s1 时已经在常量池中创建了 “abc”,因此只会创建 1 个对象。
扩展:
当一个字符串调用 intern() 方法时,如果 String Pool 中已经存在一个字符串和该字符串值相等(使用 equals() 方法进行确定),那么就会返回 String Pool 中字符串的引用;否则,就会在 String Pool 中添加一个新的字符串,并返回这个新字符串的引用。例如如下代码:
String s1 = new String("aaa");
String s2 = new String("aaa");
System.out.println(s1 == s2); // false
String s3 = s1.intern();
String s4 = s2.intern();
System.out.println(s3 == s4); // true
4.Java 中对如下代码的输出是什么?
Integer a = 128;
Integer b = 128;
System.out.println(a == b);
答案: