是由文字原语或引用类型创建的字符串?

时间:2014-04-19 18:52:08

标签: java string

我已经累了,但我想知道是否(参见主题)。

String a = "first";
    String b = "second";
    a = b;
    b = "third";
    System.out.println(a + ", " + b);

-my问题是我得到输出的原因:“第二,第三”。是不是String引用类型?所以在命令“a = b;”之后为什么没有改变这两个变量?两个变量都不是引用同一个对象吗? (或字符串池中的相同字符串?)

3 个答案:

答案 0 :(得分:0)

  

Isn&#t; t是String引用类型?

是,String是引用类型。

  

所以在命令之后" a = b;"为什么没有改变这两个变量?

因为您只是说要一次更改一个变量的值。

本声明:

b = "third";

更改b的值。它将其更改为引用不同的字符串。 a的值保持原样 - 对包含内容的字符串的引用" second"。

区分这些概念非常重要:

  • 变量
  • 参考
  • 物件

当你写:

a = b;

这仅表示&#34;取b的当前值,并将其设为a的新值。&#34;它说&#34; make ab等价变量,这样任何一个变量值的变化都会影响另一个变量&#34; 。当您更改下一行中b的值以引用其他对象时, <{1}}或a的值<{1}} }指的是。

现在我怀疑你因为这样的代码而感到困惑:

a

在这种情况下,StringBuilder a = new StringBuilder(); StringBuilder b = a; a.append("foo"); System.out.println(b); // Prints foo 调用根本不会更改a.append()a ...两个变量仍然具有值它引用相同的b对象。相反,StringBuilder方法会更改该对象中的数据...因此,当您在最后一行打印对象的内容时,通过append获取该内容时,您仍会看到b,因为你还在指同一个(修改过的)对象。

答案 1 :(得分:0)

  

所以在命令之后&#34; a = b;&#34;为什么没有改变这两个变量?

参考类型的

变量&#34;参考&#34; 物体。也就是说,引用变量包含引用值。 (参考值可以被认为是不透明的数字或句柄,以便它唯一地标识一个对象。)

但是,变量是不是引用(在&#34;别名/ C ++&#34;意义上)本身,并且每个变量都包含一个独立但可能重复的。因此,赋值仅影响 - 如同,将新的[reference]值赋值给特定的变量,同时将值保留在所有其他变量中。

答案 2 :(得分:0)

是的,ab都在a=b之后引用了池中的相同字符串:

         String pool
             "first"                

[a] -------> "second"
                ^
[b] ------------|             "third"

但是,b的重新分配不会影响a中存储的引用,因为它们是两个不同的局部变量,可以引用不同的(永远不变的)字符串。你会看到:

         String pool
             "first"                

[a] -------> "second"

[b] ------->  "third"