int a =10;
a = 30;
&什麼區別
String a = "abc";
a = "xyz";
可有人告訴我,在這裏執行什麼樣的任務的。
我知道很難問這樣一個愚蠢的問題,但我只是想找到字符串賦值&其他對象之間的區別賦值。
據我所知,如「ABC」每一個字符串值是一個String對象本身然後當它被分配到String Object
進行了怎樣的或操作。像a = "xyz"
。
int a =10;
a = 30;
&什麼區別
String a = "abc";
a = "xyz";
可有人告訴我,在這裏執行什麼樣的任務的。
我知道很難問這樣一個愚蠢的問題,但我只是想找到字符串賦值&其他對象之間的區別賦值。
據我所知,如「ABC」每一個字符串值是一個String對象本身然後當它被分配到String Object
進行了怎樣的或操作。像a = "xyz"
。
Strings
是immutable
這意味着它們不能被改變(在內存中)。
所以,當我創建一個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))
測試,如果他們是相同的話。
int a = 10;
a = 30;
現在a
有新的價值即30
String a = "abc";
a = "xyz";
參考變量a
現在指向新的String對象即xyz
字符串是不變,當你寫
String a ="abc"
與內容ABC字符串在字符串創建池,當你寫 a = "xyz"
另一個字符串在內容爲xyz的字符串池中創建,舊字符串不會被替換。而在int的情況下,值被改變。
字符串是不可變的。因此,當您重新指定引用時會創建新對象。因此,將在堆中創建新對象XYZ。本地定義
String a = "abc";
a = "xyz";
原語將在堆棧上。然而,如果一個基元被定義爲一個對象的一個實例的一部分,那麼這個基元就會在堆上。
int a =10;
a = 30;
所以在上面的例子中,a將會堆棧。
int
是基本類型 - 不是一個對象
在字符串中的Java示例將創建「ABC」String
對象,分配給該對象以可變a
的引用,則創建「 xyz「字符串對象並將該對象的引用賦值給變量'a'(覆蓋其先前的值)。
該字符串是一個不可變的對象。當您爲String重新賦值時,系統會重新創建String對象。你的榜樣其實是這樣的:
String a = "abs";
a = new String("xy");
其次,int是不是一個對象,這是一個基本變量;它沒有任何方法。對於類似的操作,你需要一個Integer對象。
INT A = 10
指定的整數值10到新的參考變量 'a' int類型。
一個= 30
指定的整數值30到相同的參考變量 'a'。
一個字符串= 「ABC」
創建新的字符串對象 「ABC」,並將其分配給一個新的參考變量的類型的 'A' 的字符串。
一個= 「XYZ」
創建一個新的String對象 「XYZ」,使變量a指向它。現在,堆內存中有兩個String對象,「abc」和「xyz」。除非使另一個變量指向它,否則對String「abc」的引用現在會丟失。
A String
是不可變的。您無法更改String
的值;你每次都要實例化一個新的String
。 int
是不同的;您不會創建新的基元實例,並且如果它足夠小(即介於-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
}
所以,我們的小類相關部分:
最大的不同是,我們每一個存儲我們存儲的字符串時引用。由於它是一個原始的,我們不會用int來打擾它。
而且這是你的差異。
你想問什麼?第一行是聲明變量的數據類型以及賦值,我們只需要聲明數據類型一次,然後可以賦值給同一個變量多次 – 2013-04-10 05:20:50