1. 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「的。

2. Java String s="hello" 在內存中是什麼狀態

字元串是一種特殊的對象它不儲存在堆棧里 而是存在字元串常量池裡 就算字元串失去了所有的引用也不會被垃圾處理器處理掉 所有的字元串都是唯一的對象
引用s當然是在棧里了

3. 求java中String在內存中的分配情況詳解

Java中的String對象是不可變的。String類中每個看起來會修改String值的方法,實際上都是創建了一個全新的String對象。
Java中一般不能重載操作符,但是String類「+」和 「+=」操作符是Java中唯一重載的兩個操作符。這兩個操作符都是編譯器默認引入了java.lang.StringBuilder類,最後都調用了toString方法生成String對象的。
常量字元串是分配在虛擬機的方法區的常量池中,也可以通過String.Intern將String添加到常量池中,String.valueOf方法會先檢索常量池中字元串,沒有的話才會去在堆中new一個,使用new 操作符生成的字元串對象,跟一般的對象生成一樣,是在虛擬機的堆中分配內存的。

4. Java中String 和Stringbuffer內存裡面的操作區別。

String str1 = "123";
可以這其實是java jdk1.5以後的語法糖,及自動拆裝箱功能。
你把jdk換成1.5以前就不可以使用
String str1 = "123";

5. String類型在Java中對象的比較的內存中的運行情況

==是Object (所有類的父類)的equals方法
而String 的equsls方法為父類方法的重寫 所以他們不比較對象本身 而是比較對象指向的字元串

6. java中一個String常量和一個new 出來的String對象追加的時候,在內存中是怎麼存儲的

String a = "women"; "women"表示String類的對象,是堆內存里的,把"women"地址值賦給了a
String b = "wo"+"men"; java 程序中有常量優化機制,最後"women"地址值給了b;
String c = "wo"+new String ("men");表示兩個地址值不一樣的對象相加,其實底層是用StringBuffer的append()方法操作的;會創建新的對象;以前的變成了垃圾,結果為「women」;

7. JAVA里String數組在內存分配中分配的空間每個占幾個位元組

java中一個int佔4個位元組,由於java是unicode編碼,一個char可以占兩個位元組,可以存儲一個漢字。一個String,要看有幾個字母或者幾個漢字,一個英文字母就是一個位元組,一個漢字就是兩個位元組,以此類推計算。

8. java String 內存地址問題如何獲取 String 內存地址!

hashCode()返回的是JVM中地址的哈希碼,而不是JVM中的地址,要想得到str在物理內存中的真實地存,那隻有用JNI技術調用c/c++去實現,否則無能為力,因為java超不出JVM,而JVM對物理內存地址是「不可見」的,否則java中不就有了指針,而去直接操作內存了,當然這是與java語言相違背的。這些只是我個人見解,說不定還真有高手直接用java語言得到了物理內存中的地址了呢。