zoukankan      html  css  js  c++  java
  • 005 String s = "Hello";s = s + " world!";执行这两行代码执行后,原始的 String 对象中的内容到底变了没有?

    原始的String对象中的内容没有改变成“Hello world”.

    1、原因

      因为在Java中String类被设计成不可改变的类,所以String类的所有对象都是不可变的。第一句代码中,s(存储在栈区)引用了堆中的一个内存区域

    (记为a1),a1堆内存区域存储的内容是“Hello”。执行第二句代码后,s不在引用a1区域,而是重新引用了堆中的另外内存区域(记为a2),且a2中的内容是“Hello world”。s并没有对原始的a1堆内存中的内容进行改变,而是重新指向了新的堆内存区域。

     

    2、启发

      在程序中,如果需要多次对字符串进行修改的时候,不建议使用String类型定义字符串对象,因为这会频繁的在堆中开辟内存创建新的String对象,造成低效和内存浪费。可以使用StringBuffer,它允许修改,而不是每个不同的字符串都要生成一个新的对象。

    3、两种赋值方式的区别

      String s = "Hello"的赋值方式,“Hello”的内容是不允许修改的,而且若String s1 = "Hello";String s2 = "Hello";则s1和s2指向同一个字符串对象,也即同一块内存。但是String s1= new String(“Hello”)和String s2 = new String(“Hello”),s1和s2指向两个不同的string对象,指向的内存区域也不一样。总结如下:对于字符串常量,如果内容相同,则Java认为它们代表同一个String对象,而使用关键字new调用构造器,则每new一次,就会创建一个新的对象,而不论内容是否相同。

  • 相关阅读:
    python中的编码问题
    CVPR2018 Tutorial 之 Visual Recognition and Beyond
    hdu 1376 Octal Fractions
    hdu 1329 Hanoi Tower Troubles Again!
    hdu 1309 Loansome Car Buyer
    hdu 1333 Smith Numbers
    hdu 1288 Hat's Tea
    hdu 1284 钱币兑换问题
    hdu 1275 两车追及或相遇问题
    hdu 1270 小希的数表
  • 原文地址:https://www.cnblogs.com/xwwbb/p/11082089.html
Copyright © 2011-2022 走看看