对一道基础string题及其变式题的思考与解析

1、下面程序的运行结果是()(选择一项)
String str1=“hello”;
String str2=new String(“hello”);
System.out.println(str1==str2);

A.true

B.false

C.hello

D.he
答案:B
分析:str1没有使用new关键字,在堆中没有开辟空间,其值”hello”在常量池中,str2使用new关键字创建了一个对象,在堆中开辟了空间,”==”比较的是对象的引用,即内存地址,所以str1与str2两个对象的内存地址是不相同的。

简单变式:
下面程序的运行结果是
String str1 = “hello”;
String str2 = “he” + new String(“llo”);
System.err.println(str1 == str2);
A.true
B.false
C.exception
D.无输出
正确答案:B
链接:https://www.nowcoder.com/questionTerminal/f06ee75317c44b44b43b10b1ffc866bd?pos=15&mutiTagIds=570_609_637_614&orderByHotValue=0
来源:牛客网
解析:
String str1= “hello”, String str2=“he”+“llo”;之所以str1str2返回true是因为两者都是在字符串常量池中(由于初始化就会在此区域分布内存)而常量池中的有个与栈区类似的特性,就是当str2指向的常量在常量区已存在时,他不会创建新的内存空间来存此常量,而是指向已有常量的内存(应该是以此节约空间),此时str1与str2这两个引用变量的值都是存"hello"的内存空间地址,但是String str3= “he”+a;String a=“llo”;时str1str3返回的为false,是因为:str1指向的hello在编译期一如既往的还是分配在常量区内,a指向的llo也在常量区,虽然str3也是初始化但是编译器无法判断a这货到底是什么个情况,进而不会将str3的等号右侧声明在常量区内,而是在通过构造时在堆区中的非常量池外的内存中声明,至此str3与str1不止是分配内存的时期不同(一个在编译期,一个在运行期)而且在内存空间的区域也不同。另:“==”在java发中是判断引用是否相等(内存中的地址是否相等,并不是值相等),new String(“llo”)之后肯定是在堆内存中开辟内存空间,所以地址改变,若是判断 String str1=str2; System.out.println(“str1=str2:”+(str1=str2)); 答案:true。

后记:由于还是大二,最近沉迷于算法中有点不能自拔,学c和c++有点上瘾,今天上了一天校企合作的Java培训课。以前学过的Java基础都忘得差不多了。故打算写几篇博客来回忆复习忘掉的知识。后期还会继续更新,恳请看到博文的各位帮忙指正。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值