事情的经过是我在Boss上面接到一个线上面试,问我会不会多线程,我肯定回答会啊,然后Hr呢发了几道题要我十分钟做完,我想都没想就答应了。当他把提发来,我躺在床上打开了AI智能问答,不到两分钟就给出答案,心想,这下稳了。后面告诉我三道错了错了两个地方,本次就不面试了。。。。。。,我心里一万个草泥马在奔腾,于是我仔细看了题目,确实是错了,看下具体情况。
具体题目入下
第一题(Ai回答错)
package com.jpa.service;
/**
* @Author: zqf
* @Date: 2024/03/22/9:56
* @Description:
*/
public class Test {
static class A {
public void method() {
System.out.println("A");
}
}
static class B extends A {
public void method() {
System.out.println("B");
}
}
public static void main(String[] args) {
A a = new A();
B b = new B();
((A) b).method();
}
}
AI回答
正确解读
:
在A类中,method方法打印出"A";在B类中,method方法打印出"B"。由于B类继承自A类,并且重写了method方法,所以当调用((A) b).method()时,实际上调用的是B类中的method方法,输出结果为"B"
第二题
public class Test2 {
// 这个方法没有实现交换a和b的值
static void exchange(int a, int b) {
int temp = a;
a = b;
b = temp;
}
public static void main(String[] args) {
int a = 1;
int b = 2;
Test2 t = new Test2();
t.exchange(a, b);
System.out.println(a);
}
}
AI回答(正确)
解析
这段代码中的exchange方法没有实现交换a和b的值的功能。在Java中,方法参数传递的是值的副本,而不是变量本身。所以在exchange方法中交换a和b的值并不会影响到main方法中的a和b的值。
虽然引用传递中传递的是对象的引用,但并不意味着可以修改对象的引用本身。也就是说,在方法内部将形参指向一个新的对象,并不会改变原始对象的引用。
第三题(Ai回答有错误)
package com.jpa.service;
public class Test {
static String str1 = "Hello";
static String str2 = new String("Hello");
static String str3 = "Hello";
static String str4 = new String(str3);
public static void main(String[] args) {
System.out.println(str1 == str2);
System.out.println(str1 == str3);
System.out.println(str2 == "Hello");
System.out.println(str3 == str4);
}
AI回答
解析
实际执行结果:
如果是采用双引号引起来的字符串常量,首先会到常量池中去查找,如果存在就不再分配,如果不存在就分配,常量池中的数据是在编译期赋值的,也就是生成 class 文件时就把它放到常量池里了,所以 str1和 str3都指向常量池中的同一个字符串“Hello”。
关于 str2,str2采用的是 new 的方式,在 new 的时候存在双引号,所以他会到常量区中查找“Hello”,而常量区中存在“Hello”,所以常量区中将不再放置字符串,而 new 关键子会在堆中分配内存,所以在堆中会创建一个对象 Hello,str2会指向 Hello。
如果比较 str1 和 str2 的值必须采用 equals,String 已经对 eqauls 方法进行了覆盖。
经典面试题
String s1 = new String(“hello”) ;
String s2 = new String(“hello”) ;
以上代码创建了几个对象?
分析:
通过以上分析,大家会看到创建了 3 个对象,堆区中 2 个,常量池中 1 一个
通过以上分析,使用 String 时,不建议使用 new 关键字,因为使用 new 会创建两个对象
记住:堆区中是运行期分配的,常量池中是编译器分配的。
总结
AI在代码分析时,还是存在一定的不确定性,需要经过漫长的深度学习和训练,我们在编码时还不能完全依赖Ai给出的答案,只能作为参考,本次面试就是自己偷懒导致的后果,不过在学习AI的路上,还任重而道远。