日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

String 总结

發布時間:2025/6/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 String 总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

申明:

1.?首先String不屬于8種基本數據類型,String是一個對象。?因為對象的默認值是null,所以String

的默認值也是null;但它又是一種特殊的對象,有其它對象沒有的一些特性。?

2.?new?String()new?String("")都是申明一個新的空字符串,是空串不是null;?
3.?String?str="kvill";?與?String?str=new?String?("kvill");的區別:

?

在這里,我們不談堆,也不談棧,只先簡單引入常量池這個簡單的概念。?

常量池(constant?pool)指的是在編譯期被確定,并被保存在已編譯的.class文件中的一些數據。它包括了關于類、方法、接口等中的常量,也包括字符串常量。?
1:?

?

String?s0="kvill";?
String?s1="kvill";?
String?s2="kv"?+?"ill";?

System.out.println(?s0==s1?);?
System.out.println(?s0==s2?);

結果為:?

true?
true


首先,我們要知結果為道Java會確保一個字符串常量只有一個拷貝。?


因為例子中的s0s1中的"kvill"都是字符串常量,它們在編譯期就被確定了,所以s0==s1true;而"kv"和"ill"也都是字符串常量,當一個字符串由多個字符串常量連接而成時,它自己肯定也是字符串常量,所以s2也同樣在編譯期就被解析為一個字符串常量,所以s2也是常量池中"kvill"的一個引用。?所以我們得出s0==s1==s2;?

注:用new?String()?創建的字符串不是常量,不能在編譯期就確定,所以new?String()?創建的字符串不放入常量池中,它們有自己的地址空間。在運行時創建的字符串具有獨立的內存地址,所以不引用自同一String對象
2:?

String?s0="kvill";?
String?s1=new?String("kvill");?
String?s2="kv"?+?new?String("ill");?

System.out.println(?s0==s1?);
System.out.println(?s0==s2?);
System.out.println(?s1==s2?);

結果為:

false?
false?
false

?

2s0還是常量池中"kvill"的應用,s1因為無法在編譯期確定,所以是運行時創建的新對象"kvill"的引用,s2因為有后半部分new?String("ill")所以也無法在編譯期確定,所以也是一個新創建對象"kvill"的應用;明白了這些也就知道為何得出此結果了。?

4、String.intern():?
存在于.class文件中的常量池,在運行期被JVM裝載,并且可以擴充。Stringintern()方法就是擴充常量池的一個方法;當調用?intern?方法時,如果池已經包含一個等于此?String?對象的字符串(該對象由?equals(Object)?方法確定),則返回池中的字符串。否則,將此?String?對象添加到池中,并且返回此?String?對象的引用。

3:?

String?s0=?"kvill";?

String?s1=new?String("kvill");?
String?s2=new?String("kvill");?

System.out.println(?s0==s1?);?
System.out.println(?"**********"?);?

s1.intern();?
s2=s2.intern();?//把常量池中"kvill"的引用賦給s2?

System.out.println(?s0==s1);?
System.out.println(?s0==s1.intern()?);?
System.out.println(?s0==s2?);


結果為:?

false?
**********?
false?//雖然執行了s1.intern(),但它的返回值沒有賦給s1?
true?//說明s1.intern()返回的是常量池中"kvill"的引用?
true


4:?

String?s1=new?String("kvill");?
String?s2=s1.intern();?//s1?檢查常量池?發現沒有?就拷貝自己的字符串進去?,s2?引用該字符串常量池的地址

System.out.println(?s1==s1.intern());

System.out.println(?s1+"?"+s2?);
System.out.println(?s2==s1.intern());


結果:?

false?
kvill?kvill?
true


在這個類中我們沒有聲名一個"kvill"常量,所以常量池中一開始是沒有"kvill"的,當我們調用s1.intern()后就在常量池中新添加了一個"kvill"常量,原來不在常量池中的"kvill"仍然存在。
s1==s1.intern()false說明原來的"kvill"仍然存在;?
s2現在為常量池中"kvill"的地址,所以有s2==s1.intern()true。?

5、關于equals()==:?
equals簡單來說就是比較兩字符串的Unicode序列是否相當,如果相等返回true;==是比較兩字符串的地址是否相同,也就是是否是同一個字符串的引用。?對于字符串比較,一定要切記使用equals,勿用==.

?

StringStringBufferStringBuilder區別

1、三者在執行速度方面的比較:StringBuilder?>??StringBuffer??>??String

2、(StringBufferStringBuilder)在做字符串變動時將繼續使用原來的內存空間,不會重新分配內存。而String的長度或內容一旦變動,JVM將分配新的內存空間。

?

String?<StringBufferStringBuilder)的原因

    String 字符串常量

    StringBuffer 字符串變量

    StringBuilder 字符串變量

從上面的名字可以看到,String"字符串常量",也就是不可改變的對象。對于這句話的理解你可能會產生這樣一個疑問,比如這段代碼:

String?s?=?"abcd";
s?=?s+1;
System.out.print(s);//?result?:?abcd1

我們明明就是改變了String型的變量s的,為什么說是沒有改變呢??其實這是一種欺騙,JVM是這樣解析這段代碼的:首先創建對象s,賦予一個abcd,然后再創建一個新的對象s用來執行第二行代碼,也就是說我們之前對象s并沒有變化,所以我們說String類型是不可改變的對象了,由于這種機制,每當用String操作字符串時,實際上是在不斷的創建新的對象,而原來的對象就會變為垃圾被GC回收掉,可想而知這樣執行效率會有多底。

StringBufferStringBuilder就不一樣了,他們是字符串變量,是可改變的對象,每當我們用它們對字符串做操作時,實際上是在一個對象上操作的,這樣就不會像String一樣創建一些額外的對象進行操作了,效率自然提升。

?

2一個特殊的例子:

String?str?=?"This?is?only?a"?+?"?simple"?+?"?test";
StringBuffer?builder?=?new?StringBuilder("This?is?only?a").append("?simple").append("?test");

你會很驚訝的發現,生成str對象的速度簡直太快了,而這個時候StringBuilder居然速度上根本一點都不占優勢。其實這是JVM的一個把戲,實際上:

    String?str?=?"This?is?only?a"?+?"?simple"?+?"test";

其實就是:

    String?str?=?"This?is?only?a?simple?test";

  所以不需要太多的時間了。但大家這里要注意的是,如果你的字符串是來自另外的String對象的話,速度就沒那么快了,譬如:

    String?str2?=?"This?is?only?a";

    String?str3?=?"?simple";

    String?str4?=?"?test";

    String?str1?=?str2?+str3?+?str4;

    這時候JVM會規規矩矩的按照原來的方式去做。

3StringBuilder與?StringBuffer

    StringBuilder:線程非安全的

    StringBuffer:線程安全的

當我們在字符串緩沖去被多個線程使用是,JVM不能保證StringBuilder的操作是安全的,雖然他的速度最快,但是可以保證StringBuffer是可以正確操作的。當然大多數情況下就是我們是在單線程下進行的操作,所以大多數情況下是建議用StringBuilder而不用StringBuffer的,就是速度的原因。

?

對于三者使用的總結:?

1、如果要操作少量的數據?=?String

   2、單線程操作字符串緩沖區?下操作大量數據?=?StringBuilder

   3、多線程操作字符串緩沖區?下操作大量數據?=?StringBuffer

轉載于:https://www.cnblogs.com/DswCnblog/archive/2012/11/01/2750172.html

總結

以上是生活随笔為你收集整理的String 总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 经典三级av在线 | 国产尻逼视频 | 一区二区视频 | 色婷婷丁香 | 国产精品无码av在线有声小说 | 日韩欧美爱爱 | 邻居校草天天肉我h1v1 | 色在线视频观看 | 97爱视频| 日韩欧美xxxx | 日韩欧美三级视频 | 视频一区在线播放 | 午夜性影院 | 玩偶游戏在线观看免费 | 欧美成人激情在线 | 亚洲天堂2013 | 欧美激情视频一区二区三区在线播放 | 国产中出 | 精品人妻人人做人人爽 | 欧美一区二区三区免费观看 | av电影在线观看网址 | 东方欧美色图 | 91精品久久久久久久久中文字幕 | 啪啪导航| 潘金莲一级淫片aaaaa武则天 | 精品欧美黑人一区二区三区 | 国产美女在线看 | 国产乱妇无码大片在线观看 | 在线观看午夜视频 | 91精品人妻一区二区三区蜜桃2 | 亚洲免费网站在线观看 | 91国在线啪 | a国产在线| 91欧美激情一区二区三区 | www.亚洲一区二区 | 免费91视频| 人成精品 | 影音先锋中文字幕一区 | 日韩在线观看免费av | 亚洲丝袜中文字幕 | 成年免费视频黄网站在线观看 | 青草国产视频 | 亚洲欧美日本一区二区三区 | 亚洲国产欧美日韩在线 | 欧美一级精品 | 久久亚洲AV成人无码国产人妖 | 亚洲玖玖爱 | av久草| 欧美福利精品 | 久久精品www人人爽人人 | 国产91丝袜在线播放 | jizz免费观看 | 天天天干干干 | 国产成人无码久久久精品天美传媒 | 国产伦精品一区二区三区妓女下载 | 久久久在线视频 | 精品少妇爆乳无码av无码专区 | 日韩在线一二 | 日韩av中文在线 | 国产午夜精品久久久 | 最新久久| 国产精品一区二区三区免费观看 | 亚洲图片视频小说 | 怡红院一区二区三区 | 91成人精品 | 天堂网在线观看 | aaaaa级少妇高潮大片免费看 | 欧美在线视频不卡 | 亚洲做受高潮无遮挡 | 欧美人与禽zozzo性之恋的特点 | 黄色亚洲网站 | 黄色com| 日本乱子伦| 欧美综合社区 | 伦理片av | 麻豆精品视频免费观看 | 国产五月婷婷 | 亚洲国产成人精品91久久久 | 亚洲永久网站 | 黄色高潮视频 | 黄色片a| 国产精品永久免费观看 | 中文字幕丰满孑伦无码专区 | 国产顶级毛片 | 日本不卡视频一区二区三区 | 夜夜操天天操 | 久久无码专区国产精品s | 中文字幕在线观看视频一区二区 | 久久人人澡| 一级性毛片 | 亚洲国产精品久久久久久久 | 精品国产乱码久久久久久免费 | 久久人妻一区二区 | 免费在线国产精品 | 精品国产二区三区 | 欧美我不卡 | 成人3d动漫在线观看 | 天天狠天天透 | 久久成人人人人精品欧 |