0x01 java.lang.String
String是不可變的,且在創建String的時候,JVM會在常量池中保存一份引用,當再次創建相同的String時,JVM會從常量池中尋找是否存在引用,存在則將引用給新的String,不存在則創建!常量池在JDK1.7之后放入到堆中了
- 構造方法
- 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");
-
方法
注意:以下方法可直接使用,不用自建 。但使用下列方法的大前提是導入相關類且存在字符串引用,如:
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
- 構造方法
- new StringBuilder() 創建一個不帶任何字符的字符串生成器,其初始容量為16個字符
- new StringBuilder(String str) 創建一個新的字符串生成器,并初始化為指定的字符串內容
代碼示例:
//空的字符串引用
StringBuilder str = new StringBuilder();
//指定字符串引用
StringBuilder str = new StringBuilder("hello world");
-
方法
注意:
以下方法可以直接使用,不用自建,但其使用大前提為導入相關類且存在字符串引用
- 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);
}
}