在线不卡日本ⅴ一区v二区_精品一区二区中文字幕_天堂v在线视频_亚洲五月天婷婷中文网站

  • <menu id="lky3g"></menu>
  • <style id="lky3g"></style>
    <pre id="lky3g"><tt id="lky3g"></tt></pre>

    《Java小子怒闖數(shù)據(jù)結(jié)構(gòu)九重天》第二重天-字符串

    《Java小子怒闖數(shù)據(jù)結(jié)構(gòu)九重天》第二重天-字符串

    前言

    自古以來數(shù)據(jù)結(jié)構(gòu)界就分為九重天,據(jù)說沖破這九重天之后就可以去進(jìn)攻算法界最終修煉最后成大佬,受萬人敬仰。

    但是這談何容易,因為每一重天都有神獸把守,想要沖破每一重天都必須收服守護(hù)的神獸才行。

    守護(hù)九重天的神獸分別是:數(shù)組、字符串、棧、隊列、鏈表、樹、散列表、堆、圖??梢娝麄兊膽?zhàn)斗力也是逐層增強的。想只憑靠自身的能力拿下他們談何容易。

    不過大家不必驚慌,我這里有一本上古秘籍《Java小子怒闖數(shù)據(jù)結(jié)構(gòu)九重天》,里面有每一重天神獸的攻略。只要修煉者仔細(xì)鉆研里面的每一篇,對九重天了如指掌之后,沖破這九重天也是易如反掌的。

    今天為大家?guī)淼氖堑诙靥斓墓ヂ裕?/p>

    注意:所有資料都是免費提供!大家領(lǐng)取之后不要做收藏黨哦!,獲得更多自學(xué)java咨詢!

    目錄

    • 前言
    • 1.字符串基礎(chǔ)知識
    • 2.StringBuilder類
    • 3.初始化String類
    • 4.String類常用API
    • 5.字符串進(jìn)階練習(xí)
    • 結(jié)語

    1.字符串基礎(chǔ)知識

    串(string)是由零個或多個字符組成的有限序列,又名字符串。

    我們可以從這段段基本概念中知道:

    • 零個或多個字符組成:說明字符串的內(nèi)部元素類型為字符。
    • 有限:說明字符串的內(nèi)容長度是有一定限制的,小于一個最大范圍,但是在該范圍內(nèi),實際的長度是不確定的。
    • 序列:說明字符串中的相鄰字符存在前驅(qū)和后繼的關(guān)系。

    在Java中沒有內(nèi)置的字符串類型,每個用雙引號括起來的字符串都是Java中String類的一個實例。

    也就是說Java中String并不是數(shù)據(jù)類型,在Java中所有的字符串都是String的實例化對象。

    Java中的String

    Java中的String類代表字符串,Java 程序中的所有字符串文字(例如“abc”)都為此類的實例。

    也就是說,Java程序中所有的雙引號字符串,都是 String 類的對象。String 類在 java.lang 包下,所以使用的時候不需要導(dǎo)包!

    在Java中String最重要的特點就是:

    String 類是不可改變的,所以你一旦創(chuàng)建了 String 對象,那它的值就無法改變了。我們將這種特性稱為String的不可變性。

    字符串的不可變性

    不可變性:當(dāng)你給一個字符串重新賦值之后,老值并沒有在內(nèi)存中銷毀,而是重新開辟一塊空間存儲新值。

    也就是說一旦一個String對象在內(nèi)存中創(chuàng)建,它將是不可改變的,所有的String類中方法并不是改變String對象自己,而是重新創(chuàng)建一個新的String對象。

    例如:

    String s=”dcm”;String s=”ddccmm”

    當(dāng)s的值發(fā)生改變之后,ddccmm這個值并沒有覆蓋dcm,只是重新開發(fā)了一個新的空間去儲存ddccmm然后將s指向它。

    如果我們在實際開發(fā)中對含有大量字符的字符串進(jìn)行遍歷賦值修改,會對內(nèi)存中產(chǎn)生很多無法釋放的字符串對象,造成內(nèi)存垃圾。

    正因為String對象的不可變性,如果需要對字符串進(jìn)行大量的修改、添加字符、刪除字符等操作盡量不要使用String對象,因為這樣會頻繁的創(chuàng)建新的對象導(dǎo)致程序的執(zhí)行效率下降。

    這時我們可以使用Java中另外一個字符串類StringBuilder。

    我們在做題的時候關(guān)于字符串一般用的都是String類,但是考慮到我們有時候也會用到StringBuilder類這里我就對StringBuilder類進(jìn)行稍微細(xì)致一點的講解。

    2.StringBuilder類

    StringBuilder 是一個可變的字符串類,我們可以把它看成是一個容器,這里的可變指StringBuilder對象中的內(nèi)容是可變的。

    2.1 StringBuilder類常用的方法

    可以看出來,構(gòu)建一個StringBuilder的對象只能使用它的構(gòu)造方法來構(gòu)造,不像String一樣可以直接String s= “123”來創(chuàng)建

    因為StringBuilder類對象是可變的,所以當(dāng)我們對一個字符串需要進(jìn)行改變比較多的時候一般定義為StringBuilder類。

    2.2 String和StringBuilder的區(qū)別

    String 對象是不可改變的。每次使用String 類中的方法之一時,都要在內(nèi)存中創(chuàng)建一個新的字符串對象,這就需要為該新對象分配新的空間。

    StringBuilder對象是動態(tài)對象,允許擴充它所封裝的字符串中字符的數(shù)量,但是您可以為它可容納的最大字符數(shù)指定一個值,當(dāng)修改 StringBuilder 時,在達(dá)到容量之前,它不會為其自己重新分配空間。當(dāng)達(dá)到容量時,將自動分配新的空間且容量翻倍。也就是說當(dāng)對字符串進(jìn)行改變時,都是對當(dāng)前對象的狀態(tài)進(jìn)行更新的。

    可以使用重載的構(gòu)造函數(shù)之一來指定 StringBuilder 類的容量。

    2.3 String類與StringBuilder類的相互轉(zhuǎn)換

    String類轉(zhuǎn)換為StringBuilder類

    public class String{ public static void main(String[] args){ String s = “baibai”; StringBuilder s1 = new StringBuilder(s); System.out.println(s1); }}

    StringBuilder類轉(zhuǎn)換為String類

    public class String { public static void main(String[] args){ StringBuilder s1 = new StringBuilder(); //連續(xù)連接 s1.append(“abc”).append(“efg”); String s = s1.toString(); System.out.println(s); }}

    3.初始化String類

    3.1初始化String對象的兩種方法:

    //方法一:直接創(chuàng)建String s1= “大聰明 超牛的”;//方法二:對象創(chuàng)建String s2 = new String(“大聰明 超牛的”); String s3 = new String();//也可以創(chuàng)建一個空串

    雖然兩種方法看起來是一樣的但是本質(zhì)上是不一樣的。String 創(chuàng)建的字符串存儲在公共池中,而 new 創(chuàng)建的字符串對象在堆上。那存放在公共池(常量池)與堆中有什么不一樣嗎?

    我們來舉個例子:

    String s1 = “大聰明 超牛的”; // String 直接創(chuàng)建String s2 = “大聰明 超牛的”; // String 直接創(chuàng)建String s3 = s1; // 相同引用String s4 = new String(“大聰明 超牛的”); // String 對象創(chuàng)建String s5 = new String(“大聰明 超牛的”); // String 對象創(chuàng)建System.out.println(System.identityHashCode(s1));System.out.println(System.identityHashCode(s2));System.out.println(System.identityHashCode(s3));System.out.println(System.identityHashCode(s4));System.out.println(System.identityHashCode(s5));

    輸出:

    可見前三個字符串的地址相同,后兩個各不相同!

    這是因為直接創(chuàng)建的字符串時,會先在公共池中找有沒有這樣的字符串,如果有那就將引用直接指向它,而不去開發(fā)新的空間。在這里s1,s2,s3這三個引用指向了公共池中的同一塊內(nèi)存。

    對象創(chuàng)建時,每次都會在堆上開新的空間來存放字符串,也就是說s4,s5分別指向在堆上的兩塊不同的內(nèi)存,只不過這兩塊內(nèi)存里面都儲存著相同的東西。

    4.String類常用API

    這里再次強調(diào)一下,我們在做題的時候遇到關(guān)于字符串相關(guān)題目我們幾乎都是使用String類來解決問題,除了在字符串進(jìn)行大量更改時我們可能會暫時用到StringBuilder類。

    這里的暫時就是我們在對字符串更改等操作之后一般還是要把字符串轉(zhuǎn)換為String類的。

    所以我們要學(xué)習(xí)的API主要還是String類的API。對應(yīng)刷題我StringBuilder的API我們只需要學(xué)習(xí)上面提到的兩個就夠了。

    String 類在 java.lang 包下,所以使用的時候不需要導(dǎo)包!

    4.1 基本數(shù)據(jù)類型轉(zhuǎn)換成字符串

    有三種辦法:

    (1)基本類型數(shù)據(jù)的值+“” (最常用,最簡單);(2)使用包裝類中的靜態(tài)方法 static String toString(int i)返回一個表示指定整數(shù)的String 對象。如:在Integer中:Integer.toString(6);(3)使用String類中的靜態(tài)方法 static String valueOf(int i) 返回int 參數(shù)的字符串表示形式。如:String.valueOf(6);

    String 類別中已經(jīng)提供了將基本數(shù)據(jù)型態(tài)轉(zhuǎn)換成 String 的 static 方法也就是 String.valueOf() 這個參數(shù)多載的方法 :

    String.valueOf(boolean b) //將 boolean 變量 b 轉(zhuǎn)換成字符串 String.valueOf(char c) //將 char 變量 c 轉(zhuǎn)換成字符串 String.valueOf(char[] data)//將 char 數(shù)組 data 轉(zhuǎn)換成字符串 String.valueOf(char[] data, int offset, int count)//將char數(shù)組data中由data[offset]開始取 count個元素轉(zhuǎn)換成字符串 String.valueOf(double d)//將 double 變量 d 轉(zhuǎn)換成字符串 String.valueOf(float f)//將 float 變量 f 轉(zhuǎn)換成字符串 String.valueOf(int i)//將 int 變量 i 轉(zhuǎn)換成字符串 String.valueOf(long l)//將 long 變量 l 轉(zhuǎn)換成字符串 String.valueOf(Object obj)//將 obj 對象轉(zhuǎn)換成 字符串, 等于 obj.toString()

    因為是靜態(tài)方法所以不需要實例化。

    4.2 字符串轉(zhuǎn)換為基本數(shù)據(jù)類型

    一般使用包裝類的靜態(tài)方法parseXX(“字符串”)

    要將 String 轉(zhuǎn)換成基本數(shù)據(jù)類型大多需要使用基本數(shù)據(jù)型態(tài)的包裝類別,如:String 轉(zhuǎn)換成 byte可以使用 Byte.parseByte(String s)

    Byte.parseByte(String s)//將 s 轉(zhuǎn)換成 byte Byte.parseByte(String s, int radix)//以 radix 為基底 將 s 轉(zhuǎn)換為 byteDouble.parseDouble(String s)//將 s 轉(zhuǎn)換成 double Float.parseFloat(String s)//將 s 轉(zhuǎn)換成 float Integer.parseInt(String s)//將 s 轉(zhuǎn)換成 int Long.parseLong(String s)//將 s 轉(zhuǎn)換成 long

    注意這里也是靜態(tài)方法,只不過都是對應(yīng)包裝類的靜態(tài)方法

    4.3 使用length()得到一個字符串的字符個數(shù)

    int len = String.length();

    4.4 使用toCharArray() 將一個字符串轉(zhuǎn)換成字符數(shù)組

    Char[] arr = String.toCharArray();

    4.5 判斷兩個字符串的內(nèi)容是否相等返回true/false

    String1.equals(String2);//區(qū)分大小寫String1.equalsIgnoreCase(String2);//不區(qū)分大小寫

    4.6 與位置相關(guān)的字符串

    charAt(int)//得到指定下標(biāo)位置對應(yīng)的字符indexOf(String)//得到指定內(nèi)容第一次出現(xiàn)的下標(biāo)lastIndexOf(String)//得到指定內(nèi)容最后一次出現(xiàn)的下標(biāo)

    4.7 將一個字符串按照指定內(nèi)容劈開split(String) ,返回字符串?dāng)?shù)組。

    String s = “wa,dcm,nb!”;String[] str = s.split(“,”);//返回結(jié)果中str[1]=dcm

    4.8 contains(String) 判斷一個字符串里面是否包含指定的內(nèi)容,返回true/false

    Boolean a = String1.contains(String2)

    4.9 使用substring()截取字符串,返回子串

    String.substring(int)//從指定下標(biāo)開始一直截取到字符串的最后String.substring(int,int)//從下標(biāo)x截取到下標(biāo)y-1對應(yīng)的元素

    4.10 字符串大小寫轉(zhuǎn)換

    String.toUpperCase()//將一個字符串全部轉(zhuǎn)換成大寫String.toLowerCase()//將一個字符串全部轉(zhuǎn)換成小寫

    4.11 使用replace()進(jìn)行字符串內(nèi)容替換

    String.replace(String,String)//將某個內(nèi)容全部替換成指定內(nèi)容String.replaceAll(String,String)//將某個內(nèi)容全部替換成指定內(nèi)容,支持正則String.repalceFirst(String,String)//將第一次出現(xiàn)的某個內(nèi)容替換成指定的內(nèi)容

    5.字符串進(jìn)階練習(xí)

    387. 字符串中的第一個唯一字符

    題解:

    把字符串的單個字符轉(zhuǎn)化為對應(yīng)數(shù)組下標(biāo),遍歷一遍字符串獲得26個字母分別出現(xiàn)幾次。然后在遍歷一遍字符串看哪個字符先出現(xiàn)次數(shù)為1,就輸出對應(yīng)下標(biāo)。

    class Solution { public int firstUniqChar(String s) { int len = s.length(); int[] vis = new int[26]; int temp = -1; for(int i = 0; i < len; i ++) { vis[s.charAt(i) – 'a'] ++; } for(int i = 0; i < len; i ++) { if(vis[s.charAt(i) – 'a'] == 1) { return i; } } return -1; }}

    或者我們也可以把字符串先轉(zhuǎn)換為字符數(shù)組來解題,原理都是一樣的!

    class Solution { public int firstUniqChar(String s) { int[] arr = new int[26]; char[] chars = s.toCharArray(); for (int i = 0; i < chars.length; i++) { arr[chars[i] – 'a']++; } for (int i = 0; i < chars.length; i++) { if (arr[chars[i] – 'a'] == 1) { return i; } } return -1; }}

    結(jié)語

    恭喜你修煉到這里,你已經(jīng)基本有了收服神獸字符串的能力。神獸字符串是我們到進(jìn)攻算法界最基礎(chǔ)的能力之一。大家不可懈怠。

    感興趣的修煉者可以關(guān)注下面公眾號,會持續(xù)推送最新更新的!

    持續(xù)更新中…

    原文鏈接:https://mp.weixin.qq.com/s/5-uS4SGYLzqilLX8HkXBqw

    鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場,版權(quán)歸原作者所有,如有侵權(quán)請聯(lián)系管理員(admin#wlmqw.com)刪除。
    用戶投稿
    上一篇 2022年6月20日 06:09
    下一篇 2022年6月20日 06:09

    相關(guān)推薦

    • 分享4條發(fā)微商朋友圈的方法(微商朋友圈應(yīng)該怎么發(fā))

      對于微商朋友來說,朋友圈的重要性不言而喻了。 那么微商的朋友圈到底該怎么發(fā)呢? 為什么同樣是經(jīng)營一個朋友圈,有的微商看起來逼格滿滿,實際效果也不錯;而有的卻動都不動就被屏蔽甚至拉黑…

      2022年11月27日
    • 短視頻策劃內(nèi)容的3個要點(短視頻策劃內(nèi)容怎么做)

      短視頻在制作時,內(nèi)容框架非常重要。如果直奔主題,然后結(jié)束,聚卓告訴你,這樣的短視頻已經(jīng)過時了?,F(xiàn)在的短視頻需要框架的,但不是任何框架,它需要一種易于理解和消化的框架。而且,現(xiàn)在大多…

      2022年11月27日
    • 筆記本最好配置(目前筆記本最好的配置)

      本文主要講的是筆記本最好配置,以及和目前筆記本最好的配置相關(guān)的知識,如果覺得本文對您有所幫助,不要忘了將本文分享給朋友。 筆記本電腦什么配置好? 01 CPU:這個主要取決于頻率和…

      2022年11月26日
    • 存儲過程語法(sql server存儲過程語法)

      今天小編給各位分享存儲過程語法的知識,其中也會對sql server存儲過程語法進(jìn)行解釋,如果能碰巧解決你現(xiàn)在面臨的問題,別忘了關(guān)注本站,現(xiàn)在開始吧! oracle存儲過程基本語法…

      2022年11月26日
    • 《寶可夢朱紫》夢特性怎么獲得?隱藏特性獲取方法推薦

      寶可夢朱紫里有很多寶可夢都是擁有夢特性會變強的寶可夢,很多玩家不知道夢特性怎么獲得,下面就給大家?guī)韺毧蓧糁熳想[藏特性獲取方法推薦,感興趣的小伙伴一起來看看吧,希望能幫助到大家。 …

      2022年11月25日
    • 《寶可夢朱紫》奇魯莉安怎么進(jìn)化?奇魯莉安進(jìn)化方法分享

      寶可夢朱紫中的奇魯莉安要怎么進(jìn)化呢?很多玩家都不知道,下面就給大家?guī)韺毧蓧糁熳掀骠斃虬策M(jìn)化方法分享,感興趣的小伙伴一起來看看吧,希望能幫助到大家。 奇魯莉安進(jìn)化方法分享 奇魯莉安…

      2022年11月25日
    • 小紅書平臺的一些機制及玩法詳解(小紅書玩法有哪些)

      關(guān)于小紅書 一:小紅書平臺的一些機制 1. 筆記內(nèi)容的CES評分機制 2. 筆記流量入口與長尾效應(yīng) 二:小紅書優(yōu)質(zhì)筆記的特點(分維度、類型分析) 1.筆記的本身架構(gòu)組成 維度 2.…

      2022年11月25日
    • 博客營銷的3大優(yōu)勢解析(博客營銷怎么做)

      不知不覺已經(jīng)寫了24篇文章,加上這篇是第25篇了,都是自己這幾年來用過的營銷方法,如果遇到有些不懂的,我會咨詢我的朋友和同事幫忙,盡量讓每一篇有價值,哪怕是對大家有一點點幫助也行,…

      2022年11月25日
    • 什么是內(nèi)容營銷策略如何策劃一套成功的內(nèi)容營銷策略

      很多時候,營銷人員會在創(chuàng)作營銷內(nèi)容時感到沮喪,這也是很多企業(yè)至今沒用好數(shù)字化營銷工具的重要原因之一。 舉個例子,您可能會花上數(shù)小時期待制作一些令人驚嘆的東西,實際卻是得到很少的受眾…

      2022年11月25日
    • 直播帶貨詳細(xì)腳本(直播文案策劃怎么寫)

      短視頻運營策劃方案怎么寫?涉及哪幾個方面? 我在網(wǎng)上看到好多千篇一律的文章,關(guān)于【短視頻運營策劃方案】這一塊,基本都是在講賬號的內(nèi)容本身。 你內(nèi)容做得再好,卻不掌握算法的規(guī)律,能有…

      2022年11月25日

    聯(lián)系我們

    聯(lián)系郵箱:admin#wlmqw.com
    工作時間:周一至周五,10:30-18:30,節(jié)假日休息