2013-04-10 45 views
1
int a =10; 
a = 30; 

&什麼區別

String a = "abc"; 
a = "xyz"; 

可有人告訴我,在這裏執行什麼樣的任務的。

我知道很難問這樣一個愚蠢的問題,但我只是想找到字符串賦值&其他對象之間的區別賦值。

據我所知,如「ABC」每一個字符串值是一個String對象本身然後當它被分配到String Object進行了怎樣的或操作。像a = "xyz"

+0

你想問什麼?第一行是聲明變量的數據類型以及賦值,我們只需要聲明數據類型一次,然後可以賦值給同一個變量多次 – 2013-04-10 05:20:50

回答

3

Stringsimmutable這意味着它們不能被改變(在內存中)。

所以,當我創建一個String

String a = "abc"; 

,然後我給它分配

a = "xyz" 

發生了什麼事是a在爲​​的記憶是點,但現在是一個完全新的字符串和點在"xyz"

現在爲int,另一方面他們只是茶NGE,他們是mutable。 所以當我創建一個int

int a = 10;

和然後將其指定

a = 30;

發生了什麼事是a在內存指着10,但現在10變爲30,但一個仍然指向相同的內存。

注:這就是爲什麼你可以說if (String1 == String2)。這將測試他們是否指向相同的內存位置。所以,你必須做if (String1.equals(String2))測試,如果他們是相同的話。

3
int a = 10; 
a = 30; 

現在a新的價值即30

String a = "abc"; 
a = "xyz"; 

參考變量a現在指向新的String對象xyz

5

字符串是不變,當你寫

String a ="abc" 

與內容ABC字符串在字符串創建池,當你寫 a = "xyz" 另一個字符串在內容爲xyz的字符串池中創建,舊字符串不會被替換。而在int的情況下,值被改變。

1

字符串是不可變的。因此,當您重新指定引用時會創建新對象。因此,將在堆中創建新對象XYZ。本地定義

String a = "abc"; 
a = "xyz"; 

原語將在堆棧上。然而,如果一個基元被定義爲一個對象的一個​​實例的一部分,那麼這個基元就會在堆上。

int a =10; 
a = 30; 

所以在上面的例子中,a將會堆棧。

1
  1. int是基本類型 - 不是一個對象

  2. 在字符串中的Java示例將創建「ABC」String對象,分配給該對象以可變a的引用,則創建「 xyz「字符串對象並將該對象的引用賦值給變量'a'(覆蓋其先前的值)。

1

該字符串是一個不可變的對象。當您爲String重新賦值時,系統會重新創建String對象。你的榜樣其實是這樣的:

String a = "abs"; 
    a = new String("xy"); 

其次,int是不是一個對象,這是一個基本變量;它沒有任何方法。對於類似的操作,你需要一個Integer對象。

1

INT A = 10

指定的整數值10到新的參考變量 'a' int類型。

一個= 30

指定的整數值30到相同的參考變量 'a'。

一個字符串= 「ABC」

創建新的字符串對象 「ABC」,並將其分配給一個新的參考變量的類型的 'A' 的字符串。

一個= 「XYZ」

創建一個新的String對象 「XYZ」,使變量a指向它。現在,堆內存中有兩個String對象,「abc」和「xyz」。除非使另一個變量指向它,否則對String「abc」的引用現在會丟失。

1

A String是不可變的。您無法更改String的值;你每次都要實例化一個新的Stringint是不同的;您不會創建新的基元實例,並且如果它足夠小(即介於-1和5之間,包括-1和012),則可以使用it will push a constant value onto the stack

好吧,讓我們來深入瞭解一下它。

下面是一個示例類,它說明了對int和String的賦值。

public class StackOverflow { 
    public static void main(String[] args) { 
     int anInt = 30; 
     anInt = 5; 

     String aWord = "This is not a word"; 
     aWord = "And we did it again...!"; 
    } 
} 

這是字節碼的功能(幕後的男人)。我使用上述鏈接作爲字節碼實際含義的參考。

// class version 51.0 (51) 
// access flags 0x21 
public class StackOverflow { 

    // compiled from: StackOverflow.java 

    // access flags 0x1 
    public <init>()V 
     L0 
    LINENUMBER 1 L0 
    ALOAD 0 
    INVOKESPECIAL java/lang/Object.<init>()V 
     RETURN 
    L1 
    LOCALVARIABLE this LStackOverflow; L0 L1 0 
    MAXSTACK = 1 
    MAXLOCALS = 1 

    // access flags 0x9 
    public static main([Ljava/lang/String;)V 
    L0 
    LINENUMBER 3 L0 
    BIPUSH 30 
    ISTORE 1 
    L1 
    LINENUMBER 4 L1 
     ICONST_5 
    ISTORE 1 
    L2 
    LINENUMBER 6 L2 
    LDC "This is not a word" 
    ASTORE 2 
    L3 
    LINENUMBER 7 L3 
    LDC "And we did it again...!" 
    ASTORE 2 
    L4 
    LINENUMBER 8 L4 
     RETURN 
    L5 
    LOCALVARIABLE args [Ljava/lang/String; L0 L5 0 
    LOCALVARIABLE anInt I L1 L5 1 
    LOCALVARIABLE aWord Ljava/lang/String; L3 L5 2 
    MAXSTACK = 1 
    MAXLOCALS = 3 
} 

所以,我們的小類相關部分:

  • 字節 30到堆棧(這是小到足以被視爲一個字節)
  • 商店入變量1
  • 推恆定5到堆棧
  • 商店入變量1,覆蓋我們的從常量池30
  • 負載第一個字符串「這不是一個詞」
  • 參考到變量2
  • 負載從一個常量池第二個字符串「我們再次做到了... !」
  • 參考到變量2

最大的不同是,我們每一個存儲我們存儲的字符串時引用。由於它是一個原始的,我們不會用int來打擾它。

而且是你的差異。

0

有用於這一操作的兩個不同的JVM指令:

  1. astore保存到一個對象的引用
  2. istore節省int值

要從找出實際上做什麼這個?