1. 程式人生 > >JAVA字串String、StringBuffer、StringBuilder、基本資料型別包裝 ----java基礎一

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作為一們面向物件

的語言,我們在宣告一個變數時最好宣告為物件格式,這樣更有利於你對面向物件的理解。