0
点赞
收藏
分享

微信扫一扫

面试官问你是true还是false你可以最后反问他这个


我们常常看到一些用==号判断是true还是false的面试题,今天就列出来几个,看看到底是true还是false,原因是什么。

String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);

答:true,因为"abc"是一个常量,所以首先会去常量池中判断(equals)有没有值"abc"的对象,如果没有会在常量池中创建一个,并返回该对象的引用,如果有,就直接返回该对象的引用,这里会创建一个"abc"对象,然后返回该对象的引用,这样也就创建了我们常说的对象s1,当我们创建s2对象的时候,我们发现常量池中已经存在"abc"对象了,所以直接返回该对象的引用,s1和s2指向了同一个常量池对象,所以为true。

String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2);

答:false,因为在用new关键字创建对象的时候,会把对象存放到堆内存中,然后返回对象的引用,但是对String类来说就比较特殊了,new String(“abc”)创建对象时,首先会在常量池中判断是否存在"abc",如果不存在会在常量池中创建一个对象,然后再会再堆内存中创建一个对象,并返回堆内存的引用,创建s2的时候,此时常量池中已经存在"abc",则不再创建,但是堆内存中的对象还是会新创建的,然后返回一个新创建的对象的引用,所以为false(暂不知道为啥要那个常量池中的对象)。

String s1 = new String("abc");
String s2 = "abc";
System.out.println(s1 == s2);

答:false,经过上面两个讲解,这个应该就好理解了,s1是堆内存中的引用,s2是常量池中的引用,不得不提的是,在创建s2的时候,并没有在常量池中新创建对象,而是直接用的s1在常量池中创建的对象,这样我们更一步确定,s1返回的是堆中的引用而不是常量池中的引用,所以为false。

String s1 = "a" + "b" + "c";
String s2 = "abc";
System.out.println(s1 == s2);

答:true,这里的s1来的挺不容易的,首先会在常量池中创建"a"对象,然后创建"b"对象,然后创建"ab"对象,然后创建"c"对象,然后创建"abc"对象,最后把"abc"对象的引用返回给s1,创建s2对象的时候,直接就返回"abc"对象的引用了,所以是true。

String s1 = "ab";
String s2 = s1 + "c";
String s3 = "abc";
System.out.println(s2 == s3);

答:false,首先s1会在常量池中创建"ab"对象,然后返回引用,此时就创建了s1对象,在创建s2对象的时候,相当于是字符串的拼接,像StringBuffer这种类型一样,通过append方法拼成一个新的对象,该对象保存在堆中,所以为false。

Integer a = 100;
Integer b = 100;
Integer c = 200;
Integer d = 200;
System.out.println(a == b);
System.out.println(c == d);

答:true,false,因为在int的包装类Integer中,用这种直接赋值的方式创建对象,在Integer中有一个IntegerCatch,这里存放了-128~127,所以在这个范围内的数,会直接在IntegerCatch中返回,所以为true,而对于范围之外的,则需要new对象,所以为false,下图是源码。

面试官问你是true还是false你可以最后反问他这个_常量池

最后面试官问你,在方法中定义的int型变量是放到哪了,然后你说,随着方法的调用被加载到栈中,当方法调用完毕释放内存。面试官又问你,那定义的int型的成员变量呢,然后你又说,这是全局的,不会随着方法的调用完毕而释放,是存在堆中的,然后面试官说不错,那再给你出最后一道题。

public class Main {
static int a = 10;
public static void main(String[] args) {
int b = 10;
System.out.println(a == b);
}
}

你要是敢这样回答:是false,因为一个在堆中一个在栈中。那就前功尽弃了。

面试官:是true,因为他是基本数据类型,比较的是值,而不是引用或地址。记住一句话,基本数据类型比较的都是引用,引用数据类型才有那么多的坑去考虑。

最后的最后你可以问一下面试官,在用new关键字创建String对象的时候,为啥会创建两个对象,常量池中的那个对象有啥用呢



举报

相关推荐

0 条评论