a:字串字面值"abc"也可以看成是乙個字串物件。
b:字串是常量,一旦被賦值,就不能被改變。
如string s = "abc";
s = "abcd"。這裡改變的是物件的引用s指向的物件的位址值。常量池中建立了兩個常量,即「abc」和「abcd」,分別把位址值賦予了引用s。所以改變的不是字串常量,而是引用的位址值。
string s1 = new string("hello");
string s2 = "hello"。的記憶體圖:
前者建立了兩個物件new string()和「abc」,後者只建立了乙個物件「abc」;
* public string():空構造
* public string(byte bytes):把位元組陣列轉成字串
* public string(byte bytes,int index,int length):把位元組陣列的一部分轉成字串
* public string(char value):把字元陣列轉成字串
* public string(char value,int index,int count):把字元陣列的一部分轉成字串
* public string(string original):把字串常量值轉成字串
string類的常見面試題)(掌握)
* 1.判斷定義為string型別的s1和s2是否相等
* string s1 = "abc";
* string s2 = "abc";
* system.out.println(s1 == s2); true,兩個引用指向常量池中的同乙個位址值
* system.out.println(s1.equals(s2)); true
* 2.下面這句話在記憶體中建立了幾個物件?
* string s1 = new string("abc"); 兩個物件
* 3.判斷定義為string型別的s1和s2是否相等
* string s1 = new string("abc");
* string s2 = "abc";
* system.out.println(s1 == s2);false,s1指向堆記憶體中string物件的位址值,該物件再指向常量池中「abc」的位址值;s2直接指向常量池中「abc」的位址值。
* system.out.println(s1.equals(s2));true
* 4.判斷定義為string型別的s1和s2是否相等
* string s1 = "a" + "b" + "c";
* string s2 = "abc";
* system.out.println(s1 == s2); true;string類有常量優化機制,編譯時直接先把常量相加,如同int i = 3+4;
* system.out.println(s1.equals(s2));true
* 5.判斷定義為string型別的s1和s2是否相等
* string s1 = "ab";
* string s2 = "abc";
* string s3 = s1 + "c";
* system.out.println(s3 == s2);false;因為string的拼接使用它的緩衝區stringbuffer來完成的,要建立stringbuffer的物件,再通過tostring轉換成string,所以s3的位址值是堆記憶體中stringbuffer物件的位址值。
* system.out.println(s3.equals(s2));true
*6.string s1 = "hello";
* string s2 = "world";
* string s3 = "helloworld";
* system.out.println(s3 == s1 + s2);// false
* system.out.println(s3.equals((s1 + s2)));// true
* system.out.println(s3 == "hello" + "world");// true
* system.out.println(s3.equals("hello" + "world"));// true
對於第三題,字串如果是變數相加,是先開空間,再相加,新開的空間的位址值和原來的不一樣(如第二題),而如果字串是常量,則是在編譯時期先相加再建立空間(就如同s = 3+4 一樣,是先直接計算3+4的和為7,再把7給s),但是建立的時候發現相加的結果「helloworld」在常量池中已經有了,所以就直接把原來的位址值賦值過去了。
* boolean equals(object obj):比較字串的內容是否相同,區分大小寫
* boolean equalsignorecase(string str):比較字串的內容是否相同,忽略大小寫
* boolean contains(string str):判斷大字串中是否包含小字串
* boolean startswith(string str):判斷字串是否以某個指定的字串開頭
* boolean endswith(string str):判斷字串是否以某個指定的字串結尾
* boolean isempty():判斷字串是否為空。
* int length():獲取字串的長度。
* char charat(int index):獲取指定索引位置的字元
* int indexof(int ch):返回指定字元在此字串中第一次出現處的索引。
* int indexof(string str):返回指定字串在此字串中第一次出現處的索引。
* int indexof(int ch,int fromindex):返回指定字元在此字串中從指定位置後第一次出現處的索引。
* int indexof(string str,int fromindex):返回指定字串在此字串中從指定位置後第一次出現處的索引。
* lastindexof
* string substring(int start):從指定位置開始擷取字串,預設到末尾。
* string substring(int start,int end):從指定位置開始到指定位置結束擷取字串。
* byte getbytes():把字串轉換為位元組陣列。
* char tochararray():把字串轉換為字元陣列。
* static string valueof(char chs):把字元陣列轉成字串。
* static string valueof(int i):把int型別的資料轉成字串。
* 注意:string類的valueof方法可以把任意型別的資料轉成字串。
* string tolowercase():把字串轉成小寫。
* string touppercase():把字串轉成大寫。
* string concat(string str):把字串拼接。
* a:string的替換功能
* string replace(char old,char new)
* string replace(string old,string new)
* b:string的去除字串兩空格
* string trim()
* c:string的按字典順序比較兩個字串
* int compareto(string str)//按照碼表比較大小
* int comparetoignorecase(string str)//不區分大小的比較
用compareto進行比較的時候,會用unicode碼表進行比較。
char的轉換是按照unicode碼表
io流的時候的轉換是按照gbk碼表,是硬碟到記憶體的操作,在硬碟上所儲存的都是以位元組形式的。可以讀到記憶體中以字串形式存在。主要看系統的碼表是什麼。
unicode碼表和gbk碼表都囊括了ascii碼表。
Java基礎複習執行緒
執行緒 實現多執行緒的兩種方法 繼承thread類,重新run方法 thread a new mythread 子執行緒 thread.start 實現runnable介面,實現run方法。myrunnable my new myrunable 在這個myrunnable類中已經重寫了run方法 t...
java基礎複習(4)
極限程式設計 測試先行,結對程式設計 要求兩個人水平相當。能夠提高效率,不易出錯,而且程式設計者無法偷懶哈 看過程式設計師上面的一篇文章,極限程式設計具有良好的實踐性比如 測試驅動開發,持續整合,使用者故事。測試驅動保證了開發人員的編碼質量。持續整合保證了每天完成的任務都能夠成功整合到系統中,保持專...
java基礎複習(物件)
double integer valueof string string.valueof double integer int ns for int i 0 i 5 1 i for int j 0 j 5 1 i j if ns j 很簡單的乙個演算法,兩兩比較得到大的值然這個值繼續比較下乙個,最後...