JavaSE常用API之String相關

0x01 java.lang.String


String是不可變的,且在創建String的時候,JVM會在常量池中保存一份引用,當再次創建相同的String時,JVM會從常量池中尋找是否存在引用,存在則將引用給新的String,不存在則創建!常量池在JDK1.7之后放入到堆中了

  1. 構造方法
    • new String() 初始化一個空的字符串對象
    • new String(String original) 初始化一個新建的String對象,使其表示一個與參數相同的字符序列
    • new String(byte[] bytes) 使用默認字符集編碼指定的byte數組 創建一個新的String對象
    • new String(byte[] bytes,Charset charset) 通過指定字符集的byte數組,創建一個新的String對象
    • String(byte[] bytes, int offset, int length, Charset charset) 通過指定的字符集的byte數組 從offset處開始創建到length處的String對象 長度為length

代碼示例:

//創建一個空的字符串對象
String str = new String(); 

//創建一個指定字符序列的字符串對象
String s5 = new String("ABC");

//通過默認字符集的byte數組創建一個字符串對象
byte[] data = new byte[32];
String password = new String(data);

//通過指定字符集的byte數組,創建一個新的字符串對象
byte[] data = new byte[32];
String str = new String(data,"utf-8");

//通過指定的字符集的byte數組 從offset處開始創建到length處的String對象 長度為length
byte[] data = new byte[1024];
String str = new String(data, 0, 12,"utf-8");
  1. 方法
    注意:

    以下方法可直接使用,不用自建 。但使用下列方法的大前提是導入相關類且存在字符串引用,如:
    import java.util.Scanner; //導入類包
    String str = "AbCdEfghIjKlmnOpqRsTuvwXYz "; //創建字符串引用

    • int length() 返回此字符串的長度
    • char charAt(int index) 返回指定索引處的char值 ,返回的是個字符(char),不是字符串
    • int indexOf(String str) 返回字符串第一次匹配時的索引下標
    • int indexOf(String str,int fromIndex) 返回字符串第一次匹配時的索引下標,從從指定的索引下標開始
    • int lastIndexOf(String str) 返回字符串最后一次匹配的索引下標
    • boolean startsWith(String prefix) 判斷此字符串是否是以指定字符前綴開始
    • boolean endWith(String suffix) 判斷此字符串是否是以指定字符后綴結尾
    • char[] toCharArray() 將此字符串轉換為一個新的字符數組
    • String toUpperCase() 將此字符串中所有的英文字母轉換為大寫后返回
    • String toLowerCase() 將此字符串中所有的英文字母轉換為小寫后返回
    • String substring(int beginIndex) 將此字符串從索引beginIndex開始截取,返回到字符串結尾的一個子字符串
    • String substring(int beginIndex,int endIndex) 將此字符串從索引beginIndex開始截取,返回到endIndexc處結尾的一個子字符串
    • String trim() 返回此字符串去除空字符之后的結果
    • String toString() 返回此字符串對象本身
    • boolean matches(String regex) 判斷此字符串是否匹配給定正則表達式

    注意:

    默認從邊界位置開始 完整的、全部的 匹配正則表達式,^和$ 不寫也可,且方法內部:
    public boolean matches(String regex) {
    return Pattern.matches(regex, this);
    }
    調用了Pattern類的matches方法,不用再自行創建一個Pattern類 ,且String大部分與正則表達式 的 方法內部都有調用Pattern類的方法

    • String replaceAll(String regex,String replacement) 使用給定的字符序列替換此字符串所有匹配字面序列值
    • String split(String regex) 使用給定的正則表達式,匹配,拆分字符串
    • byte[] getBytes() 使用默認字符集將String編碼為byte序列,將結果儲存到一個新的byte[] 數組中
    • byte[] getBytes(Charset charset) 使用指定字符集將String編碼為byte序列,將結果儲存到一個新的byte[] 數組中
    • boolean equals(Object anObject) 判斷對象和此字符串是否相等

代碼示例:

public static void main(String[] args) {
    StringMethodDemo demo = new StringMethodDemo();
    System.out.println("-----------------常用String方法演示------------我是分割線------------------------------");
    demo.commonMethod();
    System.out.println("-------------------查找字符串出現------------我是分割線------------------------------");
    demo.findStr();
    System.out.println("--------------------url截取hsot---------我是分割線------------------------------");
    demo.subUrl();
    System.out.println("--------------------字符串遍歷----------我是分割線------------------------------");
    demo.traversalString();
    System.out.println("--------------------字符串去除空格--------------我是分割線------------------------------");
    demo.trimStrSpace();
    System.out.println("--------------------檢測文件-------我是分割線------------------------------");
    demo.checkFile();
}
public void commonMethod(){
    String str = "ancbaksakhfaka";
    //String.charAt(): 按照下標 返回指定索引處的 char 值。
    System.out.println("str的第14個字符為:"+str.charAt(13));
    //String.length(): 返回字符串的長度。
    System.out.println("str的長度為:"+str.length());
    //String.indexOf(): 返回字符串第一次出現的位置索引下標.
    int a = str.indexOf("k");
    System.out.println("k在str中第一次出現的索引下標為:"+a);
    //String.lastIndexOf(): 返回字符串最后一次出現的位置索引下標.
    a = str.lastIndexOf("a");
    System.out.println("a在str中最后一次出現的索引下標為:"+a);
    str= "deMo.docX";
    String UpFile = str.toUpperCase();
    System.out.println("轉換為大寫之后的字符串:"+UpFile);
    String LowerFile = str.toLowerCase();
    System.out.println("轉換為小寫之后的字符串:"+LowerFile);
    String file = "demo.docx";
    LowerFile = file.toLowerCase();
    System.out.println("比較和源字符串是否相同:"+ file == LowerFile);
}
public void traversalString(){
    /** 遍歷字符串  */
    String str = "你好Java";
    for(int i=0;i<str.length();i++){
        System.out.print(str.charAt(i)+" ");
        System.out.println((int)str.charAt(i));
    }
}
public void subUrl(){
    /** url截取 host主機 和 文件名 */
    String url ="http://www.google.cn/cate/category.html";
    String host = url.substring(7,url.indexOf("/",7));
    String file_name = url.substring(url.lastIndexOf("/")+1);
    System.out.println(host);
    System.out.println(file_name);
    
}
public void trimStrSpace(){
    /** trim()  當且僅當 字符串的開始和末尾有空字符時去除  中間的空字符無法去除  */
    String chinese = "   今天的我很困 ,  沒有辦法我只能打瞌睡了   ";
    System.out.println(chinese.trim()+"\n");        
}
public void findStr(){
    String str = "啊啊啊啊啊啊啊啊";
    /** 查找指定開頭的字符串 */
    boolean b = str.startsWith("啊");
    System.out.println(b);
    b = str.startsWith("今天");
    System.out.println(b);
    b = str.startsWith("");
    System.out.println(b);
}
/** 驗證文件正確性*/
public void checkFile(){
    String file = "demo.docx";
    /** 判斷 file是否以 .png 結尾 */
    if(file.endsWith(".png")){
        System.out.println("這是圖片文件");
    }else{
        System.out.println("這不是圖片文件");
    }
    
    file = "background.Png";
    /**將此字符串中所有的大寫英文字母轉換為小寫 */
    if(file.toLowerCase().endsWith(".png")){
        System.out.println("圖片!");
    }else {
        System.out.println("非圖片!");
    }

    String url = "https://www.baidu.com/index.php";
    /** 判斷 url 是否以 https://開頭 */
    if(url.startsWith("https://")){
        System.out.println("安全加密通信");
    }else {
        System.out.println("非安全的通信");
    }
}
/**
 * boolean equals(Object anObject)  判斷對象內容否正確
 */
public class checkUserInput {
    
    public static void main(String[] args) {
        //創建接收器
        Scanner scan = new Scanner(System.in);
        //預定義一個用戶名和密碼
        String username,pwd;
        do{
            //接收控制臺輸入的用戶名
            System.out.println("請輸入用戶名");
            username = scan.nextLine();
            //接收控制臺輸入的密碼
            System.out.println("請輸入密碼");
            pwd = scan.nextLine();
            //當用戶名和密碼不相同時 提示登錄失敗,相同時提示登錄成功 
            if(!"熊大".equals(username) || !"123".equals(pwd))){
                System.out.println("登錄失敗!");
            }else{
                System.out.println("登錄成功");
                //打樁
                System.out.println("用戶名:"+username+" 密碼 :"+pwd);
            }
        //當用戶名和密碼不相同時,循環輸入,直到相同為止
        }while(!"熊大".equals(username) || !"123".equals(pwd));
        
        
    }
}

0x02 正則表達式相關知識:


正則表達式-1.png

正則表達式-2.png

正則表達式-3.png

正則表達式-4.png

正則表達式-5.png

正則表達式-6.png

正則表達式-7.png

正則表達式-8.png

正則表達式-9.png

有關正則表達式方法代碼示例:
java.util.regex.Pattern

/**   
 * 正則匹配演示  
 * Pattern 正則表達式的編譯表示形式
 * 指定為字符串的正則表達式必須首先編譯為此類的實例。然后可將得到的模式用于創建Matcher對象,
 * 依照正則表達式。該對象可以與任意字符序列匹配。
 * 執行匹配所涉及的所有狀態都駐留在匹配器中,所以多個匹配器可以共享同一模式。
 * 
 */
public class PatternDemo {

    public static void main(String[] args) {
        String regex = "hello[0-9]";
        String str = "hello1";
        test(regex,str);
    }
    
    public static void test(String regex,String str) {
        //創建一個正則表達式對象
        Pattern p = Pattern.compile(regex);
        //創建一個匹配器
        Matcher m = p.matcher(str);
        //判斷匹配器是否匹配正則
        boolean b = m.matches();
        System.out.println(b);
        //輸出匹配結果
        System.out.println(m.group());
    }
}

java.lang.String

public class StringMatchesDemo {
    /**
     * String 字符串支持正則表達式的相關方法之一:
     * boolean matches(String regex) 
     * 使用給定的正則表達式判斷當前字符串是否符合格式要求
     * 
     * "hshshakssj@ss.cn"
     * [a-zA-Z0-9_]+@[a-zA-Z0-9]+(\.[a-zA-Z]+)+
     * 
     */
    public static void main(String[] args) {
        //定義一個 “正確的” email 
        String email = "hshshakssj@ss.cn";
        //定義一個錯誤的email
        String etc = "hahahah";
        //構建匹配正則表達式
        String regex = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";
        //判斷 “正確的” email是否和正則表達式匹配 并使用一個boolean 變量存儲
        boolean b = email.matches(regex);
        //判斷email是否“正確”
        if(b){
            System.out.println(email+":匹配郵箱成功");
        }else {
            System.out.println(email+":匹配失敗");
        }
        //判斷錯誤的 email 是否和正則表達式匹配 并使用一個boolean 變量存儲
        b = etc.matches(regex);
        //判斷email是否“正確”
        if(b){
            System.out.println(etc+":匹配郵箱成功");
        }else {
            System.out.println(etc+":匹配失敗");
        }
    }
}

    /**
     * String 字符串支持正則表達式的相關方法之二:
     * String repleaseAll(String regex,String str)
     * 將當前字符串中,滿足正則表達式的部分替換為給定字符串
     *
     */
    public class StringRepleaseAllDemo {
        public static void main(String[] args) {
            String string = "abc123def456hik";
            /*
             * 將當前字符串中的數字部分替換為#NUMBER#
             */
            string = string.replaceAll("[0-9]+", "#NUMBER#");
            //string = string.replaceAll("[0-9]", "#NUMBER#");
            //string = string.replaceAll("[a-z]+", "#char#");
            System.out.println(string);

            //用戶輸入信息 “禮貌” 河蟹
            //創建一個接受器
            Scanner scan = new Scanner(System.in);
            //構建匹配正則表達式
            String regex = "(wqnmlgb|nc|dsb|djb|mmp|tmd|nmsl|bitch|hmp|nmj)";
            System.out.println("輸入框:");
            //將控制臺輸入的接受的到數據轉換為小寫
            String message = scan.next().toLowerCase();
            //匹配到正則表達式的字符串 替換為 ***  【河蟹神獸重出江湖啦~~】
            message = message.replaceAll(regex, "***");
            //輸出信息
            System.out.println(message);
            
        }
    }

    /**
     * String 字符串支持正則表達式的相關方法之三:
     * String[] split(String regex)
     * 將當前字符串按照滿足正則表達式的部分進行拆分,并返回
     * 拆分后的每段內容
     */
    public class StringSplitDemo {
        public static void main(String[] args) {
            String string = "abc123def456hik";
            /*
             * 按照數字部分進行拆分,得到所有的字母部分
             */
            String[] arr = string.split("[0-9]+");
            //String[] arr = string.split("[0-9]"); 每個數字截一段
            System.out.println(arr.length);
            System.out.println(Arrays.toString(arr));
            
            /* 上傳文件統一重命名 :上傳時間+文件后綴*/
            //假定一個上傳的圖片對象
            String imageName = "123.jpg";
            //按照 . 處進行拆分 得到一個 圖片名稱 和圖片后綴的 字符串數組
            String[] names = imageName.split("\\.");
            //獲取格林威治時間 將其與拆分的圖片后綴組合 重命名操作 將其賦給imageName
            imageName = System.currentTimeMillis()+ "." + names[1];
            //輸出圖片名稱
            System.out.println(imageName);
            
            ////按照 . 處進行拆分 得到一個 圖片名稱 和圖片后綴的 字符串數組
            names = imageName.split("\\.");
            //記錄圖片的名稱即上傳時間
            long time = Long.parseLong(names[0]);
            //轉化時間戳
            Date date = new Date(time);
            //輸出時間戳
            System.out.println(date);
        }
    }

注意:

在正則表達式中 “ . ”表示匹配任意一個字符,使用文件后綴匹配“ . ”時, 要被轉義,并且“ \ ”也要被轉義,否則會報錯即 "\\."

0x03 java.lang.StringBuilder


  1. 構造方法
    • new StringBuilder() 創建一個不帶任何字符的字符串生成器,其初始容量為16個字符
    • new StringBuilder(String str) 創建一個新的字符串生成器,并初始化為指定的字符串內容

代碼示例:

//空的字符串引用
StringBuilder str = new StringBuilder();
//指定字符串引用
StringBuilder str = new StringBuilder("hello world");
  1. 方法

    注意:

    以下方法可以直接使用,不用自建,但其使用大前提為導入相關類且存在字符串引用

    • int capacity() 返回此字符序列的容量,此時容量相當于字符序列的長度(length)
    • StringBuilder insert(int offset,Object anObject) 將anObject插入到此字符串中指定的offse處
    • StringBuilder append()以及重載的append(Object anObject) 將anObject 追加到字符序列(字符串)的末尾

    注意:anObject 代表眾多的對象和變量 (包括但不限于boolean、char、char[]、String)等

    • StringBuilder delete(int start,int end) 移除此字符序列的從start位置開始到end結束的字符

代碼示例:

public class StringBuilderMethodDemo {
    /**
     * StringBuilder 常用  API方法  演示
     * 1. StringBuilder 是可變字符串,其內部的字符數組容量初始為16,
     * 2. 后續的操作,都可以對這個數組內容進行修改,
     * 3. 當容量不過的時候,會自動進行擴容,擴容規則1倍+2
     * 
     * String對象中也封裝了char數組,但是其數組內容在創建之后不可改變
     * 
     * 用于檢測StringBuilder內部字符數組的容量,大于等于數組長度
     * .capacity()
     * 
     * 添加字符 在當前字符串的末尾
     * .append()
     * 
     * 從開始逐個往后按照索引,在指定位置刪除字符
     * .delete()
     * 
     * 開始逐個往后按照索引,在指定位置插入字符
     * .insert()
     */
    public static void main(String[] args) {
        StringBuilderMethodDemo str = new StringBuilderMethodDemo();
        str.test();
    }
    public void test(){
        //創建一個空的字符序列
        StringBuilder str = new StringBuilder();
        //capacity 容量,就是StringBuilder中char數組大小
        //capacity() 方法用于檢測StringBuilder內部字符數組的容量
        //由于當長度超過數組容量的時候,會進行自動擴容,
        //所以這個數組的容量總會大于等于數組長度
        int size = str.capacity();
        System.out.println(size);
        //追加字符串
        str .append("采蘑菇的小")
            .append("姑娘今天上山")
            .append("去采蘑菇的時候")
            .append("碰到了")
            .append("熊大");
        System.out.println(str);
        //記錄容量(長度)
        size = str.capacity();
        System.out.println(size);
        //刪除指定位置的字符
        str .delete(1,3)
            //插入指定字符
            .insert(1,"老師");
        System.out.println(str);
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。