常用類--String

一、String

1.1 String是不可變對象

  • String的底層是一個 char類型字元數組
  • String類是final修飾的,不能被繼承,不能改變,但引用可以重新賦值
  • String採用的編碼方式是Unicode方式
  • 通過 new 創建的字元串對象,每一次new都會申請一個記憶體空間,雖然內容相同,但是地址值不同;
  • 以「」方式給出的字元串,只要字元序列相同(順序和大小),無論在程式程式碼中出現幾次,JVM都會建立一個 String 對象,並在 字元串池 中維護。
  • String是一個引用類型

1.2 String常量池

  • java為了提高性能,靜態字元串在 常量池 中創建並且是同一對象,使用時 直接拿去用;
  • 對於重複的字元串直接量會在jvm會去常量池中查找,如果有則返回,無則創建
public class string01 {
    public static void main(String[] args) {
        //在常量池中查找,沒有創建一個
        String s="Hello";
        //在常量池中查找,有的話不會創建新對象
        String s1="Hello";
        System.out.println(s==s1);//true
        String s2=new String("Hello");//新建一個對象
        System.out.println(s1==s2);//false
    }
}

 

  • String s= new String("a");創建了幾個對象?
  • 兩個或一個,如果常量池中有a則返回總共1個,如果沒有則創建a,加上new關鍵字是2個

1.3 String構造方法

package cn.tedu.day02;

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;

import java.io.UnsupportedEncodingException;

public class String02 {

    public static void main(String[] args) throws UnsupportedEncodingException {
        /*
        * String的構造方法:1、無參構造*/
        String s=new String();
        System.out.println(s);
        /*
        * utf-8*/
        String s1=new String(new byte[]{'1','2','3','4'},1,3,"utf8");
        System.out.println(s1);
        String s2=new String(new char[]{'H','e','l','l','o'});
        System.out.println(s2);
        String s3=new String(new char[]{'A','B','C'},1,2);
        System.out.println(s3);
        String s4=new String(new int[]{'1','2','3'},1,2);
        System.out.println(s4);
        String s5=new String(new StringBuffer("high"));
        System.out.println(s5);
        String s6=new String(new StringBuilder("agh"));
        System.out.println(s6);
    }
}

 

 

1.4.1 String的判斷方法

boolean equals(Object obj):比較字元串的內容是否相同

boolean equalsIgnoreCase(String str): 比較字元串的 內容 是否 相同,忽略大小寫

boolean startsWith(String str): 判斷 字元串對象 是否 以指定的 str 開頭

boolean endsWith(String str): 判斷 字元串對象 是否 以指定的 str 結尾

package cn.tedu.day02;

public class String03 {
    public static void main(String[] args) {
        String s="abc";
        String s1="Aac";
        String s2=new String("abc");
        /*第一種比較的方式*/
        System.out.println(s==s2);//f 比較的對象,比較的地址值
        System.out.println(s.equals(s2));
        //2、不區分大小寫
        System.out.println(s.equalsIgnoreCase(s1));
        //3、判斷以什麼開始
        System.out.println(s.startsWith("ab"));
        //4、判斷以什麼結束
        System.out.println(s.endsWith("c"));
    }

}

 

1.4.2 String的截取

  • int length(): 獲取 字元串 的 長度,其實也就是字元個數
  • char charAt(int index): 獲取 指定 索引處 的 字元
  • int indexOf(String str): 獲取 str 在字元串 對象 中第一次出現的索引
  • String substring(int start): 從 start 開始 截取 字元串
  • String substring(int start,int end): 從 start 開始,到 end 結束 截取字元串。前包後不包
public class String04 {
    public static void main(String[] args) {
        String s="Hello";
        String s1="liyimeng";
        String s2=new String(new char[]{1,2,3});
        System.out.println(s.length());//5
        System.out.println(s1.length());//8
        System.out.println(s2.length());//3
        //第一種;charAt:根據索引找字元串
        System.out.println(s.charAt(2));//h
        //第二種:indexOf:根據字元串找索引
        System.out.println(s.indexOf("H"));//0
        System.out.println(s1.indexOf('y',2));//2
        //第三種:substring
        System.out.println(s.substring(1));//ello
        //第四種:substring(前包後不包)字元串沒變,創建了一個新串
        System.out.println(s.substring(1,4));//ell

 

1.4.3 String的轉換

  • char[] toCharArray():把字元串轉換為字元數組
  • String toLowerCase():把字元串轉換為小寫字元串
  • String toUpperCase():把字元串轉換為大寫字元串
import java.util.Arrays;
import java.util.Locale;

public class String05 {
    public static void main(String[] args) {
        String s="l y m";
        //1、toCharArray把字元串轉化為字元數組
        char c[]=s.toCharArray();
        System.out.println(Arrays.toString(c));
        c=new char[]{'H','e','l','l','o'};
         String s1=new String(c);
        System.out.println(s1);
        //2、toUpperCase全部變大寫
        System.out.println(s.toUpperCase(Locale.ROOT));
        //3、toLowerCase全部變小寫
        System.out.println(s.toLowerCase(Locale.ROOT));
    }
}

 

1.4.4 其他方法

  • String trim(): 去除 字元串 兩端空格
  • String[] split(String str): 按照 指定符號 分割 字元串
import java.util.Arrays;

public class String06 {
    public static void main(String[] args) {
        String s="  hello  world  ";
        //trim:去除字元串兩端空格(中間的不去)字元串不可變
        System.out.println(s.trim());
        //split:分割字元串
        System.out.println(s.length());
        System.out.println(Arrays.toString(s.split("h")));
        System.out.println(s.length());
        String s2="www.baidu.com";
        //1、獲取兩個點的索引
        int start=s2.indexOf(".");
        int end=s2.lastIndexOf(".");
        String result=s2.substring(start+1,end);
        System.out.println((result));
        //String api中的方法進行測試
    }
}

 


1.5 StringBuilder

1.5.1 可變字元串

  • StringBuilder 是 一個執行緒 非安全 的 可變字元序列
  • StringBuilder 底層 在其父類中 封裝了 一個 char類型 的數組
  • StringBuilder 創建了一個 初始容量 為 16
//構造方法
public class StringBuilder01 
public class StringBuilder01 {
    public static void main(String[] args) {
        //構造方法
        StringBuilder sb=new StringBuilder();
        System.out.println("無參構造方法:"+sb);
        System.out.println("初始容量:"+sb.capacity());
        //
        StringBuilder sb1=new StringBuilder(32);
        System.out.println("自定義容量:"+sb1.capacity());
        //
        StringBuilder sb2=new StringBuilder("hello");
        System.out.println("容量:"+sb2.capacity());
        System.out.println(sb2);
    }
}
    public static void main(String[] args) {
        //構造方法
        StringBuilder sb=new StringBuilder();
        System.out.println("無參構造方法:"+ sb);
        System.out.println("初始容量:"+sb.capacity());
        StringBuilder sb1=new StringBuilder(32);
        System.out.println("自定義容量:"+sb1.capacity());
        StringBuilder sb2=new StringBuilder("hello");
        System.out.println("容量:"+sb2.capacity());
        System.out.println(sb2);
    }
}

 

1.5.2 常用方法

  • append(任意內容):追加字元串,數組放滿,容量翻倍

  • 追加擴容問題:

    • 擴容實現原理:數組的 arrays.copyOf() 方法

• 擴容演算法: 原數組容量 * 2 + 2

• 測試:

public class String02 {
    public static void main(String[] args) {
        StringBuilder stringBuilder=new StringBuilder("hello");
        System.out.println(stringBuilder. append("lllllllllllllllllllll"));
        System.out.println("sb的容量:"+stringBuilder.capacity());
        System.out.println("sb的內容:"+stringBuilder);
        System.out.println("sb的長度:"+stringBuilder.length());
        System.out.println(stringBuilder. append("lllllllllllllllllllllllll"));//超出的字元串長度*2+2
        System.out.println("sb的容量:"+stringBuilder.capacity());
        System.out.println("sb的內容:"+stringBuilder);
        System.out.println("sb的長度:"+stringBuilder.length());
    }
}

 

  • insert(int ,任意類型):插入
  • delete(int start,int end):刪除
  • replace(int start,int end,String s):替換
  • reverse():反轉
public class StringBuilder04 {
    public static void main(String[] args) {
        //insert:
        StringBuffer stringBuffer=new StringBuffer("hello");
        stringBuffer.insert(2,"lym");
        System.out.println(stringBuffer);
        //delete:
        StringBuffer stringBuffer1=new StringBuffer("lym");
        System.out.println(stringBuffer1.delete(1,3));
        //replace:
        StringBuffer stringBuffer2=new StringBuffer("zhangsan");
        System.out.println(stringBuffer2.replace(1,5,"qqq"));
        //reverse:反轉
        System.out.println(stringBuffer.reverse());
    }

}

 

  • 方法返回值問題
    • 因為這些 方法 的 返回值語句 是 return this; 因此 可以 連續調用
public class String05 {
    public static void main(String[] args) {
        StringBuilder stringBuilder=new StringBuilder();
        stringBuilder.append("hello").append("lym").append(1).replace(2,5,"zhang").reverse();
        System.out.println(stringBuilder);
    }
}

 

1.5.4 StringBuilder和StringBuffer的區別:

  • StringBuffer 是 執行緒安全 的

• StringBuilder是 執行緒非安全 的,因此 運行速率 較快

1.5.5 StringBuilder和String相互轉化:

1、StringBuilder轉換為String

public String toString(): 通過 toString()就可以實現把StringBuilder轉換為String

2、String轉換為StringBuilder

pubilc StringBuilder(String s): 通過 構造方法 就可以實現String轉換為StringBuilder