------Java教育訓練、Android教育訓練、iOS教育訓練、.Net教育訓練、期待與您交流! -------
一.String
1.概述:
java中用String類進行描述。對字元串進行了對象的封裝。這樣的好處是可以對字元串這種常見資料進行友善的操作。對象封裝後,可以定義N多屬性和行為。
String是字元串的類類型,用于描述字元串事物。
2.特點:
一旦被初始化就不可以被改變。存放在方法區中的常量池中。
3.面試題:
String s1 = "abc";
String s2 = new String("abc");
String s3 = "abc";
s1和s2有什麼差別?
s1在記憶體中有一個對象abc。
s2在記憶體中有兩個對象abc、new。
s1==s2 ( false )
s1.equals(s2) ( true )
String類複寫了Object類中的equals方法,該方法用于判斷字元串是否相同。
s1==s3 ( true )
因為“abc”這個字元串對象已經在記憶體中存在,作為字元串這種特殊的對象,這種在常量池中存在的資料。s3進行初始化時,發現abc已經在記憶體中存在,就不會再獨立開辟空間,因為再開辟空間就比較浪費空間。是以為了節約記憶體,在字元串對象當中隻要字元串相同,那麼s1和s3就指向同一個對象。
4.操作字元串方法:
1)、擷取:
1.1 擷取字元串的長度:int length();
1.2 根據位置擷取位置上某個字元:char charAt(int index);
1.3 根據字元擷取該字元在字元串中位置:
int indexOf(int ch);傳回的是ch在字元串中第一次出現的位置。
int indexOf(int ch, int fromIndex);從fromIndex指定位置開始,擷取ch在字元串中出現的位置。
int indexOf(String str);傳回的是str在字元串中第一次出現的位置。
int indexOf(String str, int fromIndex);從fromIndex指定位置開始,擷取str在字元串中出現的位置。
int lastIndexOf();反向索引。
2)、判斷:
2.1 字元串中是否包含某一個子串:boolean contains(str);
特殊之處:indexOf(str)可以索引str第一次出現的位置,如果傳回-1表示該str不在字元串中存在。是以,也可以用于對指定判斷是否包含。
2.2 字元串中是否有内容(長度是否為0):boolean isEmpty();
2.3 字元串是否以指定内容開頭:boolean startsWith(str);
2.4 字元串是否以指定内容結尾:boolean endsWith(str);
2.5 判斷字元串内容是否相同:boolean equals(str);
2.6 判斷内容是否相同,并忽略大小寫:boolean equalsIgnoreCase();
3)、轉換:
3.1 将字元數組轉成字元串:
構造函數:
String(char[]);
String(char[],offset,count):将字元數組的一部分轉成字元串。
靜态方法:
static String copyValueOf(char[]);
static String copyValueOf(char[] data, int offset, int count);
static String valueOf(char[]);
3.2 将字元串轉成字元數組:char[] toCharArray();
3.3 将位元組數組轉成字元串:
String (byte[]);
String(byte[],offset,count);将位元組數組中的一部分轉成字元串。count表示個數。
3.4 将字元串轉成位元組數組:
byte[] getBytes();
3.5 将基本資料類型轉成字元串:
StringvalueOf(int);
StringvalueOf(double);
特殊:字元串和位元組數組在轉換過程中,是可以指定編碼表的。
4)、替換:
String replace(oldchar,newchar);
5)、切割:
String[] split(regex);
6)、子串。擷取字元串中的一部分。
String substring(begin);
String substring(begin,end);注:包含頭,不包含尾。
7)、轉換,去除空格,比較。
7.1 将字元串轉成大寫或小寫:
String toUpperCase();
String toLowerCase();
7.2 将字元串兩端的多個空格去除:
String trim();
7.3 對兩個字元串進行自然順序的比較:
int compareTo(string);
注:如果參數字元串等于此字元串,則傳回值0;如果此字元串按字典順序小于字元串參數,則傳回一個小于0的值;如果此字元串按字典順序大于字元串參數,則傳回一個大于0的值。
這7中字元串操作方法代碼展現:
(代碼 StringMethodDemo.java):
class StringMethodDemo
{
public static void main(String[] args)
{
method_get();//擷取
method_is();//判斷
method_trans();//轉換
method_replace();//替換
method_split();//切割
method_sub();//擷取子串
method_7();
}
public static void sop(Object obj)
{
System.out.println(obj);
}
public static void method_get()//擷取
{
String str = "abcdec";
sop(str.length());//長度
sop(str.charAt(3));//根據索引擷取字元
sop(str.indexOf('c',3));//根據字元擷取索引
sop(str.lastIndexOf('b'));//反向索引
}
public static void method_is()//判斷
{
String str = "StringMethodDemo.java";
sop(str.startsWith("String"));//判斷檔案名稱是否是String單詞開頭。
sop(str.endsWith(".java"));//判斷檔案名稱是否是.java的檔案。
sop(str.contains("Demo"));//判斷檔案中是否包含Demo。
}
public static void method_trans()//轉換
{
char[] arr = {'a','b','c','d','e'};
String s = new String(arr);//将字元數組轉成字元串。
String s1 = new String(arr,1,3);//注意:1是從角标1開始,3是個數。
sop("s= "+s);
sop("s1= "+s1);
//将字元數組轉成字元串。
String str = "asdfg";
char[] chs= str.toCharArray();
for(int x=0;x<chs.length;x++)
sop("ch="+chs[x]);
}
public static void method_replace()//替換
{
String s = "hello java";
String s1 = s.replace('a','n');
sop("s="+s);
sop("s1="+s1);
}
public static void method_split()//切割
{
String s = "zhangsan,lisi,wangwu";
String[] arr = s.split(",");
for(int x =0;x<arr.length;x++)
sop(arr[x]);
}
public static void method_sub()//擷取子串
{
String s = "abcdef";
sop(s.substring(2));//從指定位置到結尾。
sop(s.substring(2,4));//包含頭,不包含尾。
}
public static void method_7()
{
String s = " Hello Java ";
sop(s.toUpperCase());//大寫
sop(s.toLowerCase());//小寫
sop(s.trim());//将字元串兩端的多個空格去除。
String s1 = "acc";
String s2 = "aaa";
sop(s1.compareTo(s2));//對兩個字元串進行自然順序的比較。
}
}
5.字元串操作練習:
(代碼 StringTest.java):
//練習1:将一個字元串進行反轉。
/*
思路:
1,将字元串變成數組。
2,将數組反轉。
3,将數組變成字元串。
*/
class StringTest
{
public static void main(String[] args)
{
String s = "abcd";
System.out.println(s);
System.out.println(reverseString(s));
}
public static String reverseString(String str)
{
char[] chs = str.toCharArray();
reverse(chs);
return new String(chs);
}
//反轉指定字元數組位置
private static void reverse(char[] arr)
{
for(int start=0,end=arr.length-1;start<end;start++,end--)
{
swap(arr,start,end);
}
}
//交換相應數組元素
private static void swap(char[] arr,int x,int y)
{
char temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
}
(代碼 StringTest2.java):
//練習2:擷取一個字元串在另一個字元串中出現的次數。
class StringTest2
{
public static void main(String[] args)
{
String str = "asddfgddhhjkdd";
System.out.println(getSubCount(str,"dd"));
}
public static int getSubCount(String str,String key)
{
int count = 0;
int index = 0;
while((index=str.indexOf(key))!=-1)
{
System.out.println(str);
str = str.substring(index+key.length());
count++;
}
return count;
}
}
(代碼 StringTest3.java):
//擷取兩個字元串中的最大相同子串。
/*
思路:
1、将短的一個字元串與長的進行比較,
如果沒有,則将短串的字串按長度遞減的方式擷取。
2、将每次擷取的子串,去長串中判斷是否包含,包含即找到。
*/
class StringTest3
{
public static void main(String[] args)
{
String s1="asdfhellosfg";
String s2="frhelloy";
System.out.println(getMaxSubstring(s1,s2));
}
public static String getMaxSubstring(String s1,String s2)
{
String max,min;
max=(s1.length()>s2.length())?s1:s2;
min=(s1.length()<s2.length())?s1:s2;
for (int x=0;x<min.length() ;x++ )
{
for (int y=0,z=min.length()-x;z<min.length()+1;y++,z++)
{
String temp=min.substring(y,z);//擷取短字元串子串
if(max.contains(temp))//如果長串包含,則表示找到
return temp;
}
}
return "沒有相同的字元串";
}
}
二.StringBuffer
1.概述:
字元串緩沖區,可以對字元串進行增删改查操作,StringBuffer是一個容器。
2.特點:
1)、長度可變。
2)、可以位元組操作多個資料類型。
3)、最終會通過toString方法變成字元串。
3.與數組差別:
1)、StringBuffer長度是可變化的。(數組是固定的)。
2)、StringBuffer可以直接操作多個資料類型。(數組隻能操作一個)。
4.容器中的方法:
1)、添加。
StringBuffer append(data):在緩沖區中添加資料。添加到尾部。
StringBuffer insert(index,data):在指定位置插入資料。
2)、删除。
StringBuffer delete(start,end);删除從start至end-1範圍的元素(包含頭,不包含尾)。
StringBuffer deleteCharAt(index);删除指定位置的元素。
注意:例子:sb.delete(0,sb.length());清空緩沖區(包含頭,不包含尾)。
3)、擷取(查找)。
int indexOf(string); 傳回指定子字元串在此字元串中第一次出現處的索引。沒有就傳回-1。
int indexOf(string,int fromIndex);從指定位置開始查找字元串。
int lastIndexOf(string); 傳回指定子字元串在此字元串中最右邊出現處的索引。
int lastIndexOf(string,int fromIndex); 從指定的索引開始反向搜尋。
string substring(start); 傳回start到結尾的子串。
string substring(start,end); 傳回start至end-1的子串。
4)、修改。
StringBuffer replace(start,end,string);将start至end-1替換成string。(包含頭,不包含尾)。
void setCharAt(index,char);替換指定位置的字元。
void setLength(len);将原字元串置為指定長度的字元串。
5)、反轉。
StringBuffer reverse();字元串反轉,如果String想反轉就要轉換成StringBuffer再反轉。
6)、将緩沖區中指定資料存儲到指定字元數組中。
void getChars(int srcBegin, int srcEnd,char[] dst,int dstBegin)
三.StringBuilder
1.JDK1.5 版本之後出現了StringBuilder。
2.StringBuffer與StringBuilder差別:
1)、StringBuffer是線程同步。(安全)
2)、StringBuilder是線程不同步。(不安全)
以後開發,建議使用StringBuilder。提高效率。如果遇到多線程,使用StringBuffer或自己加鎖。
3.更新三因素:
1)、提高效率。
2)、簡化書寫。
3)、提高安全性。
四.基本資料類型對象包裝類
1.概念:是按照面向對象思想将基本資料類型封裝成了對象。
2.好處:
1)、可以通過對象中的屬性和行為操作基本資料。
2)、可以實作基本資料類型和字元串之間的轉換。
3.基本資料類型對象包裝類:
byte Byte
short Short
int Integer
long Long
boolean Boolean
float Float
double Double
char Character
4.基本資料類型轉成字元串:
基本資料類型+" "
基本資料類型.toString(基本資料類型值);
例如:Integer.toString(34);//将34整數變成"34"。
5.字元串轉成基本資料類型:
xxx a=Xxx.parseXxx(string);
例如:
int a = Integer.parseInt("123");靜态。注意:必須傳入數字格式的字元串。
boolean b = Boolean.parseBoolean("true");
Integer i = new Integer("123");
int num = i.intValue();//跟上面的靜态方式的結果一樣,但這種屬于對象調用方式。
6.十進制轉成其他進制。
轉成二進制:toBinaryString
轉成八進制:toOctalString
轉成十六進制:toHexString
7.其他進制轉成十進制。
parseInt(String,radix);
例如:
int x = Integer.parseInt("110",10);
int a = Integer.parseInt("3c",16);
8.在jdk1.5版本後,對基本資料類型對象包裝類進行更新。在更新中,使用基本資料類型對象包裝類可以像使用基本資料類型一樣,進行運算。
Integer i = new Integer(4); 1.5版本之前的寫法。
Integer i = 4; 自動裝箱,1.5版本後的寫法。
i = i + 2; i進行自動拆箱。變成了int類型。和2進行加法運算。再将和進行裝箱賦給i。
9.小知識點:
Integer x=128;
Integer y=128;
x==y (false)
Integer m=127;
Integer n=127;
m==n ( true)
在裝箱時,如果數值在byte範圍之内,那麼數值相同,不會産生新的對象,也就是說多個數值相同的引用指向的是同一個對象。