java字符串

字符串不是java主要的數據類型,而是java標準庫中的一個String類。每個用雙引號引發來的字符串就是String類的一個實例。如:String name="Tonny"javascript

1.字符串的構造

第一種方式:java

String name="Tonny"

另一種方式:面試

String name=new String("Tonny");

第三種方式:json

byte[] arr = {65, 66, 67, 68};
 String s = new String(arr); //s=ABCD

第四種方式:api

byte[] arr = {65, 66, 67, 68,69};
String s = new String(arr, 1, 4); //s=BCDE

2.子串

使用substring可以從一個較大的字符串中提取一個子串。比方:數組

String greeting="HelloWorld!";
 System.out.println(greeting.substring(2));//llo World!
 System.out.println(greeting.subSequence(2, 6));//lloW 

substring() 接受一個參數時,參數爲子串開始位置,字符串從0開始計算位置。
substring()接收2個參數時分別爲開始位置和結束位置,截取的字符串包括開始位置不包括結束位置。安全

3.拼接

使用」+」可以拼接2個字符串。ruby

好比。markdown

String str1="Hello";
 String str2="World!";
 String str3=str1+str2;
 System.out.println(str3);//HelloWorld

一個字符串和和一個非字符串進行拼接時,後者被轉換爲字符串類型。在java中不論什麼一個字符串對象都可以轉換爲字符串。ide

4. 不可變字符

java中沒有改動字符串的方法,java使用拼接再賦值的方式來實現字符串的改動。原來的字符串仍然存在,僅僅是變量指向了新的字符串而已。

hello永遠是包括h、e、l、l、o的代碼單元序列。

5.檢查字符串是否相等

這個問題經常出現在各類筆試、面試題中。

字符串的equals方法用來檢查2個字符串的值是否相等,==比較的是2個字符串的地址是否一樣,便是否指向的是同一個字符串。

使用substring、+截取或者拼接的字符串儘管內容同樣,但是地址不同。

String a="ucas";
 String b=a.substring(0,3)+"s";
 System.out.println("ucas".equals(a));//true
 System.out.println(a.equals(b)); //true
 System.out.println(a==b); //false

6.空串與Null串

空串是一個String 對象,內容爲空。長度爲0。

null表示沒有對象和它關聯。

推斷一個字符串對象是否是爲空串:

if(str.length==0)
或者
if(str.equals(""))

檢查一個對象既不爲null也不爲空:

if(str!=null&&str.length!=0)

7.字符串Api

  • boolean endwith()推斷字符串後綴
  • equalIgnoreCase()忽略大寫和小寫比較
  • int indexOf() 子串首次出現位置
  • int lastIndexOf() 返回字符串最後一次出現位置
  • int length() 返回字符串長度
  • boolean startWith(prefix)推斷字符串是否以prefix開頭
  • String toLowerCase 轉爲小寫
  • String toUpperCase 轉爲大寫
  • String trim()刪除尾部空格

8.字符串的本質

地址比較:
字符串」abc」在常量池中,s1和s2指向的是同一個對象,所以不管是比較地址仍是比較值結果都是同樣的。

String s1 = "abc";
  String s2 = "abc";
  System.out.println(s1 == s2); //true
  System.out.println(s1.equals(s2)); //true

再看如下的樣例:

String s1 = "abc";
   String s2 = new String("abc");
   System.out.println(s1 == s2);        //false
   System.out.println(s1.equals(s2));   //true

這時,s1指向的是字符串常量池中的」abc」。s2是字符串對象,位於堆內存中,所以s1和s2的地址不同,不是同一個對象,字符串值同樣。

9 字符串切分

String str1 = "abc,def,hig";
 String[] strArr = str1.split(",");
 for(String str:strArr){
    System.out.println(str);
 }

打印結果:

abc
def
hig

特殊的字符需要轉義,比方,.自己是正則表達式中的佔位符,使用\轉成英文實心句號:

String str1 = "abc.def.hig";
String[] strArr = str1.split("\\.");

10.字符串轉字符數組

String s = "ab你好";
 char[] cArr = s.toCharArray();
 for (char c : cArr) {
     System.out.println(c);
 }

打印結果:

a
b
你
好

11.字符串按字典順序排序

使用TreeSet:

String[] strArr = {"recursive", "raw", "platform", "rank", "register", "symbol"};

TreeSet treeSet = new TreeSet<>();

for (String str : strArr) {
    treeSet.add(str);
}

System.out.println(treeSet);

12.按字典順序逆序排序

逆序排序僅僅需要在TreeSet實現Comparator接口,重寫compare()方法:

String[] strArr = {"recursive", "raw", "platform", "rank", "register", "symbol"};

TreeSet treeSet = new TreeSet<>(new Comparator() {
   @Override
   public int compare(Object o1, Object o2) {
     return o2.toString().compareTo(o1.toString());
            }
   });
   for (String str : strArr) {
        treeSet.add(str);
   }
   System.out.println(treeSet);

結果:

[symbol, register, recursive, raw, rank, platform]

13.StringBuffer和StringBuilder

StringBuffer是字符串緩衝區, 線程安全,單線程操做單時候也要不停的推斷鎖,後來獨立出來一個StringBuilder,線程不安全。但是速度快。

相關文章
相關標籤/搜索