关于String str = new String();和String str = "";的区别

关于String str = new String();和String str = "";的区别

https://img1.sycdn.imooc.com//climg/61cbf9c209a86a6710120530.jpg

https://img1.sycdn.imooc.com//climg/61cbf9ca095228da02620200.jpg

当我们使用String str1 = new String("hello");实例化时,由于两个引用对象的地址不同,所以==的结果为false,但当使用String str3 = "hello";赋值时,==的结果为true,若理解为赋值时,内容相同的字符串指向同一地址,那为什么修改str4的值时不会影响str3的值呢,如果不这样理解,那使用String str = "hello";这样的方式赋值时,str是否为String类型的对象呢,两种方式的区别在哪里呢

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学您好,

  1. str1和str2为引用数据类型,创建对象实例化,会在内存中开辟两块内存空间,两个对象分别指向不同的堆内存空间,所以这里的str1和str2比较为false,而str3和str4两个变量只是基本数据类型,比较的仅仅是值

  2. “那为什么修改str4的值时不会影响str3的值呢”:因为str4和str3是两个不同的变量,其中一个变量的改变并不会影响另一个变量的改变

  3. “那使用String str = "hello";这样的方式赋值时,str是否为String类型的对象呢”:这里的str并不是String类型的对象,因为并没有创建对象,这段代码代表的str是一个String类型的变量。

  4. “两种方式的区别在哪里呢”:这两种创建方式在应用上没有特别大的区别,只是内存的存储位置不同,一个存储在常量池中,一个存储在堆中,String str3 = "hello";这句代码是在常量池中创建hello字符串对象,变量str3是对常量池中该对象的引用,而String str1 = new String("hello");,通过new关键字创建的对象,会在堆内存中开辟空间;所以这句代码是指,如果常量池中没有hello这个字符串对象,会在常量池中创建,并且还会在堆内存中创建一个对象,变量str1是堆中对象的引用

祝同学学习愉快~

  • 慕先生7695951 提问者 #1

    您好,请问是不是可以理解为当使用Sting str1 = "hello";赋值时,str1引用常量池中的hello字符串对象,若有str2 = "hello"时,str2也同样引用常量池中的hello字符串对象呢,若是如此,这两个变量所指向的hello字符串对象是否为同一个呢,如果是同一个,那么在改变其中一个的赋值时,就将创建另一个字符串对象并引用,是这样理解么,另外,您回答中第一条所述,str3和str4只是基本数据类型,那为什么可以调用String类中的方法呢

    2021-12-29 15:04:29
  • 好帮手慕小明 回复 提问者 慕先生7695951 #2

    同学您好,

    老师将上述代码结合同学的疑问进行具体分析:

    1. String str1 = new String("hello");这段代码中的str1是存储在堆空间中的,为了方便同学理解,这里假设地址值为0X10000000

    2. String str2 = new String("hello");这段代码中的str2也是存储在堆空间中的,这里假设地址值为0X20000000

    3. 打印输出str1,这里的str1被toString方法覆盖,所以我们只能看到hello这段语句

    4. str1==str2,这段代码是对比变量中存储的值,其实这里对比的只是地址值,因为这两个地址值不同,所以为false

    5. 对比equals,由于String类覆盖过equals方法,此时比较的就是字符串的内容,而不是变量中的地址值

    6. str3,这里hello是存储在方法区中的常量池中,假设地址0X00001000

    7. str4,这里hello也是存储在方法区中的常量池中,假设地址0X00001000

    8. 这里的==,比较的就是常量池中的字符串,所以为true

    9. 这里的equals,比较的也是常量池中的字符串,所以为true

    10. 这里同学表述的“那为什么修改str4的值时不会影响str3的值呢”,是与同学中的代码不符合,那么我们对同学说的修改str4问题进行回答,这里将str4的值修改为world,实际上str4的内存地址也被修改了,假设为0X00002000,由于被toString方法覆盖,我们无法查看内存地址值,这里的内存地址值,实际上也改变了,所以str4的修改不会影响到str3

    11. “两种方式的区别在哪里呢”,二者区别在于:

      1. 存储空间位置不同

      2. 由于存储空间位置不同,所以在对比内容时,如果使用==可能会出现误判(相同内容结果返回false)而equals不会出现此类问题,如果同学进行比较内容的话,更建议同学采用equals来进行比较

    上述老师表述的可能不是很清晰,给同学造成了不必要的疑问,这里老师对该段代码具体分析。

    关于上述同学追问的问题,这里同学理解的正确的。

    祝同学学习愉快~


    2021-12-29 16:40:01
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师