⑴ java中兩個字元串的內存地址相同
String s1 = new String("I am a student"); 這里 你聲明了一個引用 s1\x0d\x0a指向的是 new String("I am a student"); 這個字元串\x0d\x0aString s4 = s1; 這里 你又聲明一個引用 指向s1的引用 也就是new String("I am a student"); \x0d\x0aif(s1 == s4) {\x0d\x0aSystem.out.println("這兩個字元串的內存位置相同");\x0d\x0a}\x0d\x0a上面還是相等的\x0d\x0a但是 s4 = s4.replace('a', 'A');\x0d\x0as4.replace('a', 'A'); 生成了另一個 字元串 你要知道 String 是final類型的 所以\x0d\x0a這個時候 即原來已經開辟了內存空間的 new String("I am a student"); 是不可能改變內容了的\x0d\x0a這個時候 s4.replace('a', 'A'); 就另開辟了一個內存空間\x0d\x0a 而這個時候 你的S4指向s4.replace('a', 'A'); 而原來的s1還是指向 new String("I am a student"); \x0d\x0a他們肯定不一樣的呢
⑵ java中,字元串,如何存儲在內存中的哪個區域
字元串在java中是不可變序列,每一個雙引號的字元串序列都是常量,存在常量池中。但String類型的對象,屬於對象范疇,按對象的特性存儲。
⑶ java的字元串是常量嗎它存 放在內存的哪裡
b為字元串常量,存放在java虛擬機為它分配的內存在常量池中。
如果常量池中存在「你好」,b就會指向其內存地址。
如果不存在Java虛擬機會為「你好」分配一個地址
⑷ java中字元串池存放在內存的哪個區域
字元串首先是一個對象。
舉個例子:
String
str0
=
"abc";
String
str1
=
new
String("abc");
當執行String
str0
=」abc」;時,JVM會在棧中創建三個char型的值
』a』
,
』b』
和
』c』
,然後在堆中創建一個String對象,它的值(value)是剛才在棧中創建的三個char型值組成的數組{
』a』
,
』b』
,
』c』
},最後這個新創建的String對象的值」abc」會被添加到字元串池中。如果我們接著執行String
str1=new
String(」abc」);代碼,由於」abc」已經被創建並保存於字元串池中,因此JVM只會在堆中新創建一個String對象,但是它的值(value)是共享前一行代碼執行時在字元串池中的
」
abc
」
;
⑸ Java中 String字元串內存分配問題
jvm中有個String pool,一般在池中有的對象就不會再去生成一個新的。
String s1 = "abc";
生成了一個字元串對象"abc"並放入pool中,定義了一個String變數s1並指向"abc"。
String s = "abc" + s1 + "def";
等式右邊有三個String 對象 "abc" 、s1 、"def"
這里("abc"==s1)是true,就是說是引用的同一個內存地址。
"abc"已經在池中了,直接從池中取出來,這句又創建了一個"def"的String對象並放入池中。
當前二個String對象做連接的時候,又會創建一個新的String對象"abcabc",並放入池中;然後再做字元串相加"abcabc"+def又生成一個字串對象,最後變數s指向這個新的String對象。
所以用+來連接字串會產生很多臨時的字串對象,效率低。一般使用StringBuffer或StringBuilder來做字串連接。
可以使用new String()來生成一個新的String對象並單獨分配內存空間。
------------------------------------------------------
查了下資料,已經改了回答內容。
String s = "abc";
這句是定義一個String變數s,jvm會先去字元串池中找有沒有"abc",有的話就把s指向"abc",沒有就會先在池中創建一個,再讓s指向"abc"。
String s = new String("abc");
這句是先定義一個String變數s,然後在內存中分配新的空間"abc"再讓s指向這個內存地址。
⑹ 怎麼查看java中字元串的內存地址
java中不建議直接獲取字元串內存地址,因為java不像c語言,獲取內存地址是C語言的強項,java的弱項。但是java內存地址還是有一個應用場景,就是判斷兩個字元串內存地址是否相等來判斷是否是同一個對象,用雙等號「==」來比較的。參考代碼如下:
publicclassTest01{
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
Stringstr1="abc";
Stringstr2=newString("abc");
System.out.println(str1==str2);//輸出false
}
}
⑺ java的字元串是常量嗎它存 放在內存的哪裡
你好,String變數中存的是地址。在你的例子中,變數b存儲的是一個"你好"的字元串常量的地址,這個地址是不變的,若你再聲明String c=」你好";則c==b,同樣,b==「你好";因為常量在內存中只存儲一次。而你的變數a使用了new運算符,它的意思顯而易見,就是重新申請一個空間來存放字元串的。所以當你再有String d=new String("你好");變數(d==a)的返回值是false。
希望這樣解釋能理解吧
⑻ Java中字元串在內存當中占幾個位元組
對是10位元組
在C 或C++個 一個char 是8位(1BYTE)而java 中是16位 (2BYTE)
這個字元串為5個char 所以是 10(BYTE)
⑼ java中,如何得到一個字元串占內存大小
java中可以用.getBytes().length獲取字元串佔用內容的大小,原理是java中任何字元都採用Unicode編碼,所以衡量佔用內存大小採用佔用的位元組數。
舉例如下:
public class TestStringSize {
public static final void main(String[] args) {
System.out.println("佔用內存大小:"+"學java".getBytes().length);
}
}
輸出結果:
佔用內存大小:6 byte
⑽ Java中字元串在內存當中占幾個位元組
對是10位元組
在C
或C++個
一個char
是8位(1BYTE)而java
中是16位
(2BYTE)
這個字元串為5個char
所以是
10(BYTE)