JAVA字串String、StringBuffer、StringBuilder、基本資料型別包裝 ----java基礎一
String 字串:
Java中用String類進行描述。對字串進行了物件封裝,這樣的好處是可以對字串這種常見資料進行方便的操作。
字串String一旦被初始化就不可變,儲存位置在記憶體方法區的常量池裡。如果想要改變需要用StringBuffer函式
構造字串的兩種方法:
<span style="font-size:18px;">String s1 = "abc";//s1指向的記憶體(方法區的常量池)中只有一個物件abc String s2 = new String("abc");//兩個物件,一個是常量池中的abc一個是new物件 System.out.println(s1==s2);//false,==是用來判斷地址值的 System.out.println(s1.equals(s2));//true,equals是用來判斷其值的</span></span>
對於String類,有許多的API方法來呼叫,因為我們對於String類的要求必須熟練所以我就把經常用的API進行歸納
獲取
int length();獲取長度char charAt(int index)根據位置獲取位置上的某個字元
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在字串中出現的位置
判斷
boolean contains(str);字串中是否包含某一個子串特殊之處:indexof(str):可以索引str第一次出現位置,如果返回-1,表示該str不在字串中存在,所以,也可以用於對指定字串的判斷是否包含If(str.indexOf(“aa”)!=-1)
而且該方法既可以判斷,又可以獲取出現的位置。
boolean isEmpty();字元中是否有內容1.6版,原理就是判斷長度是否為0,“”,null有區別。
boolean startsWith(str);字串是否是以指定內容開頭
boolean endsWith(str);字串是否是以指定內容結尾
boolean equals(str);判斷字串內容是否相同,複寫了object類中的equals方法
boolean equalsIgnoreCase();判斷內容是否相同,並忽略大小寫
轉換
建構函式:string(char[])將字元陣列轉成字串
String(char[] ,offset,count);將字元陣列中的一部分轉成字串。
靜態方法
Static string copyValueof(char[]);將字元陣列中的一部分轉成字串。
Static string copyValueof(char[] data,int offset,int count);將字元陣列中的一部分轉成字串。
Static string Valueof(char[]);將字元陣列中的一部分轉成字串。
Char[]toCharArray();將字串轉成字元陣列***
String(byte[]);將字元陣列轉成字串
String(byte[] ,offset,count);將位元組陣列中的一部分轉成字串。
Byte[] getBytes();將字串轉成位元組陣列
Static string valueOf(int);將基本資料型別轉成字串
Static string valueOf(double);將基本資料型別轉成字串
3+””;//string.valueOf(3);將基本資料型別轉成字串
字串和位元組陣列在轉換過程中,是可以指定編碼表的。
替換
String replace(oldchar,newchar);切割
String[] split(regex);子串,獲取字串中的一部分
String substring(begin,end);
轉換,去除空格,比較
String toUpperCase();將字串轉成大寫String toLowerCase();將字串轉成小寫
String trim();將字串兩端的多個空格去除
Int compareTo(string);對兩個字串進行自然順序的比較
----------------------------------------------------------------------------------------------------------------------------------------------------------
StringBuffer字串緩衝區
StringBuffer:構造一個其中不帶字元的字串緩衝區,初始容量為16個字元,
StringBuffer與String的不同之處:
String是對一串字元進行操作,不可變類。
StringBuffer也是對一串字元進行操作,但是可變類。
String是物件,不是原始型別,為不可變物件,一但被建立就不能修改其值,對於已經存在的String物件的修改都是重新建立一個新的,然後把新的值儲存進去。
String類是final類,即不能被繼承。
StringBuffer是一個可變物件,當對他進行修改時不會想String那樣重新建立物件,它只是通過建構函式來建立。
StringBufer sb=new StringBuffer();
sb=“adc”;//error
物件被建立後,在記憶體中就會分配空間
sb.append("abc")
所以StringBuffer是一個容器,大小可以控制,容器內可以儲存任意型別的資料,最後才變成單個字串
正因為是可變容器,那它就有了對容器內有了增刪查改的功能了
儲存
StringBuffer append():將指定資料作為引數新增到已有資料結尾處
StringBuffer insert(index, 資料);可以將資料插入到指定位置
刪除
StringBuffer delete(int start,int end);刪除緩衝區中的資料,包括頭不包括尾。
StringBuffer deleteCharAt(index);刪除指定位置的字元。
獲取
char charAt(int index)
int indexOf(String str)
int lastindexOf(String str)
int length()
String substring(int start,int end)
修改
StringBuffer replace(int start,int end,String str)替換一部分
void setCharAt(int index,char ch)替換一個字元
反轉
StringBuffer reverse();這個功能能將字串內的字元位置互換,比較常用
將緩衝區中指定資料儲存到指定字元陣列中。
void getChars(int srcBegin,int srcEnd,char[]dst,int dstBegin)
-----------------------------------------------------------------------------------
StringBuilder字串緩衝區(JDK1.5新特性)
在JDK1.5的新特性裡出現了StringBuilder,它的功能和StringBuffer一樣,但只有一點是不一樣的:StringBuilder與StringBuffer不同之處:
1,StringBuilder執行緒不同步不安全,它是不加鎖的併發介面
2,單執行緒裡StringBuilder效率高.
<span style="font-size:18px;">StringBuilder sb = new StringBuilder("abcdefg");//使用緩衝區先要建立物件
sb.append("ak"); //abcdefgak
sb.insert(1,"et");//aetbcdefg
sb.deleteCharAt(2);//abdefg
sb.delete(2,4);//abefg
sb.setLength(4);//abcd
sb.setCharAt(0,'k');//kbcdefg
sb.replace(0,2,"hhhh");//hhhhcdefg</span>
<span style="font-size:18px;">class Test{
public static void main(String[] args) {
String s1 = "java";
String s2 = "hello";
method_1(s1,s2);
System.out.println(s1+"...."+s2); //java....hello
StringBuilder s11 = new StringBuilder("java");
StringBuilder s22 = new StringBuilder("hello");
method_2(s11,s22);
System.out.println(s11+"-----"+s22); //javahello-----hello
}
public static void method_1(String s1,String s2){
s1.replace('a','k');
s1 = s2;
}
public static void method_2(StringBuilder s1,StringBuilder s2){
s1.append(s2);
s1 = s2;
}
}
</span>
----------------------------------------------------------------------------------------------------------------------------------------------------------
基本資料型別包裝
根據JAVA面向物件的思想將基本資料型別物件包裝成物件
關鍵字(基本資料型別)對應的類名(引用資料型別)
byte Byte
short Short
int Integer
long Long
boolean Boolean
float Float
double Double
char Character
基本資料型別物件包裝類都有XXX parseXXX方法
作用:基本資料型別和字串型別之間的轉換
基本資料型別轉為字串.
方式一:基本資料型別+" "
方式二:基本資料型別.toString(基本資料型別值)
字串轉為基本資料型別
<span style="font-size:18px;">xxx a = Xxx.parseXxx(string);
int a = Integer.parselnt(string);//這是靜態呼叫(必須是資料格式的字串)
int num = (new Integer("123").intValue);//非靜態呼叫</span>
好處:提供方法來進行自由轉換,有了物件可以提高效率
例如:十進位制轉其他進位制:toBinarySting();其他進位制轉為十進位制:parselnt(string,radix);
JDK1.5版本之後,對基本資料型別物件包裝類進行升級.例如:
Integer i = 4;//自動裝箱,隱式升級
i= i+5;//先將i轉為int型別再相加,這是隱式的轉換
<span style="font-size:18px;">public class IntegerDemo1 {
public static void main(String[] args) {
System.out.println(Integer.MAX_VALUE);
//Integer x=new Integer(4);
Integer x=4;//自動裝箱。1.5中可以這樣寫。//4等同於new Integer(4);null為空時,亦丟擲異常
x=x+2;/ *拆箱原理:x.intValue()*///x+2:x進行了自動拆箱,變成了int型別,和2進行加法運算,
//再將和進行裝箱賦給x
Integer m=128;
Integer n=128;
sop("m==n:"+(m==n));//結果:false
Integer a=127;
Integer b=127;
sop("a==b:"+(a==b));//結果:true。因為a和b指向了同一個Integer物件
//因為當數值在byte範圍-128-127內容,對於新特性,如果該數值已經存在,則不會在開闢新的空間。
}
public static void method()
{Integer x=new Integer("123");
Integer y=new Integer(123);
sop("x==y"+(x==y));
sop("x.equals(y):"+x.equals(y));
}
public static void sop(String str)
{
System.out.println(str);
}
}
</span>
---------------------------------------------------------------------------------------------------------------------------------------------------------
int和Integer的區別
int與integer的區別從大的方面來說就是基本資料型別與其包裝類的區別:
int 是基本型別,直接存數值,而integer是物件,用一個引用指向這個物件。
1.Java 中的資料型別分為基本資料型別和複雜資料型別
int 是前者而integer 是後者(也就是一個類);因此在類進行初始化時int類的變數初始為0.而Integer的變數則初始化為null.
2.初始化時:
int i =1;Integer i= new Integer(1);(要把integer 當做一個類看);但由於有了自動裝箱和拆箱
使得對Integer類也可使用:Integer i= 1;
int 是基本資料型別(面向過程留下的痕跡,不過是對java的有益補充),Integer 是一個類,是int的擴充套件,定義了很多的轉換方法
類似的還有:float Float;double Double;string String等,而且還提供了處理 int 型別時非常有用的其他一些常量和方法
舉個例子:當需要往ArrayList,HashMap中放東西時,像int,double這種內建型別是放不進去的,因為容器都是裝 object的,這是就需要這些內建型別的外覆類了。
Java中每種內建型別都有相應的外覆類。
Java中int和Integer關係是比較微妙的。關係如下:
1.int是基本的資料型別;
2.Integer是int的封裝類;
3.int和Integer都可以表示某一個數值;
4.int和Integer不能夠互用,因為他們兩種不同的資料型別;
舉例說明
ArrayList al=new ArrayList();
int n=40;
Integer nI=new Integer(n);
al.add(n);//不可以
al.add(nI);//可以
並且泛型定義時也不支援int: 如:List<Integer> list = new ArrayList<Integer>();可以
而List<int> list = new ArrayList<int>();則不行
總而言之:如果我們定義一個int型別的數,只是用來進行一些加減乘除的運算or作為引數進行傳遞,那麼就可以直接
宣告為int基本資料型別,但如果要像物件一樣來進行處理,那麼就要用Integer來宣告一個物件,因為java是面向對
象的語言,因此當宣告為物件時能夠提供很多物件間轉換的方式,與一些常用的方法。自認為java作為一們面向物件
的語言,我們在宣告一個變數時最好宣告為物件格式,這樣更有利於你對面向物件的理解。