关于String的面试题

1.以下代码分别创建了几个对象

String str1 = “123”;String str2 = new String(“123”):;
我们先来看下面这张图
在这里插入图片描述
我们先说常量池,常量池分为
1;编译常量池:当字节码加载进jvm的时候,存储字节码相关的信息
2;运行常量池:存储常量数据
String str1 = "123"再来看这一道题
所以我们知道,“123”这个常量是存储在方法区的常量池中的,当我们栈中的str1想用"123"这个常量的时候,会想去方法区中的常量池找,看有没有"123"这个常量,如果有那就直接饮用这个常量的内存地址,然后传递这个值让str1去用,但是如果常量池中没有"123"这个常量,那么就会新创建一个常量"123"并赋给str1
所以String str1 = “123”,最少创建0个对象,最多创建1个对象

再来看这道题
;String str2 = new String(“123”):
我们知道,new出来的对象时在堆空间中开辟的,所以能new 的时候,一定会在堆空间中创建一个对象,当这个对象创建好了后,他就会去常量池中寻找是否有"123"这个常量,如果有,就会直接引用这个内存地址传递值,如果没有就会重新创建“123”常量

所以String str2 = new String(“123”):至少会创建一个对象,最多创建两个对象
在这里插入图片描述

2.判断下面对象之间是否相等

String str1 = “123”;
String str2 = new String(“123”):
String str3= “1” +“2”+“3”;
String s = “12”;
String str4 = s+“3” ;
String str5 = getNum()+“3” ;
public static String getNum(){
return “12”;
}
我们先来测试一下
在这里插入图片描述
str1str2
这道题与第一道题相似,str1引用的是常量池的内存地址,str2引用的是堆空间的内存地址,自然不相等
str1
str3
这道题为什么是正确的呢,这是由于编译器优化,当我们查看编译后的字节码文件反编译后的原文件时,会发现,编译器在编译的时候"1" + “2” + “3"优化成了"123”,所以str3引用的也是常量池中"123"的内存地址,故相等
在这里插入图片描述
str1str4
str1
str5
这两道题都是一样的,我们知道变量和方法只有在运行时期才会确定他们的值,在编译时期只会检查语法是否正确,故这两个题的答案都为false
在这里插入图片描述

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值