1.String 類:
java用於描述字符串數據的對象。
特點:String類型一旦初始化就不能再被賦值,因爲是常量。字符串存儲在字符串常量池中,實現數據共享。常量池的好處:不用每次都開闢空間,每次創建字符串對象之前,都會在字符串常量池中查找,如果有,就直接獲取其地址,若沒有則創建一個,方便下次使用。
2. "abcd"和new String("abcd")的區別:
"abcd":在字符串常量池中創建的一個"abcd"對象;new String("abcd"):在堆內存通過new創建了一個String類型的對象且在常量池中創建了一個"abcd"對象,並稱其地址傳給了堆內存new對象的構造函數。
記住:一般比較對象用的都不是==,而是equals,string重寫equals方法,定義了自己對象相同的比較方式。用來比較字符串是否相同。
indexOf(str,fromindex): 獲取子串str在字符串從索引fromindex開始第一次出現的位置;
length(): 獲取字符串的長度;
charAt(int a): 某位置上的字符;
indexOf(char):獲取字符char在字符串中第一次出現的位置;
replace(str,key):用字符串str來替換字符串中的一部分字符串key;
replace(target,replacement):用replacement來替換目標位置target的字符串;
subString(begin,end):取出begin到end間的一部分字符串;取出的是begin到end-1的值;
tocharArray():將字符串變成很多字符;返回char[];
LastindexOf():從後往前獲取第一次出現的位置,但角標還是從前往後的。
4.通過練習學習String類的方法。
1.練習一:兩個字符串的最大相同子串。
思路:
1.通過字符串的長度來判斷長串和短串;
2.獲取短串的所有子串(也可以獲取長串的子串,只是相對效率較低);
3.再判斷從長到短的子串是否包含於長串中,如果包含在其中,則返回該子串。
包含的方法:
length():獲取字符串的長度,返回值類型int。
substring(i,j):獲取字符串i角標到j-1角標的子串,返回值類型爲String。
contains(s):判斷字符串s是否包含在另一字符串中,返回值類型爲boolean。
2.練習二:將字符串按自然順序排序。
思路: 1.以前學過數組排序,所以先將字符串轉爲一個字符數組;
2.對字符數組中的元素進行排序,和整型數組元素排序差不多,比大小;
3.最後再將字符數組轉爲一個新的字符串。
或者直接用Arrays類的方法sort快速排序,效率最高。
包含的方法:
toCharArray():將字符串轉爲字符數組,返回char[] 類型。
new String(char[] ch):將一個字符數組轉爲新的字符串;
copyValueOf(char[] ch):返回數組組成的新字符串;返回類型是String;
valueOf(char[] ch):返回數組組成的新字符串;返回類型是String;
或者直接用Arrays.sort(char[] ch);
3.練習三:將字符串反轉,如absdf-->fdsba.
思路:將字符串中的字符進行頭尾置換,頭自增,尾自減,直到頭>尾結束置換,再返回字符串。
包含的方法:
charAt(int index):返回index角標的字符。
4.練習四:對字符串數組進行排序。
思路:和整型數組排序是一樣的,通過String類的compareTo方法來比較字符串的大小,如果結果大於0,則交換位置。
包含的方法:compareTo(String s):返回值爲int型。
5.練習五:對字符串數組取最值。
思路:先定義一個max來存儲最大值的角標,初始化爲0,然後通過比較compareTo方法將數組中
的每個元素與最大值比較,其它和整型數組中求最值一樣。
使用的方法:compareTo(String s):返回值爲int型。
5.字符串緩衝區StringBuffer
1.特點: 1.它是一個容器,可以存儲任意類型的數據元素;
2.它的長度是可變的;
3.內部有synchronized,可用於多線程同步,安全;
4.可以對其中存入的內容和長度進行修改;
5.具備容器的基本方法:添加、刪除、修改、獲取;
6.裏面的數據最終還是會轉成字符串數據給別人使用。
2.基本方法:
添加: append(Object obj):添加obj到StringBuffer中已有數據的後面;
如:
StringBuffer sb=new StringBuffer();
sb.append("df").append(98).append('d');
insert(index,obj)://將obj插入到角標爲index處,返回一個新的字符串。
如:sb.insert(2,"dfs");
刪除:delete(start,end):刪除角標爲start到end-1之間的字符串;
需要注意的是:若end>count,則默認爲end=count;若start<0,則拋出異常。
如:sb.delete(0,sb.length):清空緩衝區;
deleteCharAt(index):刪除index角標處的單個字符。
如:sb.deleteCharAt(3);
修改:replace(start,end,str):用str替換角標爲start到end-1的一部分字符串;
如:sb.replace(1,3,"ds");
setCharAt(index,str):將index處的字符用str替換,即替換單個字符;返回類型爲void;
如:sb.setCharAt(2,"ds");
獲取:indexOf(s):獲取s在另一個字符串中的位置,返回int類型;
length():獲取字符串的長度;
setLength(i):設置字符串的長度爲i;如:setLength(0):清空緩衝區。
reverse():反轉字符串;
等等方法。
思考題:既然數組和StringBuffer都是容器,有什麼區別?
區別: 1.數組長度是固定的,而StringBuffer的長度是可變的;
2.數組一旦定義必須明確存儲的元素類型,而StringBuffer存儲的是任意類型的;
3.數組可以通過索引獲取元素,而StringBuffer在調用時,只能將其轉成字符串,無法直接使用其中單個元素。
3.StringBuffer內部原理:
1.其實該類中用於存儲數據的容器就是數組,類型爲char,調用的時候轉成字符串再使用;
2.內部是一個長度可變的數組;
數組長度可變原理:創建StringBuffer對象時,就會建立一個數組實體,長度是16個字符,如果超出16個字符,就會新創建一個
長度規律增長的數組,將原數組的元素複製到新的數組,並將新元素添加到新數組中。
4.使用條件:只要有多種類型的數據,並最終要變成字符串,就可以使用StringBuffer。
6.SringBuilder:出現在JDK1.5版本後。
StringBuffer和StringBuilder的區別:
StringBuffer:能用於多線程,同步安全,但效率低,適用於多線程;
StringBuilder:用於單線程不同步,但效率高,適用於單線程。
7.基本數據類型對象包裝類
共八中基本數據類型:byte,int,char,long,float,double,short,boolean.
1.最常用的Integer:被final修飾,不能再被繼承。
將int類型封裝成對象,作用之一是提供了能在int類和String類型之間相互轉換的方法。
★ 基本數據類型base-->字符串
1.通過+"";
2.通過String類的valueOf(base)方法;
3.通過Integer類中的構造函數+toString();如:Integer i=new Integer("12");i.toString();
4.通過Integer類中的靜態函數 toString(base);如:Integer.toString(3);
★ 字符串-->基本數據類型base
1.通過Integer類的構造函數+intValue();
2.通過Integer類的靜態方法 parseInt(str);
注意:這裏的str只能是數字格式的字符串,如果不是,則會拋出異常,但是又沒處理,所以繼承了RuntimeException,
不用標識出來,標識出來是因爲可以處理,預先給出處理方案。
parseInt(str):可以將其他進制轉換爲十進制,因爲默認爲十進制。
parseInt(str,基數):標示str爲基數進制的數字格式字符串。
2.基類對象包裝類的特性(JDK1.5後):
★ 自動裝箱拆箱:
如:Integer i=new Integer(3);
可以寫成Integer i=3;這就叫自動裝箱,在內部實現了Integer.valueOf(3),將3變成了一個對象賦給i;
i=i+3;這叫自動拆箱;在內部先將對象i轉爲整數即i.intValue(),這時再加3,自動拆箱過程;
全寫:Integer i=Integer.valueOf(i.intValue()+3);
作用:簡化書寫,但有弊端。
弊端:如果Integer i=null; i就不能調用intValue方法了,會編譯失敗。
注意:自動裝箱時,如果參數在byte範圍[-128,127]內,則valueOf方法返回同一個對象,否則返回一個新的對象。
如:
Integer i=128;
Integer j=128;
System.out.println(i==j);
//結果爲false,因爲128不在byte範圍[-128,127]內,所以i和j都各自返回一個新的對象。