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

Java中關(guān)于String StringBuffer StringBuilder特性深度解析

 更新時(shí)間:2021年09月13日 17:12:23   作者:威斯布魯克.猩猩  
這篇文章主要介紹了Java中關(guān)于String StringBuffer StringBuilder特性深度解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

1.String

String類:字符串是常量,使用一對(duì)""引起來(lái)表示。他們的值在創(chuàng)建之后不能修改。
1.String聲明為final的,不可被繼承
2.String實(shí)現(xiàn)了Serializable接口,表示字符串時(shí)支持序列化的。
實(shí)現(xiàn)了Comparable接口:表示String可以比較大小
3.String內(nèi)部定義了final char[] value用于存儲(chǔ)字符串?dāng)?shù)據(jù)
4.String:代表不可變的字符序列。簡(jiǎn)稱:不可變性

體現(xiàn):

1.當(dāng)對(duì)字符串重新賦值時(shí),需要重寫指定內(nèi)存區(qū)域賦值,不能使用原有的value進(jìn)行賦值
2.當(dāng)對(duì)現(xiàn)有的字符串進(jìn)行連接( + )操作時(shí),也需要重寫指定內(nèi)存區(qū)域賦值,不能使用原有的 value進(jìn)行賦值
3.當(dāng)調(diào)用String的replace()方法修改指定字符或字符串時(shí),也需要重新指定內(nèi)存區(qū)域賦值,不能使用原有的value進(jìn)行賦值
5.通過(guò)字面量的方式(區(qū)別于new)給一個(gè)字符串賦值,此時(shí)的字符串值聲明在字符串常量池中。
6.字符串常量池是不會(huì)存儲(chǔ)相同內(nèi)容的字符串的。

    public void test1(){
        //體現(xiàn)1
        String s1 = "abc";//字面量的定義方式
        String s2 = "abc";
        s1 = "hello";
        System.out.println(s1 == s2);//比較s1和s2的地址值
        System.out.println(s1);//hello
        System.out.println(s2);//abc
        System.out.println("********************************");
        //體現(xiàn)2
        String s3 = "abc";
        s3 += "def";
        System.out.println(s3);//abcdef
        System.out.println(s2);//abc
        System.out.println("***********************************");
        //體現(xiàn)3
        String s4 = "abc";
        String s5 = s4.replace('a','m');
        System.out.println(s4);//abc
        System.out.println(s5);//mbc
    }

String的實(shí)例化方式:

方式一:通過(guò)字面量定義的方式
方式二:通過(guò)new + 構(gòu)造器的方式
面試題:String s = new String("abc")的方式創(chuàng)建對(duì)象,在內(nèi)存中創(chuàng)建了幾個(gè)對(duì)象?
兩個(gè):一個(gè)是堆空間中new結(jié)構(gòu),另一個(gè)是char[]對(duì)應(yīng)的常量池中的數(shù)據(jù):"abc"

 public void Test2(){
        //通過(guò)字面量定義的方式:此時(shí)的s1和s2的數(shù)據(jù)javaEE聲明在方法區(qū)中的字符串常量池中。
        String s1 = "javaEE";
        String s2 = "javaEE";
        //通過(guò)new + 構(gòu)造器的方式:此時(shí)的s3和s4保存的地址值,是數(shù)據(jù)在堆空間中開辟空間以后對(duì)應(yīng)的地址值
        String s3 = new String("javaEE");
        String s4 = new String("javaEE");
        System.out.println(s1 == s2);//true
        System.out.println(s1 == s3);//false
        System.out.println(s1 == s4);//false
        System.out.println(s3 == s4);//false
        System.out.println("******************************************");
        Person p1 = new Person("Tom",12);
        Person p2 = new Person("Tom",12);
        System.out.println(p1.name.equals(p2.name));//true
        System.out.println(p1.name == p2.name);//true//通過(guò)字面量的方式賦值,所以是true!!!!!!!!!!!!
    }

public void Test3(){
        String s1 = "javaEE";
        String s2 = "hadoop";
        String s3 = "javaEEhadoop";
        String s4 = "javaEE" + "hadoop";
        String s5 = s1 + "hadoop";
        String s6 = "javaEE" + s2;
        String s7 = s1 + s2;
        System.out.println(s3 == s4);//true
        System.out.println(s3 == s5);//false//字面值方式的儲(chǔ)存在常量池,有變量的在堆里
        System.out.println(s3 == s6);//false
        System.out.println(s3 == s7);//false
        System.out.println(s5 == s6);//false
        System.out.println(s5 == s7);//false
        System.out.println(s6 == s7);//false
        String s8 = s5.intern();//返回值得到的s8使用的常量池已經(jīng)存在的"javaEEhadoop"
        System.out.println(s3 == s8);//true
    }
 @Test
    public void test4(){
        String s1 = "javaEEhadoop";
        String s2 = "javaEE";
        String s3 = s2 + "hadoop";
        System.out.println(s1 == s3);//false
        final String s4 = "javaEE";//s4:常量
        String s5 = s4 + "hadoop";
        System.out.println(s1 == s5);//true
    }

結(jié)論:
1.常量與常量的拼接結(jié)果在常量池。且常量池中不會(huì)存在相同內(nèi)容的常量。
2.只要其中有一個(gè)是變量,結(jié)果就在堆中。
3.如果拼接的結(jié)果調(diào)用intern()方法,返回值就在常量池中

一道有深度的面試題

public class StringTest {
    String str = new String("good");
    char[] ch = {'t','e','s','t'};
    public void change(String str,char ch[]){
        str = "test ok";
        ch[0] = 'b';
    }
    public static void main(String[] args) {
        StringTest ex = new StringTest();
        ex.change(ex.str,ex.ch);
        System.out.println(ex.str);//good
        System.out.println(ex.ch);//best
    }
}

解析:

1.涉及的知識(shí):

關(guān)于變量的賦值:如果變量是基本數(shù)據(jù)類型,此時(shí)賦值的是變量所保存的數(shù)據(jù)值。

如果變量是引用數(shù)據(jù)類型,此時(shí)賦值的是變量所保存的數(shù)據(jù)的地址值。

Java中的方法的值傳遞機(jī)制:所謂的值傳遞,就是將實(shí)參值的副本傳入方法里,而參數(shù)本身不受影響。

2.面試題的解析:因?yàn)閭髦颠^(guò)程中,傳給形參的是地址值,而通過(guò)String試圖修改實(shí)參是行不通的,因?yàn)镾tring有不可變性。而數(shù)組的內(nèi)容是可以修改的,通過(guò)形參修改堆空間中的數(shù)組中的內(nèi)容,實(shí)參也會(huì)改變,因?yàn)樾螀⒑蛯?shí)參指向?qū)臻g中的同一個(gè)內(nèi)容

String的常用方法及其測(cè)試

 public void test1(){
        String s1 = "HelloWorld";
        System.out.println(s1.length());//10
        System.out.println(s1.charAt(0));//H
        System.out.println(s1.isEmpty());//false
        String s2 = s1.toLowerCase();
        System.out.println(s1);//HelloWorld//s1是不可變的,仍然為原來(lái)的字符串
        System.out.println(s2);//helloworld//改成小寫以后的字符串
        String s3 = "  he  llo  world  ";
        String s4 = s3.trim();
        System.out.println("-----" + s3 + "-----");//-----  he  llo  world  -----
        System.out.println("-----" + s4 + "-----");// -----he  llo  world-----
}
public void test2(){
        String s1 = "HelloWorld";
        String s2 = "helloworld";
        System.out.println(s1.equals(s2));//false
        System.out.println(s1.equalsIgnoreCase(s2));//true
        String s3 = "abc";
        String s4 = s3.concat("def");
        System.out.println(s4);//abcdef
        String s5 = "abc";
        String s6 = new String("abe");
        System.out.println(s5.compareTo(s6));//-2
        String s7 = "開關(guān)電源適配器";
        String s8 = s7.substring(2);
        System.out.println(s7);//開關(guān)電源適配器
        System.out.println(s8);//電源適配器
        String s9 = s7.substring(2,5);
        System.out.println(s9);//電源適
 }

 public void test3(){
        String str1 = "helloworld";
        boolean b1 = str1.endsWith("rld");
        System.out.println(b1);//true
        boolean b2 = str1.endsWith("He");
        System.out.println(b2);//false
        boolean b3 = str1.startsWith("ll",2);
        System.out.println(b3);//true
        String str2 = "wor";
        System.out.println(str1.contains(str2));//true
        System.out.println(str1.indexOf("lol"));//-1
        System.out.println(str1.indexOf("lo",5));//-1
        String str3 = "hellorworld";
        System.out.println(str3.lastIndexOf("or"));//7
        System.out.println(str3.lastIndexOf("or",6));//4
    }

此方法測(cè)試詳見另一篇博客:自動(dòng)裝箱與自動(dòng)拆箱

與正則表達(dá)式有關(guān)的方法的測(cè)試

public void test4(){
        String str1 = "北京尚硅谷教育北京";
        String str2 = str1.replace('北','東');
        System.out.println(str1);//北京尚硅谷教育北京
        System.out.println(str2);//  東京尚硅谷教育東京
        String str3 = str1.replace("北京","上海");
        System.out.println(str3);//上海尚硅谷教育上海
        String str = "12hello34world5java7891mysql456";
        //把字符串中的數(shù)字替換成,,如果結(jié)果中開頭和結(jié)尾有,的話去掉
        String string = str.replaceAll("\\d+",",").replaceAll("^,|,$","");
        System.out.println(string);//hello,world,java,mysql
        str = "12345";
        //判斷str字符串中是否全部由數(shù)字組成,既由1-n個(gè)數(shù)字組成
        boolean matches = str.matches("\\d+");
        System.out.println(matches);//true
        String tel = "0571-4534289";
        //判斷這是否是一個(gè)杭州的固定電話
        boolean result = tel.matches("0571-\\d{7,8}");
        System.out.println(result);//true
        str = "hello|world|java";
        String[] strs = str.split("\\|");
        for(int i = 0;i < strs.length;i++){
            System.out.print(strs[i]);//hello world java
        }
    }

 /*
    String 與 char[]之間的轉(zhuǎn)換
    String --> char[]:調(diào)用String的toCharArray()
    char[] --> String:調(diào)用String的構(gòu)造器
    */
    @Test
    public void test2(){
        String str1 = "abc123";
        char[] charArray = str1.toCharArray();
        for(int i = 0;i < charArray.length;i++){
            System.out.println(charArray[i]);
        }
        char[] arr = new char[]{'h','e','l','l','o'};
        String str2 = new String(arr);
        System.out.println(str2);
    }

/*
    String 與 byte[]之間的轉(zhuǎn)換
    編碼:String --> byte[]:調(diào)用String的getBytes()
    解碼: byte[] --> String:調(diào)用String的構(gòu)造器
    編碼:字符串 --> 字節(jié)(看得懂 --> 看不懂的二進(jìn)制數(shù)據(jù))
    解碼:編碼的逆過(guò)程,字節(jié) --> 字符串 (看不懂的二進(jìn)制數(shù)據(jù) --> 看的懂)
    說(shuō)明:解碼時(shí),要求解碼使用的字符集必須與編碼時(shí)使用的編碼集一致,否則會(huì)出現(xiàn)亂碼。
     */
    @Test
    public void test3() throws UnsupportedEncodingException {
        String str1 = "abc123中國(guó)";
        byte[] bytes = str1.getBytes();//使用默認(rèn)的字符集,進(jìn)行轉(zhuǎn)換
        System.out.println(Arrays.toString(bytes));//[97, 98, 99, 49, 50, 51, -28, -72, -83, -27, -101, -67]
        byte[] gbks = str1.getBytes("gbk");//使用了gbk字符集進(jìn)行編碼
        System.out.println(Arrays.toString(gbks));//[97, 98, 99, 49, 50, 51, -42, -48, -71, -6]
        String str2 = new String(bytes);//使用默認(rèn)的字符集,進(jìn)行解碼
        System.out.println(str2);//abc123中國(guó)
        String str3 = new String(gbks);//abc123�й�//亂碼
        System.out.println(str3);//出現(xiàn)亂碼,原因:編碼集和解碼集不一致!
        String str4 = new String(gbks,"gbk");
        System.out.println(str4);//abc123中國(guó)
    }

String、StringBuffer、StringBuilder三者的異同?
String:不可變的字符序列:底層使用char[]存儲(chǔ)
StringBuffer:可變的字符序列:線程安全的,效率低;底層使用char[]存儲(chǔ)
StringBuilder:可變的字符序列:JDK5.0新增的,線程不安全的,效率高;底層使用char[]存儲(chǔ)

源碼分析:

String str = new String();//char[] value = new char[0];
String str1 = new String("abc");//char[] value = new char[]{'a','b','c'};
StringBuffer sb1 = new StringBuffer();//char[] value = new char[16];底層創(chuàng)建了一個(gè)長(zhǎng)度是16的數(shù)組。
sb1.append('a');//value[0] = 'a';
sb1.append('b');//value[1] = 'b';
StringBuffer sb2 = new StringBuffer("abc");//char[] value = new char["abc".length() + 16];

​​​​問(wèn)題1. System.out.println(sb2.length());//3
問(wèn)題2. 擴(kuò)容問(wèn)題:如果要添加的數(shù)據(jù)底層數(shù)組盛不下了,那就需要擴(kuò)容底層的數(shù)組。
默認(rèn)情況下,擴(kuò)容為原來(lái)容量的2倍 + 2,同時(shí)將原有的數(shù)組中的元素復(fù)制到新的數(shù)組中
指導(dǎo)意義:開發(fā)中建議大家使用:StringBuffer(int capacity)或StringBuilder(int capacity),
傳入預(yù)知的參數(shù)長(zhǎng)度,可以避免擴(kuò)容,如果沒(méi)涉及到多線程,或者涉及到多線程,但String不是共享數(shù)據(jù)的時(shí)候,建議使用StringBuffer,因?yàn)樾矢?/p>

public void test1(){
        StringBuffer sb1 = new StringBuffer("abc");
        sb1.setCharAt(0,'m');
        System.out.println(sb1);//mbc
    }

對(duì)比String、StringBuffer、StringBuilder三者的效率:

從高到低排列:StringBuilder > StringBuffer > String

到此這篇關(guān)于Java中關(guān)于String StringBuffer StringBuilder特性深度解析的文章就介紹到這了,更多相關(guān)Java String StringBuffer StringBuilder內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實(shí)現(xiàn)聯(lián)系人管理系統(tǒng)

    Java實(shí)現(xiàn)聯(lián)系人管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)聯(lián)系人管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Spring?Cloud?Gateway編碼實(shí)現(xiàn)任意地址跳轉(zhuǎn)

    Spring?Cloud?Gateway編碼實(shí)現(xiàn)任意地址跳轉(zhuǎn)

    這篇文章主要介紹了Spring?Cloud?Gateway編碼實(shí)現(xiàn)任意地址跳轉(zhuǎn)的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • Mybatisplus主鍵生成策略算法解析

    Mybatisplus主鍵生成策略算法解析

    這篇文章主要介紹了Mybatisplus主鍵生成策略算法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • java中的過(guò)濾器 Filter應(yīng)用小結(jié)

    java中的過(guò)濾器 Filter應(yīng)用小結(jié)

    文章主要介紹了Java Web中的過(guò)濾器(Filter)的基本概念、生命周期、配置和應(yīng)用,過(guò)濾器可以攔截請(qǐng)求和響應(yīng),用于執(zhí)行一些預(yù)處理或后處理操作,如設(shè)置編碼、校驗(yàn)用戶身份等,感興趣的朋友一起看看吧
    2025-03-03
  • Spring Cloud Sleuth整合zipkin過(guò)程解析

    Spring Cloud Sleuth整合zipkin過(guò)程解析

    這篇文章主要介紹了Spring Cloud Sleuth整合zipkin過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Java實(shí)現(xiàn)聊天機(jī)器人

    Java實(shí)現(xiàn)聊天機(jī)器人

    這篇文章主要為大家詳細(xì)介紹了Java簡(jiǎn)單實(shí)現(xiàn)聊天機(jī)器人,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Java用鄰接表存儲(chǔ)圖的示例代碼

    Java用鄰接表存儲(chǔ)圖的示例代碼

    鄰接表是圖的一種鏈?zhǔn)酱鎯?chǔ)方法,其數(shù)據(jù)結(jié)構(gòu)包括兩部分:節(jié)點(diǎn)和鄰接點(diǎn)。本文將用鄰接表實(shí)現(xiàn)存儲(chǔ)圖,感興趣的小伙伴可以了解一下
    2022-06-06
  • Spring中的BeanFactory對(duì)象實(shí)例化工廠詳解

    Spring中的BeanFactory對(duì)象實(shí)例化工廠詳解

    這篇文章主要介紹了Spring中的BeanFactory對(duì)象實(shí)例化工廠詳解,BeanFactory及其子類是Spring IOC容器中最重要的一個(gè)類,BeanFactory由類名可以看出其是一個(gè)Bean工廠類,其實(shí)它確實(shí)是一個(gè)Bean工廠類,完成Bean的初始化操作,需要的朋友可以參考下
    2023-12-12
  • 使用Spring?Boot進(jìn)行單元測(cè)試詳情

    使用Spring?Boot進(jìn)行單元測(cè)試詳情

    這篇文章主要介紹了使用Spring?Boot進(jìn)行單元測(cè)試詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • Java中的字節(jié)流文件讀取教程(二)

    Java中的字節(jié)流文件讀取教程(二)

    這篇文章主要給大家介紹了關(guān)于Java中字節(jié)流文件讀取的相關(guān)資料,本文屬于之前文章的延長(zhǎng)篇,有需要的朋友可以先看看上一篇文章,相信會(huì)對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07

最新評(píng)論

德昌县| 安庆市| 泰和县| 拉孜县| 辛集市| 通山县| 镇康县| 澎湖县| 车险| 永顺县| 广水市| 房山区| 建宁县| 博乐市| 丰原市| 青海省| 栾城县| 荣成市| 安平县| 平湖市| 铁岭市| 黎川县| 巴彦淖尔市| 定边县| 石渠县| 南宫市| 英吉沙县| 达拉特旗| 遂平县| 准格尔旗| 镶黄旗| 咸宁市| 临夏市| 芒康县| 辽阳县| 名山县| 台山市| 敖汉旗| 南平市| 纳雍县| 大城县|