千鋒教育Java入門全套視頻教程(java核心技術(shù),適合java零基礎(chǔ),Java

?問題:
- String-字符串如何存儲(chǔ)?
String底層實(shí)際上是一個(gè)字符數(shù)組
private final char value[];//底層代碼
- 每個(gè)字符是如何存儲(chǔ)的?
跟編碼表有關(guān)系
- ASCII表
- Unicode
- utf-(常用utf-8在國內(nèi)使用)三個(gè)字節(jié)來描述一個(gè)字符
- gbk-(專門中文字符集)兩個(gè)字節(jié)來描述一個(gè)字符
- 等
概念:
編碼:將字符,根據(jù)指定的字符集來轉(zhuǎn)換成 數(shù)值
解碼:將數(shù)值,根據(jù)指定的字符集轉(zhuǎn)化為字符
看看幾個(gè)String題:
String s1 = "abc"; String s2 = "abc"; System.out.println("s1 == s2: "+(s1==s2)); final String s3 = "abc"; final String s4 = "abc"; System.out.println("s3 == s4: "+(s3==s4)); String s5 ="abc"; String s6 ="abc"; String s7 = (s5+s6).intern(); System.out.println("s7 == (s5+s6)): "+(s7 == (s5+s6))); String s8 = "abcabc"; System.out.println("s8==(s1+s2):"+(s8==(s1+s2))); System.out.println("s8==(s3+s4):"+(s8==(s3+s4))); System.out.println("s8==s7:"+(s8==s7));
運(yùn)行結(jié)果:
s1 == s2: true
s3 == s4: true
s7 == (s5+s6)): false
s8==(s1+s2):false
s8==(s3+s4):true
s8==s7:true
下面這段代碼創(chuàng)建了幾個(gè)對象?
String s = new String("abc");
答案:創(chuàng)建了兩個(gè)對象,一個(gè)在常量池,一個(gè)在堆內(nèi)存
判斷定義為String類型的s1和s2是否相對
String s1 = new String("abc"); String s2 = "abc"; System.out.println("s1 == s2: "+(s1==s2)); System.out.println("s1.equals(s2): "+(s1.equals(s2)));
答案:
s1 == s2: false
s1.equals(s2): true
常用的構(gòu)造方法
- public String():空構(gòu)造
String str = new String();
- public String(byte bytes[]) :把字節(jié)數(shù)組轉(zhuǎn)換成字符串
byte [] bytes = {97,98,99,100}; String str = new String(bytes);
- public String(byte bytes[], int offset, int length):把字節(jié)數(shù)組的一部分轉(zhuǎn)換成字符串
byte [] bytes = {97,98,99,100}; String str = new String(bytes,1,3);
- public String(char value[]):把字符數(shù)組轉(zhuǎn)換成字符串
char [] c = {'a','b','c','d','e','f'}; String str = new String(c);
- public String(char value[], int offset, int count):把字符數(shù)組的一部分轉(zhuǎn)換成字符串
char [] c = {'a','b','c','d','e','f'}; String str = new String(c,1,4);
- public String(String original):把字符串常量值轉(zhuǎn)換成字符串
String str = new String("abcdefg");
indexOf()和lastIndexOf()
indexOf
取給定字符在字符串中第一次出現(xiàn)的位置的位置
String email = "123456789@xxx.com"; //第一次出現(xiàn)的位置 System.out.println(email.indexOf('@'));
lastIndexOf
//取給定字符在字符串中最后一次出現(xiàn)的位置
String email = "123456789@xxx.com"; //取給定字符在字符串中最后一次出現(xiàn)的位置 System.out.println(email.lastIndexOf('@'));
indexO
f和lastIndexOf
還可以針對字符串來求第一次(最后一次)出現(xiàn)下標(biāo)
//indexOf和lastIndexOf還可以針對字符串來求第一次(最后一次)出現(xiàn)下標(biāo) System.out.println(email.indexOf("xxx"));
toCharArray()
把字符串中的每個(gè)字符放到字符數(shù)組中
String email = "123456789@xxx.com"; char[] charArray = email.toCharArray(); System.out.println(Arrays.toString(charArray));
運(yùn)行結(jié)果
[1, 2, 3, 4, 5, 6, 7, 8, 9, @, x, x, x, ., c, o, m]
Arrays.copyOf()和System.arraycopy()
數(shù)組的拷貝(兩種方式)
int [] numbers = {1,2,3}; int [] arrCopy1 = new int[numbers.length]; System.arraycopy(numbers,0,arrCopy1,0,numbers.length); System.out.println(Arrays.toString(arrCopy1)); int [] arrCopy2= Arrays.copyOf(numbers, numbers.length); System.out.println(Arrays.toString(arrCopy2));
substring()
字符串截取(獲取子字符串)
String str1 = "123qwertyuiop"; String substring1 = str1.substring(2, 5); String substring2 = str1.substring(2); System.out.println("substring1: "+substring1); System.out.println("substring2: "+substring2);
replace()
替換字符串中的字符
String str2 ="123qwer456zxCV789asdf"; String replace = str2.replace("123", ""); String replace1 = str2.replace('1', 'a'); System.out.println("replace:"+replace); System.out.println("replace1:"+replace1);
根根據(jù)正表達(dá)式來替換字符串中匹配的內(nèi)容
//根根據(jù)正表達(dá)式來替換字符串中匹配的內(nèi)容 String replaceAll = str2.replaceAll("[0-9]", ""); System.out.println("replaceAll:"+replaceAll);
split()
字符串分割
字符串分割的時(shí)候,要注意,如果分隔符在字符串的末尾,可以將這個(gè)分隔符忽略掉
字符串分割才用的是正則表達(dá)式匹配,并非是給定的字符串
String line = "張三,李四,"; //[1][3-9][0-9]{9} = 1[3-9][0-9]{9} String[] arr = line.split(","); System.out.println(Arrays.toString(arr)); String p = "skaldk12831203askldaklkadl2askdl12"; String[] arr2 = p.split("[0-9]+"); System.out.println(Arrays.toString(arr2)); String regex = "[0-9A-Za-z]{8,15}@[a-zA-Z0-9]{2,10}.[a-zA-Z0-9]{2,10}"; boolean matches = "anmasakjaa@xxx.com".matches(regex);//匹配 System.out.println(matches);
trim()
trim可以修剪掉字符串兩端的空格*
String blank = " asasd aa aa "; System.out.println(blank); //trim可以修剪掉字符串兩端的空格 System.out.println(blank.trim());
equalsIgnoreCase()
比較兩個(gè)字符串的內(nèi)容是否相等,忽略大小寫。
str = "AbC"; boolean b = str.equalsIgnoreCase("aBc"); System.out.println(b);//true
擴(kuò)展
字符集, 也就是我們通常說的編碼格式
StandardCharsets
表示標(biāo)準(zhǔn)字符集
我們中文支持的字符集有UTF-8
、GBK
、GB2312
,但是收錄漢字最齊全就是UTF-8
瀏覽器默認(rèn)的字符集編碼是ISO-8859-1,如果我們要處理瀏覽器傳遞過來的數(shù)據(jù),需要
對編碼進(jìn)行處理,才能正確的識(shí)別數(shù)據(jù)
亂碼產(chǎn)生的原因:字符集在傳輸?shù)臅r(shí)候使用的編碼與在解析的時(shí)候使用的編碼不一致
Charset charset = StandardCharsets.ISO_8859_1;//StandardCharsetss標(biāo)準(zhǔn)字符集。
這里我們的java
文件的編碼格式是UTF-8
,因此我們這里的字符串編碼格式就是UTF-8
String str = "中文";
將之前使用UTF-8
編碼格式的字符串重新進(jìn)行組裝,組裝的時(shí)候采用的編碼格式是ISO-8859-1
這個(gè)時(shí)候我們再來打印這個(gè)字符串,發(fā)現(xiàn)這個(gè)字符串展示出來的就是亂碼
String newStr = new String(str.getBytes(), charset); System.out.println(newStr);
StringBuffer
和StringBuilder
區(qū)別
String Buffer
線程安全的(上鎖了)
StringBuilder
線程不安全(沒有加鎖)
String Buffer
和StringBuilder
都繼承AbstractStringBuilder
StringBuffer
StringBuffer
:代表可變的字符序列,稱為字符串緩沖區(qū),可以將StringBuffer
看作是一個(gè)高級的String
- 工作原理:
預(yù)先申請一塊內(nèi)存,存放字符序列,如果字符序列滿了,會(huì)重新改變緩存區(qū)的大小,以容納更多的字符序列
StringBuffer
是可變對象,這個(gè)是String
最大的不同
- 默認(rèn)緩沖區(qū)大小
默認(rèn)緩沖區(qū)大?。?6個(gè)字符
StringBuilder
字符串構(gòu)建器,因?yàn)樽址坏﹦?chuàng)建就不可再更改,如果我們需要對字符串進(jìn)行組裝,那么就會(huì)產(chǎn)生新的字符串,
產(chǎn)生新的字符串,就意味著有新的內(nèi)存開銷。如果存在打了字符串組裝,那么內(nèi)存開銷隨著組裝次數(shù)的增加,也會(huì)
不停的增加,為了減少字符串組裝的開銷,于是設(shè)計(jì)了字符串構(gòu)建器
StringBuilder
和StringBuffer
常用方法
提示:他們兩個(gè)方法基本都是相同的。最大的區(qū)別就是StringBuilder
是線程不安全的,效率高
構(gòu)造方法
public StringBuffer
()`:無參構(gòu)造方法 默認(rèn)容量16public StringBuffer
(int capacity)`:指定容量的字符串緩沖區(qū)對象public StringBuffer
(String str)`:指定字符串內(nèi)容的字符串緩沖區(qū)對象
提升:擴(kuò)容公式:原容量<<1+2
append()
追加字符串
示范代碼
StringBuilder builder = new StringBuilder(); builder.append("abcde").append("aaa");
delete()
刪除使用的區(qū)間是[start,end)
示范代碼
builder.delete(0,1); System.out.println(builder);
insert()
在指定下標(biāo)上插入字符串
示范代碼
//插入的時(shí)候,第一個(gè)參數(shù)表示偏移量 builder.insert(2,"@"); System.out.println(builder);
程序案例
100000000000000,將這個(gè)數(shù)字轉(zhuǎn)換為金融數(shù)字100,000,000,000,000
示范代碼
StringBuilder sb = new StringBuilder("100000000000000"); int len = sb.length(); for(int i=len-3; i>0; i-=3){ ??sb.insert(i, ','); } System.out.println(sb);
reverse()
反轉(zhuǎn)字符
示范代碼
StringBuilder reverse = sb.reverse(); System.out.println(reverse.toString());
StringBuffer和
StringBuilder方法用法差不多這里不在舉例
StringBuffer`。
本次筆記也發(fā)送到了CSDN中:https://blog.csdn.net/JiaXinBinGan/article/details/131791412
標(biāo)簽: