簡體   English   中英

字符串不能改變。 但是int,char可以改變

[英]String can't change. But int, char can change

我已經讀過,在Java中,String類型的對象無法更改。 但int和char變量可以。 為什么? 能給我舉個例子?

謝謝。 (我是新手-_-)

正如bzabhi所說,字符串在Java中是不可變的。 這意味着字符串對象永遠不會改變。 這並不意味着您無法更改字符串變量,只是您無法更改字符串的基礎內存表示形式。 舉個例子:

String str = "Hello";
str += " World!";

在執行這些行之后,str將指向內存中的新字符串。 原始的“Hello”字符串仍然存在於內存中,但很可能它不會存在很長時間。 假設沒有任何情有可原的情況,沒有任何東西會指向原始字符串,因此它將被垃圾收集。

我想最好的方法就是說當示例的第2行執行時,內存中的新字符串是從原始字符串的串聯和添加到其中的字符串創建的。 然后將str變量(僅僅是對內存位置的引用)更改為指向剛剛創建的新變量。

我並不是特別了解這一點,但是,據我所知,這就是所有“非原始”價值所發生的事情。 在某些時候從Object派生的任何東西都遵循這些規則。 原始值,例如int,bools,chars,float和double,允許更改內存中的實際值。 所以,從這個:

int num = 5;
num += 2;

內存中的實際值會發生變化。 此代碼示例不是創建新對象並更改引用,而只是更改num變量的內存中的值。

至於為什么這是真的,它只是Java制造商的設計決定。 我相信有人會評論為什么會這樣做,但這不是我所知道的。

int和char也不能改變。 與字符串一樣,您可以將不同的值放入同一個變量中,但整數本身不會更改。 3將永遠是3; 你無法將其修改為4。

String是一個不可變類型(其中的值不能更改)。 所有原始類型(boolean,byte,char,short,int,long,float和double)都是如此。

int    x;
String s;

x = 1;
x = 2;
s = "hello";
s = "world";
x++; // x = x + 1;
x--; // x = x - 1;

正如你所看到的,在任何情況下你都不能改變常數值(1,2,“你好”,“世界”),但你可以改變他們指向的位置(如果你扭曲了一下你的思緒並說一個int變量點在一個恆定的int值)。

我不確定是否可以(通過示例)顯示字符串無法更改。 但是您可以通過閱讀String類Javadoc的描述部分,然后閱讀methods部分並注意到沒有可以更改String的方法來確認這一點。

編輯 :為什么Strings被設計為在Java中不可變的原因有很多。 最重要的原因是不可變字符串比可變字符串更容易正確使用。 如果由於某種原因確實需要可變等效的String,則可以使用StringBuilder(或StringBuffer)類。

值得注意的是,由於字符串是不可變的,如果將它們傳遞給方法,則不能在方法內修改它們,然后在方法范圍之外看到這些更改。

public void changeIt(String s) {
    // I can't do anything to s here that changes the value 
    // original string object passed into this method
} 

public void changeIt(SomeObject o) {
    // if SomeObject is mutable, I can do things to it that will 
    // be visible outside of this method call
} 

這篇小文章可能比我能更好地解釋它: http//www.jchq.net/tutorial/09_02Tut.htm

字符串在java是不可變的。 不過,您仍然可以為字符串附加或前置值。 通過值,我的意思是原始數據類型或其他字符串。

但是, StringBuffer是可變的,即它可以在內存中更改(不必分配新的內存塊),這使得它非常有效。 另外,請考慮以下示例:

StringBuffer mystringbuffer = new StringBuffer(5000);

for (int i = 0; i<=1000; i++)
{
    mystringbuffer.append ( 'Number ' + i + '\n');
}

System.out.print (mystringbuffer);

我們不是創建一千個字符串,而是創建一個可以擴展的單個對象( mystringbuffer )。 我們還可以設置一個推薦的起始大小(在這種情況下,5000字節),這意味着緩沖區不必在添加新字符串時不斷地請求內存。

雖然StringBuffer不會在每種情況下提高效率,但如果您的應用程序使用長度增長的字符串,那么效率會很高。 StringBuffer的代碼也可以更清晰,因為append方法使您不必使用長賦值語句。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM