javastring內存
① java中String字元串的存儲大小也就是容量是多少呢能存多少字元。
String str="abc...";這樣定義的字元串是存在字元串池中的
String str=new String("abc...")這樣定義的字元串是在堆內存中的,然後被棧內存的對象str引用
所以字元串是對象,是在內存中存儲的,不像基本數據類型有各自的長度,字元串應該是只要是內存不滿,是沒有長度限制的
② java使用軟引用可以回收String的內存嗎
如果一個對象只具有軟引用,那就類似於可有可物的生活用品。如果內存空間足夠,垃圾回收器就不會回收它,如果內存空間不足了,就會回收這些對象的內存。只要垃圾回收器沒有回收它,該對象就可以被程序使用。軟引用可用來實現內存敏感的高速緩存。
軟引用可以和一個引用隊列(ReferenceQueue)聯合使用,如果軟引用所引用的對象被垃圾回收,JAVA虛擬機就會把這個軟引用加入到與之關聯的引用隊列中。
個人認為將String對象軟引用沒什麼大的用處,因為一個String佔用內存很少,軟引用基本都是用來給那些佔用內存大的對象使用的,如Bitmap等
③ java String類 開辟內存問題
首先你要知道String是怎麼分配內存的,如果使用字元串直接賦值,比如str="abc",那麼它會先去常量區找,如果常量區已經有abc,那就直接把str指向abc,如果沒有,它就在常量區再分配一個abc。使用new String("abc")的話,不管常量區有沒有,它都會在堆里分配一個新的"abc"。
現在回答你的問題。
第一個問題,JAVA的常量字元串+,編譯器會自動優化,str3="ab"+"c",經過編譯器優化後,實際上等於str3="abc",而常量區已經有一個str分配的"abc",因此str3直接指向str指向的"abc",因此str==str3。
subString(0,2)返回的也是一個string,它的分配也符合上述的規則,subString(0,2)返回"ab",ab在常量區沒有對應的值,因此它會另外開辟內存,所以str2 != str。
第二個問題,subString的工作方式是,如果截取的是整個字元串,那它不會新new一個返回,而是直接返回原字元串。因此str.substring(0,3)實際上返回的就是str,所以它們是相等的。str.substring(0,1)截取的是第一個字元"a",這時候返回的也不是你想像的常量區的字元,而是一個新new出來的地址。
我們可以試試:
String str = "abc";
String str2 = "a";
System.out.println(str.substring(0,1) == str2);
System.out.println(str.substring(0,1).equals(str2));
第一個輸出false,第二個輸出true。因為雖然前面str2初始化後常量區已經有一個"a",但subString截取的字串是新new出來的,不是直接指向常量區的"a「的。
④ 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 StringBuilder和String的內存分析的問題
它們的實現機制不同,這個和有沒有人接收沒有關系,concat()返回是一個指向常量池111333的全新對象,沒有改變s2的引用。至於replace()方法也有多種實現方式,但據我猜測它的實現就像C中的動態數組一樣,總之不管它是怎麼實現的,sb2最終就是指向了aaaccc。
再多說一句,這個應該在邏輯上理解,而底層實現多種多樣,怎麼實現都不可以,無非就是一個效率問題,concate方法意在返回一個連接之後的數組,而非銷毀對象S2,append方法是附加的意思,意義不言自明了,
⑥ java string 的內存運算模型,求下面的內存運算,感覺和自己以前了接的有所不一樣,求求解。
String這個類比較特殊,他有一個自己的String池。
原理1:當使用任何方式來創建一個字元串對象s時,Java運行時(運行中JVM)會拿著這個X在String池中找是否存在內容相同的字元串對象,如果不存在,則在池中創建一個字元串s,否則,不在池中添加。
原理2:Java中,只要使用new關鍵字來創建對象,則一定會(在堆區或棧區)創建一個新的對象。
原理3:使用直接指定或者使用純字元串串聯來創建String對象,則僅僅會檢查維護String池中的字元串,池中沒有就在池中創建一個,有則罷了!但絕不會在堆棧區再去創建該String對象。比如你的 "a"+"b"
原理4:使用包含變數的表達式來創建String對象,則不僅會檢查維護String池,而且還會在堆棧區創建一個String對象。比如你的 a+b
就是說 你 a="aabb"; 列印 a=="aabb" 和 a=="aa"+"bb" 為真。列印a== new String("aaaa")為假
String aa="aa";String bb="bb";列印a==aa+bb也為假
⑦ 獲取java中String類型對象的內存地址值
String str1 = "abc";String str2 = "abc";System.out.println(str1==str2); //true
這樣就是true了
String str="abc";System.out.println(str.getBytes());
這個就是地址[B@7150bd4d B可能是類名 因為我的類是B @後面的大概是地址了 沒研究過 但是過去地址確實是這個
⑧ java String 內存地址問題如何獲取 String 內存地址!
hashCode()返回的是JVM中地址的哈希碼,而不是JVM中的地址,要想得到str在物理內存中的真實地存,那隻有用JNI技術調用c/c++去實現,否則無能為力,因為java超不出JVM,而JVM對物理內存地址是「不可見」的,否則java中不就有了指針,而去直接操作內存了,當然這是與java語言相違背的。這些只是我個人見解,說不定還真有高手直接用java語言得到了物理內存中的地址了呢。