最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java詳細(xì)分析String類(lèi)與StringBuffer和StringBuilder的使用方法

 更新時(shí)間:2022年04月25日 17:22:39   作者:洛語(yǔ)言  
當(dāng)對(duì)字符串進(jìn)行修改的時(shí)候,需要使用 StringBuffer 和 StringBuilder類(lèi),和String類(lèi)不同的是,StringBuffer和 StringBuilder類(lèi)的對(duì)象能夠被多次的修改,并且不產(chǎn)生新的未使用對(duì)象

String類(lèi)基本概念

  • String類(lèi)屬于引用數(shù)據(jù)類(lèi)型,不屬于基本數(shù)據(jù)類(lèi)型。
  • 在Java中只要是" "(雙引號(hào))中的,都是String對(duì)象。
  • java中規(guī)定,雙引號(hào)中的字符串是不可變的,也就是說(shuō)"abc"自出生到死亡都不可能變成"abcd",也不能變成"ab"。
  • 在JDK中雙引號(hào)括起來(lái)的字符串都是存儲(chǔ)在方法區(qū)的字符串常量池當(dāng)中的。(因?yàn)樵趯?shí)際開(kāi)發(fā)中,字符串的使用頻率十分高,為了執(zhí)行效率,就把字符串放在了方法區(qū)中的字符串常量池當(dāng)中)

String字符串的存儲(chǔ)原理

  • 通過(guò) String s = “abc” 這種方式,會(huì)在方法區(qū)中的字符串常量池創(chuàng)建對(duì)象,s會(huì)保存該字符串在字符串常量池中的地址。
  • 通過(guò) String s = new String(“abc”)的方式創(chuàng)建對(duì)象,首先會(huì)在字符串常量池中創(chuàng)建"abc"對(duì)象(如果字符串常量池中已經(jīng)有了"abc"則不會(huì)再次創(chuàng)建),然后會(huì)在堆區(qū)創(chuàng)建String類(lèi)對(duì)象,它會(huì)儲(chǔ)存" abc "在方法區(qū)中的地址,s又會(huì)保存堆中String對(duì)象的地址。

看以下代碼:

public class StringTest01 {
    //這兩行代碼表示創(chuàng)建3個(gè)字符串對(duì)象,且都在字符串常量池中
    String A = "abc";
    String B = "abc" + "de";
    //通過(guò) new 來(lái)創(chuàng)建字符串對(duì)象,會(huì)先在字符串常量池中尋找"abc"
    //找不到的話就會(huì)在字符串常量池中創(chuàng)建一個(gè)"abc"對(duì)象
    //在堆中創(chuàng)建創(chuàng)建字符串對(duì)象,并且保存"abc"在字符串常量池中的地址
    String C = new String("abc");
}

按照以上代碼畫(huà)出JVM內(nèi)存簡(jiǎn)圖如下:

知道了String類(lèi)字符串的存儲(chǔ)原理之后,就可以很容易知道以下代碼的編譯結(jié)果:

public class StringTest01 {
    public static void main(String[] args) {
        //沒(méi)有在堆中創(chuàng)建對(duì)象
        //s1與s2都存的是"hello"在字符串常量池中的地址
        String s1 = "hello";
        String s2 = "hello";
        //在堆中創(chuàng)建了對(duì)象
        //m,n分別存的是他們?cè)诙阎袑?duì)象的地址
        String m = new String("你好!");
        String n = new String("你好!");
        System.out.println(s1 == s2);//結(jié)果為true
        System.out.println(m == n);//結(jié)果為false
    }
}

String類(lèi)的常用構(gòu)造方法

//String類(lèi)構(gòu)造方法的使用
public class StringTest02 {
    public static void main(String[] args) {
        byte []x1 = { 97 , 98 , 99 };
        char []x2 = {'我','是','中','國(guó)','人'};
        //String s = new String(byte數(shù)組);
        String y1 = new String(x1);
        System.out.println(y1);//ABC
        //String s = new String(byte數(shù)組,偏移量,長(zhǎng)度)
        String y2  = new String(x1,1,2);
        System.out.println(y2);//BC
        //String s = new String(char數(shù)組)
        String y3 = new String(x2);
        System.out.println(y3);//我是中國(guó)人
        //String s = new String(char數(shù)組,偏移量,長(zhǎng)度)
        String y4 = new String(x2,2,3);
        System.out.println(y4);//中國(guó)人
    }
}

String類(lèi)中常用方法

public class StringTest03 {
    public static void main(String[] args) {
        //public char charAt(int index)方法
        //返回索引值處的char類(lèi)型字符
        char s1 = "中國(guó)人".charAt(1);
        System.out.println(s1);//國(guó)
        //public int compareTo(String anotherString)方法
        //按字典序比較兩個(gè)字符串
        System.out.println("abc".compareTo("abd"));//負(fù)整數(shù)
        System.out.println("abc".compareTo("abc"));//0
        System.out.println("abc".compareTo("abb"));//正整數(shù)
        //public boolean contains(CharSequence s)方法
        //判斷字符串是否包含s
        System.out.println("abcdefg".contains("efg"));//true
        System.out.println("abcdefg".contains("hij"));//false
        //public boolean endsWith(String suffix)方法
        //判斷字符串是否以suffix結(jié)尾
        System.out.println("abcde".endsWith("cde"));//true
        System.out.println("abcde".endsWith("qwe"));//false
        //public boolean equalsIgnoreCase(String anotherString) 方法
        //判斷兩個(gè)字符串是否相等,忽略大小寫(xiě)
        System.out.println("ABcd".equalsIgnoreCase("abCD"));//true
        //public byte[] getBytes()
        //將字符串轉(zhuǎn)換成byte數(shù)組,并返回
        byte [] s2 = "abcdefg".getBytes();
        for (int i = 0; i < s2.length; i++) {
            System.out.print(s2[i] + " ");
        }//97 98 99 100 101 102 103
        //public int indexOf(String str)
        //判斷某個(gè)子字符串在當(dāng)前字符串中第一次出現(xiàn)處的索引
        //若子字符串不存在,返回-1
        System.out.println("abcdefghigk".indexOf("hig"));//7
        System.out.println("abc".indexOf("fgh"));//-1
        //public int lastIndexOf(String str)
        //判斷某個(gè)子字符串最后一次出現(xiàn)在當(dāng)前字符串中的索引
        System.out.println("abcdhdhdabc".lastIndexOf("abc"));//8
        //public boolean isEmpty()
        //判斷字符串是否為空串
        //底層調(diào)用length()方法,空串長(zhǎng)度為0
        //注意:判斷數(shù)組長(zhǎng)度是length屬性,判斷字符串長(zhǎng)度是length()方法
        System.out.println("".isEmpty());//true
        //public String replace(char oldChar,char newChar)
        //返回一個(gè)將原字符串中所有的oldChar替換為newChar的新字符串,不改變?cè)址?
        String s3 = "aaatttooo";
        System.out.println( s3.replace('t','q'));//aaaqqqooo
        //public String replace(CharSequence target,CharSequence replacement)
        //CharSequence可以看出String
        //將原字符串中的 target 全部換成 replacement
        String s4 = "abcsgdjsssjabcjdjjdjabc";
        System.out.println(s4.replace("abc","www"));//wwwsgdjsssjwwwjdjjdjwww
        //public String[] split(String regex)
        //以regex為分界線,將字符串分割保存在一個(gè)字符串?dāng)?shù)組當(dāng)中,并返回
        String s5 = "2022-3-19";
        String [] str = s5.split("-");
        System.out.println(str[0] + str[1] + str[2]);//2022319
        //public String substring(int beginIndex)
        //返回一個(gè)以索引beginIndex開(kāi)始直至結(jié)尾的字符串
        System.out.println("abcdefgh".substring(4));//efgh
        //public String substring(int beginIndex,int endIndex)
        //返回一個(gè)以索引值beginIndex開(kāi)始,以索引值endIndex結(jié)束(不包含該索引值處的字符)的子字符串
        System.out.println("abcdefgh".substring(2,5));//cde
        //public char[] toCharArray()
        //將一個(gè)字符串以字符數(shù)組的形式返回
        char[] str2 = "abcdefg".toCharArray();
        for(int i = 0 ; i < str2.length ; i++){
            System.out.println(str2[i]);
        }
        //public String toLowerCase()
        //返回一個(gè)將原字符串中所有字符變成小寫(xiě)的新字符串
        System.out.println("ABcDeFG".toLowerCase());//abcdefg
        //public String toUpperCase()
        //返回一個(gè)將原字符串中所有字符變成大寫(xiě)的新字符串
        System.out.println("aCbcdEfg".toUpperCase());//ABCDEFG
        //public String trim()
        // 返回一個(gè)去除字符串的前后空白(空格)的新字符串
        System.out.println("       abcdefg      ".trim());//abcdefg
        //public static String valueOf(參數(shù)列表)
        //參數(shù)列表可以是int型,char型,int數(shù)組,對(duì)象 等等.......
        //String類(lèi)中唯一一個(gè)靜態(tài)方法,可以直接調(diào)用
        //將非字符串轉(zhuǎn)換為字符串
        //println()底層調(diào)用的就是valueOf()方法,只要是打印在控制臺(tái)上的都是字符串
        System.out.println(String.valueOf(true));
    }
}

StringBuffer類(lèi)

思考:

  • 頻繁使用字符串拼接會(huì)有什么影響?
  • java中字符串是不可變的,每拼接一次都會(huì)產(chǎn)生一個(gè)新的字符串
  • 字符串是存在字符串常量池中的,頻繁使用字符串拼接會(huì)占用大量的方法區(qū)空間

為了避免以上問(wèn)題我們就可以使用到StringBuffer類(lèi)

//java.lang.StringBuffer
public class StringBufferTest {
    public static void main(String[] args) {
        //創(chuàng)建一個(gè)初始化容量為16個(gè) byte[] 數(shù)組(字符串緩沖區(qū)對(duì)象)
        StringBuffer strBuffer = new StringBuffer();
        //拼接字符串調(diào)用 append()方法
        //append()方法底層會(huì)調(diào)用 System.arraycopy()方法,效率較低
        //append()再追加時(shí),如果byte[]滿了之后會(huì)自動(dòng)擴(kuò)容
        strBuffer.append(1);
        strBuffer.append('q');
        strBuffer.append(3.14);
        strBuffer.append("abc");
        System.out.println(strBuffer);//1q3.14abc
        //StringBuffer可以進(jìn)行一定的優(yōu)化
        //在創(chuàng)建StringBuffer時(shí)盡可能可能給定一個(gè)合適的初始化容量
        //從而減少底層數(shù)組的擴(kuò)容次數(shù)
        //指定初始化容量的字符串緩沖區(qū)
        StringBuffer newstrBuffer = new StringBuffer(100);
    }
}

StringBuilder類(lèi)

它的用法與StringBuffer十分相似,但是也有很大的區(qū)別:

  • StringBuffer中的方法都有synchronized關(guān)鍵字修飾,表示StringBuffer在多線程編譯環(huán)境下是安全的
  • StringBuilder中方法沒(méi)有synchronized關(guān)鍵字修飾,表示StringBuilder在多線程編譯環(huán)境下是不安全的

到此這篇關(guān)于Java詳細(xì)分析String類(lèi)與StringBuffer和StringBuilder的使用方法的文章就介紹到這了,更多相關(guān)Java String類(lèi)用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring MVC返回的json去除根節(jié)點(diǎn)名稱(chēng)的方法

    Spring MVC返回的json去除根節(jié)點(diǎn)名稱(chēng)的方法

    這篇文章主要介紹了Spring MVC返回的json去除根節(jié)點(diǎn)名稱(chēng)的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-09-09
  • 10個(gè)SpringBoot參數(shù)驗(yàn)證你需要知道的技巧分享

    10個(gè)SpringBoot參數(shù)驗(yàn)證你需要知道的技巧分享

    參數(shù)驗(yàn)證很重要,是平時(shí)開(kāi)發(fā)環(huán)節(jié)中不可少的一部分,那么在Spring?Boot應(yīng)用中如何做好參數(shù)校驗(yàn)工作呢,本文提供了10個(gè)小技巧,你知道幾個(gè)呢
    2023-03-03
  • spring mvc中的@PathVariable獲得請(qǐng)求url中的動(dòng)態(tài)參數(shù)

    spring mvc中的@PathVariable獲得請(qǐng)求url中的動(dòng)態(tài)參數(shù)

    本文主要介紹了spring mvc中的@PathVariable獲得請(qǐng)求url中的動(dòng)態(tài)參數(shù)的代碼。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • Maven配置中repositories、distributionManagement、pluginRepositories用法及將已有jar包部署到私服

    Maven配置中repositories、distributionManagement、pluginRepositori

    這篇文章主要介紹了Maven配置中repositories、distributionManagement、pluginRepositories用法及將已有jar包部署到私服,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • java實(shí)現(xiàn)接口的典型案例

    java實(shí)現(xiàn)接口的典型案例

    下面小編就為大家?guī)?lái)一篇java實(shí)現(xiàn)接口的典型案例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • MyBatis類(lèi)型轉(zhuǎn)換模塊的實(shí)現(xiàn)

    MyBatis類(lèi)型轉(zhuǎn)換模塊的實(shí)現(xiàn)

    MyBatis是一個(gè)持久層框架ORM框架,實(shí)現(xiàn)數(shù)據(jù)庫(kù)中數(shù)據(jù)和Java對(duì)象中的屬性的雙向映射,那么不可避免的就會(huì)碰到類(lèi)型轉(zhuǎn)換的問(wèn)題,本文主要介紹了MyBatis類(lèi)型轉(zhuǎn)換模塊的實(shí)現(xiàn),感興趣的可以了解一下
    2023-09-09
  • java不通過(guò)配置文件初始化logger示例

    java不通過(guò)配置文件初始化logger示例

    這篇文章主要介紹了java不通過(guò)配置文件初始化logger示例,需要的朋友可以參考下
    2014-05-05
  • java IO流之轉(zhuǎn)換流的具體使用

    java IO流之轉(zhuǎn)換流的具體使用

    轉(zhuǎn)換流可以將一個(gè)字節(jié)流包裝成字符流,或者將一個(gè)字符流包裝成字節(jié)流,本文主要介紹了java IO流之轉(zhuǎn)換流的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • Java中常見(jiàn)的查找算法與排序算法總結(jié)

    Java中常見(jiàn)的查找算法與排序算法總結(jié)

    數(shù)據(jù)結(jié)構(gòu)是數(shù)據(jù)存儲(chǔ)的方式,算法是數(shù)據(jù)計(jì)算的方式。所以在開(kāi)發(fā)中,算法和數(shù)據(jù)結(jié)構(gòu)息息相關(guān)。本文為大家整理了Java中常見(jiàn)的查找與排序算法的實(shí)現(xiàn),需要的可以參考一下
    2023-03-03
  • Java編程調(diào)用微信支付功能的方法詳解

    Java編程調(diào)用微信支付功能的方法詳解

    這篇文章主要介紹了Java編程調(diào)用微信支付功能的方法,結(jié)合實(shí)例形式詳細(xì)分析了java微信支付功能的原理、操作流程及相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-08-08

最新評(píng)論

商水县| 新兴县| 洪洞县| 天台县| 长汀县| 华宁县| 德保县| 云林县| 会理县| 嘉定区| 郸城县| 鄄城县| 红河县| 翼城县| 江门市| 益阳市| 马公市| 罗甸县| 游戏| 丹寨县| 石林| 鄄城县| 文山县| 曲周县| 嘉定区| 张掖市| 班戈县| 孝昌县| 岫岩| 交城县| 中方县| 林西县| 红原县| 齐齐哈尔市| 神池县| 龙川县| 滦平县| 莱西市| 三亚市| 弋阳县| 新兴县|