2019/7/11 17:47? ? 二刷留念
????01-String(概述)
? ? ? ? 接下來說一下Java中API的部分涌攻,其實(shí)在講多線程的時(shí)候已經(jīng)涉及到了API的部分欧引,比如說Thread類,比如說Runnable接口恳谎。
? ? ? ? 什么叫API呢芝此?就是Java為我們對(duì)外提供的應(yīng)用程序接口,就是暴露出來的部分因痛,能讓我們直接使用的部分婚苹,Java都幫我們定義好啦。
? ? ? ? 那么除了線程以外呢鸵膏,我們還有一些在我們實(shí)際開發(fā)當(dāng)中常用的對(duì)象膊升。這些事物也被Java進(jìn)行了封裝,并定義成了對(duì)象谭企。
? ? ? ? 比如廓译,我們?cè)陂_發(fā)中最常見的數(shù)據(jù)之一,字符串债查。
? ? ? ? 這種數(shù)據(jù)在我們實(shí)際生活中非常常見非区,所以就把它封裝成了對(duì)象描述钧栖,并且定義了一些功能陨溅,以便于操作這些字符串。
? ? ? ? 很多種語言豌蟋,都有對(duì)字符串的描述速和,以及功能的提供歹垫。
? ? ? ? 在Java中,描述字符串的是java.lang包中的一個(gè)類:String颠放。
? ? ? ? 我們來看一下它的描述:
? ? ? ? 首先排惨,final代表它不能有子類,也就是說碰凶,它里面操作字符串的功能是不能夠復(fù)寫的暮芭,因?yàn)樗B子類都不能有呢鹿驼。
? ? ? ? 它有很多種構(gòu)造方法:
? ? ? ? 比如空參數(shù)構(gòu)造方法。
? ? ? ? 如上圖辕宏,兩條語句表達(dá)的是同一個(gè)意思畜晰,但是第二條顯然比第一條簡(jiǎn)單多啦,所以第一種那種空參數(shù)的構(gòu)造方法使用起來并不多瑞筐。
? ? ? ? 先講一下String s1="abc";這句代碼:
? ? ? ? 這不就矛盾啦嗎凄鼻?
? ? ? ? 字符串常量既然一旦初始化就不可以被改變,那為什么它的內(nèi)容可以從“abc”變成“kk”聚假,而且后面還能打印粗來呢块蚌?
? ? ? ? 其實(shí),不是“abc”變了膘格,而是s1變了峭范,剛開始s1指向“abc”對(duì)象,后來又指向了“kk”對(duì)象瘪贱,而“abc”沒有改變喔纱控。
? ? ? ? 注意這兩種方式使用起來也是一樣的:
? ? ? ? 但是也有一些區(qū)別:
? ? ? ? 首先,s1和s2肯定不相等的政敢,兩個(gè)人指向的并不是同一個(gè)對(duì)象其徙。(即便兩個(gè)對(duì)象內(nèi)容都是“abc”,它們也是兩個(gè)不同的對(duì)象)所以s1喷户!=s2唾那。
? ? ? ? 其次,equals比較的應(yīng)該是內(nèi)存地址值褪尝,而s1和s2不相等闹获,在這里怎么變相等了呢?
? ? ? ? 因?yàn)镾tring類復(fù)寫了Object類的equals方法河哑,復(fù)寫完之后避诽,它建立了自己獨(dú)特的判斷字符串是否相同的方法:
? ? ? ? 那么,在這個(gè)例子中璃谨,s1和s2有什么區(qū)別呢沙庐?(面試中經(jīng)常問到)
? ? ? ? s1在內(nèi)存中有一個(gè)對(duì)象。
? ? ? ? s2在內(nèi)存中有兩個(gè)對(duì)象佳吞。(new是一個(gè)拱雏?“abc”是一個(gè)?沒太懂底扳。)
? ? ? ? 了解內(nèi)容:
? ? ? ? 字符串其實(shí)在內(nèi)存中有個(gè)常量池铸抑,這個(gè)池子里面是個(gè)數(shù)組,用來存放a衷模、b鹊汛、c這樣的字符蒲赂。我們都知道,字符串由字符組成刁憋。
? ? ? ? 舉個(gè)例子滥嘴,我們?cè)诔A砍刂写嫒肓薬、b职祷、c氏涩,組成了“abc”字符串,又存入了d有梆、e、f意系,組成了“def”字符串泥耀,接下來我們需要一個(gè)“abf”字符串,這個(gè)時(shí)候蛔添,它會(huì)在常量池中找到a痰催、b、f字符迎瞧,又拼成一個(gè)新的字符串對(duì)象夸溶。
? ? ? ? 總結(jié)一下,字符串自身的特點(diǎn):
? ? ? ? 1凶硅,它是一個(gè)對(duì)象缝裁。
? ? ? ? 2,它是一個(gè)常量足绅,不能被改變捷绑。
? ? ? ? 3,s1="abc"在內(nèi)存中有一個(gè)對(duì)象氢妈,s2=new String(“abc”);在內(nèi)存中有兩個(gè)對(duì)象粹污。
? ? ? ? 4,字符串有自己獨(dú)特的equals比較方式首量,用來判斷內(nèi)容是否相同壮吩。
? ??02-String(常見功能-獲取和判斷)
? ? ? ? 在說本節(jié)內(nèi)容之前,上節(jié)內(nèi)容還有一些需要補(bǔ)充的:
? ? ? ? 為什么鴨加缘?
? ? ? ? String s1="abc";之后鸭叙,因?yàn)?abc"字符串已經(jīng)在內(nèi)存中存在了,在常量池中存在的數(shù)據(jù)生百,s3在進(jìn)行初始化的時(shí)候递雀,發(fā)現(xiàn)"abc"已經(jīng)在內(nèi)存中存在的時(shí)候,它就不會(huì)獨(dú)立開辟空間了蚀浆。因?yàn)樵匍_辟空間的時(shí)候會(huì)發(fā)現(xiàn)缀程,它會(huì)比較浪費(fèi)空間搜吧。"abc"已經(jīng)存在,而且它不能被改變杨凑,那為什么還要再開辟空間給它分配呢滤奈?所以就不需要開辟新的空間啦。所以為了節(jié)約內(nèi)存撩满,在字符串這個(gè)對(duì)象當(dāng)中蜒程,只要字符串相同的話,它們使用的就是同一個(gè)字符串對(duì)象伺帘。
????????因此s1和s3指向同一個(gè)字符串對(duì)象昭躺。
? ? ? ? String類適用于描述字符串事物。
? ? ? ? 那么它就提供了多個(gè)方法對(duì)字符串進(jìn)行操作伪嫁。
? ? ? ? 常見的操作有哪些领炫?
????????說完字符串的特點(diǎn),下面說字符串所涉及到的一些方法张咳。
? ? ? ? 字符串的常見操作:
? ? ? ? 1帝洪,獲取。
? ? ? ? ? ? ? ? 1.1 字符串中包含的字符數(shù)脚猾,也就是字符串的長(zhǎng)度葱峡。
? ? ? ? ? ? ? ? int length():獲取長(zhǎng)度。
? ? ? ????????? 數(shù)組也有長(zhǎng)度龙助,但是它那個(gè)length是屬性砰奕,沒有括號(hào)。
? ? ????????? ? 字符串也有長(zhǎng)度泌参,但它是通過方法來完成的脆淹,帶括號(hào)。
? ? ? ? ? ? ? ? 1.2 根據(jù)位置獲取位置上某個(gè)字符沽一。
? ? ? ? ? ? ? ? char charAt(int index):
? ? ? ? ? ? ? ? 1.3 根據(jù)字符獲取該字符在字符串中的位置盖溺。
? ? ? ? ? ? ? ? int indexOf(int ch):
? ? ? ? ? ? ? ? 為什么ch不是char是int呢?因?yàn)樗邮盏氖茿SCII碼铣缠。
? ? ? ? ? ? ? ? 它還有一個(gè)重載:
? ? ? ? ? ? ? ? int indexOf(int ch,int fromIndex):從fromIndex指定的位置開始烘嘱,獲取ch在字符串中出現(xiàn)的位置。
? ? ? ? ? ? ? ? 我們不光可以獲取字符在字符串中的位置蝗蛙,還可以獲取字符串在字符串中的位置蝇庭。
? ? ? ? ? ? ? ? int indexOf(String str)
? ? ? ? ? ? ? ? int indexOf(String str,int fromIndex)
? ? ? ? 接下來做一個(gè)演示~
? ? ? ? 返回字符串長(zhǎng)度:
? ? ? ? 主函數(shù)中調(diào)用一下:
?? ? ? ? 編譯運(yùn)行:
? ? ? ? 根據(jù)索引獲取字符和根據(jù)字符獲取索引:
? ? ? ? 運(yùn)行結(jié)果:
? ? ? ? 從指定位置開始搜索'a'第一出現(xiàn)的位置:
? ? ? ? 運(yùn)行結(jié)果:
? ? ? ? 還有這種情況:
? ? ? ? 當(dāng)訪問到字符串中不存在的角標(biāo)時(shí),會(huì)發(fā)生字符串角標(biāo)越界異常StringIndexOutOfBoundsException:
? ? ? ? 還有這種情況捡硅,尋找字符串中不存在的字符:
? ? ? ? 會(huì)怎樣呢哮内?
? ? ? ? 我們會(huì)發(fā)現(xiàn),沒有角標(biāo)會(huì)返回-1:
? ? ? ? 它還有以下幾個(gè)方法:
? ? ? ? 反向索引。
? ? ? ? 我們來試一個(gè):
? ? ? ? 運(yùn)行結(jié)果:
? ? ? ? 注意喔北发,雖然反向索引是從右往左開始查找纹因,但最后返回的角標(biāo)值依然是從左往右數(shù)的角標(biāo)值。
? ? ? ? 返回指定索引處字符的ASCII碼:
? ? ? ? 就不舉例說明啦琳拨。
?? ? ? 2瞭恰,判斷。
? ? ? ? ? ? ? ? 2.1 字符串中是否包含某一個(gè)子串狱庇。
? ? ? ? ? ? ? ? boolean contains(str):
? ? ? ? ? ? ? ? 這個(gè)CharSequence類型的參數(shù)是啥意思捏惊畏?
? ? ? ? ? ? ? ? 點(diǎn)進(jìn)去看看:
? ? ? ? ? ? ? ? 我們發(fā)現(xiàn)它的子類有String、StringBuffer等等密任。
? ? ? ? ? ? ? ? 特殊之處:indexOf(str):可以索引str第一次出現(xiàn)的位置颜启,如果返回-1,表示該str不在字符串中存在批什。所以indexOf(str)农曲,也可以用于對(duì)指定字符串的判斷是否包含。
? ? ? ? ? ? ? ? 用法:if(str.indexOf("aa")!=-1)
? ? ? ? ? ? ? ? 而且該方法既可以判斷驻债,又可以獲取出現(xiàn)的位置。
? ? ? ? ? ? ? ? 2.2 字符串中是否有內(nèi)容形葬。
? ? ? ? ? ? ? ? boolean isEmpty():原理就是判斷長(zhǎng)度是否為0合呐。?
? ? ? ? ? ? ? ? 注意“”和null是有區(qū)別的,“”是一個(gè)對(duì)象笙以,null是指向空淌实。
? ? ? ? ? ? ? ? 2.3 字符串是否是以指定內(nèi)容開頭。
? ? ? ? ? ? ? ? boolean startsWith(str);
? ? ? ? ? ? ? ? 2.4 字符串是否是以指定內(nèi)容結(jié)尾猖腕。
? ? ? ? ? ? ? ? boolean endsWith(str);
? ? ? ? 下面演示一下~
? ? ? ? 主函數(shù)中調(diào)用它:
? ? ? ? 運(yùn)行:
? ? ? ? ? ? ? ? 2.5 判斷字符串的內(nèi)容是否相同拆祈。復(fù)寫了Object類總的equals方法。
? ? ? ? ? ? ? ? boolean equals(str);
? ? ? ? ? ? ? ? 2.6 判斷內(nèi)容是否相同倘感,并忽略大小寫放坏。
? ? ? ? ? ? ? ? boolean equalsIgnoreCase(String anotherString);
????03-String(常見功能-轉(zhuǎn)換)
? ? ? ? 3老玛,轉(zhuǎn)換淤年。
? ? ? ? ? ? ? ? 3.1 將字符數(shù)組轉(zhuǎn)成字符串。
? ? ? ? ? ? ? ? 構(gòu)造函數(shù):? ? String(char[])
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? String(char[],offset,count):將字符數(shù)組中的一部分轉(zhuǎn)成字符串蜡豹。
? ? ? ? ? ? ? ? 試一下~
? ? ? ? ? ? ? ? 將字符串?dāng)?shù)組整個(gè)轉(zhuǎn)成字符串:
? ? ? ? ? ? ? ? 主函數(shù)中調(diào)用:
??? ? ? ? ? ? ? ? 運(yùn)行:
? ? ? ? ? ? ? ? 將字符串?dāng)?shù)組的一部分轉(zhuǎn)成字符串:
? ? ? ? ? ? ? ? 運(yùn)行:
? ? ? ? ? ? ? ? 剛剛說的是用構(gòu)造函數(shù)的方式來將字符數(shù)組轉(zhuǎn)換成字符串麸粮,那么不用構(gòu)造函數(shù)的方式,也可以呢~
? ? ? ? ? ? ? ? 靜態(tài)方法:static String copyValueOf(char[]);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??static String copyValueOf(char[] data,int offset,int count);
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? static String valueOf(char[]);
? ??????? ? ? ? 3.2 將字符串轉(zhuǎn)成字符數(shù)組镜廉。
? ? ? ? ? ? ? ? char[] toCharArray();
? ? ? ? ? ? ? ? 3.3 將字節(jié)數(shù)組轉(zhuǎn)成字符串弄诲。
? ? ? ? ? ? ? ? ? ? ? ? String(byte[])
? ? ? ? ? ? ? ? ? ? ? ? String(byte[],offset,count)
? ? ? ? ? ? ? ? 3.4 將字符串轉(zhuǎn)成字節(jié)數(shù)組。
? ? ? ? ? ? ? ? byte[] getBytes();
? ? ? ? ? ? ? ? 3.5 將基本數(shù)據(jù)類型轉(zhuǎn)成字符串娇唯。
? ? ? ? ? ? ? ? ? ? ? ? static String valueOf(int);
? ? ? ? ? ? ? ? ? ? ? ? static String valueOf(double);
? ? ? ? ? ? ? ? ? ? ? ? 例:3+"";就相當(dāng)于String.valueOf(3);只是后者比較專業(yè)齐遵,當(dāng)然也稍微麻煩一些寂玲。
? ? ? ? ? ? ? ? ? ? ? ? 特殊:字符串和字節(jié)數(shù)組在轉(zhuǎn)換過程中,是可以指定編碼表的洛搀。
? ? ? ? 試一下~
? ? ? ? 運(yùn)行:
? ? 04-String(常見功能-切割和替換)
? ? ? ? 4敢茁,替換
? ? ? ? ? ? ? ? String replace(oldchar,newchar);
? ? ? ? 試一下~
? ? ? ? 因?yàn)樽址坏┍怀跏蓟筒粫?huì)被改變,所以s.replace(...)返回來的是一個(gè)新字符串留美。所以s還是原來的字符串~
? ? ? ? 運(yùn)行:
? ? ? ? 將要替換的字符換成一個(gè)原來字符串中不存在的字符彰檬,比如說'q':
? ? ? ? 如果要替換的字符不存在,返回的還是原串谎砾。
? ? ? ? 還有一個(gè)方法:
? ? ? ? 話不多說逢倍,我們直接用例子來說明它的用法:
? ? ? ? 運(yùn)行:
? ? ? ? 還有一個(gè)方法:
? ? ? ? 我們只需要知道它可以按指定的規(guī)則對(duì)字符串進(jìn)行替換,因?yàn)樯婕暗秸齽t表達(dá)式景图,所以后面再說~
? ? ? ? 5较雕,切割
? ? ? ? String[] split(regex);
? ? ? ? 試一下~
? ? ? ? 運(yùn)行:
? ? ? ? 6,子串挚币。獲取字符串中的一部分亮蒋。
? ? ? ? String substring(begin);? //從指定位置開始到結(jié)尾。如果角標(biāo)不存在妆毕,會(huì)出現(xiàn)字符串角標(biāo)越界異常慎玖。
????????String substring(begin,end);? //包含頭,不包含尾笛粘。
? ? ? ? 我們直接通過例子來看看它的用法:
? ? ? ? 運(yùn)行:
????05-String(常見功能-比較和去除空格)
? ? ? ? 7趁怔,轉(zhuǎn)換,去除空格薪前,比較润努。
? ? ? ? ? ? ? ? 7.1 將字符串轉(zhuǎn)成大寫或者小寫。? ??
? ? ? ? ? ? ? ? String toUpperCase();
? ? ? ? ? ? ? ? String toLowerCase();
? ? ? ? ? ? ? ? 7.2 將字符串兩端的多個(gè)空格去除示括。
? ? ? ? ? ? ? ? String trim();
? ? ? ? ? ? ? ? 7.3 對(duì)兩個(gè)字符串進(jìn)行自然順序的比較铺浇。? ??
? ? ? ? ? ? ? ? int compareTo(String);
? ? ? ? 話不多說,上例子:
? ? ? ? 運(yùn)行:
? ? ? ? 去除兩端空格在實(shí)際開發(fā)中非常常用例诀。比如登錄賬號(hào)的時(shí)候随抠,很容易在前后多打空格,這個(gè)時(shí)候如果報(bào)錯(cuò)不讓登錄繁涂,用戶體驗(yàn)感就會(huì)很差拱她,會(huì)造成自己賬號(hào)被盜了的錯(cuò)覺(他們根本意識(shí)不到是自己多輸了空格)。
? ? ? ? 繼續(xù)試一試compareTo~?
? ? ? ? 運(yùn)行:
? ? ? ? 再將s1的內(nèi)容換一下:
? ? ? ? 再運(yùn)行試試:
? ? ? ? 我們來看一下這個(gè)方法扔罪,看看它輸出的這個(gè)數(shù)字是什么意思~
????06-String(字符串練習(xí)1)
? ? ? ? 思路:
? ? ? ? 開始:
? ? ? ? 結(jié)束:
? ? ? ? 如果整個(gè)字符串全是空格秉沼,那么結(jié)束標(biāo)志就是開始指針大于等于結(jié)尾指針。
? ? ? ? 代碼:
? ? ? ? 主函數(shù)中調(diào)用:
? ? ? ? 運(yùn)行:
? ? 07-String(字符串練習(xí)2)
? ? ? ? 字符串反轉(zhuǎn)函數(shù):
? ? ? ? 數(shù)組反轉(zhuǎn)函數(shù):
? ? ? ? 數(shù)組位置交換函數(shù):
? ? ? ? 注意這樣寫代碼才是靠譜喲,功能盡量細(xì)分唬复,功能盡量獨(dú)立出來矗积,變成一個(gè)小的函數(shù),可以被調(diào)用敞咧,后面修改起來也方便~
? ? ? ? 主函數(shù)中調(diào)用:
? ? ? ? 運(yùn)行:
? ? ? ? 現(xiàn)在還有一個(gè)需求棘捣,只將原先字符串中的ab調(diào)換一下位置,其他的不動(dòng)休建。
? ? ? ? 字符串反轉(zhuǎn)函數(shù):
? ? ? ? 數(shù)組反轉(zhuǎn)函數(shù):
? ? ? ? 主函數(shù)中調(diào)用:
? ? ? ? 運(yùn)行:
? ? ? ? 但是在Java中乍恐,但凡是取從頭到尾的部分,都是包含頭不包含尾的测砂。所以給這里減個(gè)1:
? ? ? ? 所以我們?nèi)绻€是想取ab c這一部分的話茵烈,調(diào)用的時(shí)候就應(yīng)該寫成reverseString(s,6,10);
? ? ? ? 而剛開始的整段字符串反轉(zhuǎn)的函數(shù)也可以改成這樣:
????08-String(字符串練習(xí)3)
? ? ? ? 代碼:
? ? ? ? 主函數(shù)中調(diào)用:
? ? ? ? 運(yùn)行:
? ? ? ? 這是第一種方式,我們換一種方式~更簡(jiǎn)單的那種~
? ? ·? ? indexOf方法還有一個(gè)重載砌些,可以從指定位置開始查找~
? ? ? ? 運(yùn)行:
? ? ? ? 那為什么不能調(diào)用split方法來解決呢呜投?
? ? ? ? 它在一定情況下可以返回正確的值,但在如下情況下就會(huì)和正確值有出入(kk在字符串頭部的時(shí)候):
? ? ? ? 所以split方法并不通用存璃,不建議使用它來解決這種問題哦仑荐。
????09-String(字符串練習(xí)4)
? ? ? ? 思路:
? ? ? ? 按這樣的思路在長(zhǎng)的字符串中來找~
? ? ? ? 因此,總結(jié)出規(guī)律:
? ? ? ? 代碼~(沒太看懂纵东,好復(fù)雜喔(释漆;′⌒`) )
? ? ? ? 又看了一次,懂啦篮迎,(*^__^*) 嘻嘻,還做了小筆記~
????????主函數(shù)中調(diào)用:
? ? ? ? 運(yùn)行結(jié)果:
? ? ? ? 我們發(fā)現(xiàn)示姿,目標(biāo)段hello在這個(gè)過程中已經(jīng)找到啦甜橱。
? ? ? ? 接下來只需添加小小一句代碼就可以獲取它~
? ? ? ? 編譯運(yùn)行:
? ? ? ? 但是還有一個(gè)小問題,在剛剛的代碼中栈戳,我們默認(rèn)形參中傳過來的s2是較短的那個(gè)字符串岂傲,可是實(shí)際中就不一定是這樣了呢。如果s2是較長(zhǎng)的那個(gè)子檀,那判斷的過程就會(huì)變得很冗長(zhǎng)镊掖,浪費(fèi)了時(shí)間~
? ? ? ? 我們?cè)谇懊婕由线@樣幾句,max用來存放較長(zhǎng)的字符串褂痰,min用來存放較短字符串:
? ? ? ? 驗(yàn)證一下:
? ? ? ? 成功~
? ? ? ? 下面的代碼也都修改一下: