1. 在java中當定義char c='a',String s="abc"時,分別在內存中佔多少位元組
Java中無論是漢字還是英文字母都是用Unicode編碼來表示的,一個Unicode碼是16位,每位元組是8位,所以一個Unicode碼占兩位元組。但是英文字母比較特殊,源自於8位(1位元組)的ASCII嗎,於是在Unicode碼僅使用了低8位(1位元組)就可以表示,高8位的話不使用也無所謂。所以
char c='a';
System.out.println(c.getBytes().lenth()),得到的是1(位元組)
但漢字就完整地使用了16位(2位元組)的Unicode,所以
char c='中';
System.out.println(c.getBytes().lenth()),得到的是2(位元組)
綜上,c='a'在內存中確實只佔1位元組,但這不意味著String s="abc"在內存中只佔3位元組。應該這么說,String s="abc"至少在內存中佔3位元組。這是因為char是基本數據類型,而String確是對象類型。對象是一種很復雜的數據類型,你要看一個對象具體佔多少位元組,可以把這個對象序列化後存入一個文本文件來看它具體佔用了多少位元組,當然這也不是精確的,因為序列化需要寫入少量系統信息,但大致是對的。
2. 在java語言中輸入一個字元串:「abc」,怎樣可以簡單的使其輸出「cba」
我寫了一個更通用的方法,不限於3個字元的,任意長度的均可,權當交流:
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
System.out.println("請輸入一個字元串:");
String str = input.next();
Reverse(str);
}
public static void Reverse(String str){
System.out.println("反轉後的字元串為:");
for(int i = 0; i < str.length(); i++){
String temp = "";
temp = temp + str.charAt(str.length()-i-1);
System.out.print(temp);
}
3. 在java 中 String a=New String("abc") 與Strng b="a
前面那個是定義了一個String類對象a 並賦值為abc。此時的a是一個實例化對象
後面的b 是定義了一個String字元串變數 ,賦值abc 。順便說一句 後面一句少了一個i
也可以這么理解:
String b= "abc"; 先在內存中找是不是有"abc" 這個對象,
如果有,就讓b指向那個"abc".如果內存里沒有"abc",就創建一個新的對象保存"abc".
String a=new String ("abc") 就是不管內存里是不是已經有"abc"這個對象,
都新建一個對象保存"abc"
4. java 字元串變數賦值例如 String a="abc"; String b; b=a; b="
Stringa="abc"滾瞎;//定義了一個"abc"字元串,a指向這個字元串
Stringb;
b=a;//使b也指向a現在指向的那個字元串("abc")
b者局="abcd";//定義了一個大嫌空"abcd"字元串,b指向這個新的字元串
在內存中大致的示意圖如下:
所以最後 a =「abc」,b=「abcd」
java中字元串是一個較為特殊的存在,如果感興趣可以找資料詳細了解
Java中字元串內存位置淺析
觸摸java常量池