<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    honzeland

    記錄點(diǎn)滴。。。

    常用鏈接

    統(tǒng)計(jì)

    Famous Websites

    Java

    Linux

    P2P

    最新評(píng)論

    全面解析Java中的String數(shù)據(jù)類型

    1. 首先 String 不屬于 8 種基本數(shù)據(jù)類型, String 是一個(gè)對(duì)象。
      因?yàn)閷?duì)象的默認(rèn)值是 null ,所以 String 的默認(rèn)值也是 null ;但它又是一種特殊的對(duì)象,有其它對(duì)象沒有的一些特性。
    2. new String()
    new String(“”) 都是申明一個(gè)新的空字符串,是空串不是 null
    3. String str=”kvill”
    String str=new String (“kvill”); 的區(qū)別:在這里,我們不談堆,也不談棧,只先簡(jiǎn)單引入常量池這個(gè)簡(jiǎn)單的概念。
      常量池 (constant pool) 指的是在編譯期被確定,并被保存在已編譯的 .class 文件中的一些數(shù)據(jù)。它包括了關(guān)于類、方法、接口等中的常量,也包括字符串常量。
      看例 1
    String s0=”kvill”;
    String s1=”kvill”;
    String s2=”kv” + “ill”;
    System.out.println( s0==s1 );
    System.out.println( s0==s2 );

      結(jié)果為:
    true
    true
      首先,我們要知結(jié)果為道 Java 會(huì)確保一個(gè)字符串常量只有一個(gè)拷貝
      因?yàn)槔又械?/span> s0 s1 中的 ”kvill” 都是字符串常量,它們在編譯期就被確定了,所以 s0==s1 true ;而 ”kv” ”ill” 也都是字符串常量,當(dāng)一個(gè)字符串由多個(gè)字符串常量連接而成時(shí),它自己肯定也是字符串常量,所以 s2 也同樣在編譯期就被解析為一個(gè)字符串常量,所以 s2 也是常量池中 ”kvill” 的一個(gè)引用。
      所以我們得出 s0==s1==s2; new String() 創(chuàng)建的字符串不是常量,不能在編譯期就確定,所以 new String() 創(chuàng)建的字符串不放入常量池中,它們有自己的地址空間。
      看例 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 );
      結(jié)果為:
    false
    false
    false

      例 2 s0 還是常量池中 ”kvill” 的應(yīng)用, s1 因?yàn)闊o(wú)法在編譯期確定,所以是運(yùn)行時(shí)創(chuàng)建的新對(duì)象 ”kvill” 的引用, s2 因?yàn)橛泻蟀氩糠?/span> new String(“ill”) 所以也無(wú)法在編譯期確定,所以也是一個(gè)新創(chuàng)建對(duì)象 ”kvill” 的應(yīng)用 ; 明白了這些也就知道為何得出此結(jié)果了。
    4. String.intern()

      再補(bǔ)充介紹一點(diǎn):存在于 .class 文件中的常量池,在運(yùn)行期被 JVM 裝載,并且可以擴(kuò)充。 String intern() 方法就是擴(kuò)充常量池的一個(gè)方法;當(dāng)一個(gè) String 實(shí)例 str 調(diào)用 intern() 方法時(shí), Java 查找常量池中是否有相同 Unicode 的字符串常量,如果有,則返回其的引用,如果沒有,則在常量池中增加一個(gè) Unicode 等于 str 的字符串并返回它的引用;看例 3 就清楚了
      例 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 );
      結(jié)果為:
    false
    **********
    false //
    雖然執(zhí)行了 s1.intern(), 但它的返回值沒有賦給 s1
    true //
    說明 s1.intern() 返回的是常量池中 ”kvill” 的引用
    true
      最后我再破除一個(gè)錯(cuò)誤的理解:有人說, 使用 String.intern() 方法則可以將一個(gè) String 類的保存到一個(gè)全局 String 表中,如果具有相同值的 Unicode 字符串已經(jīng)在這個(gè)表中,那么該方法返回表中已有字符串的地址,如果在表中沒有相同值的字符串,則將自己的地址注冊(cè)到表中 如果我把他說的這個(gè)全局的 String 表理解為常量池的話,他的最后一句話, 如果在表中沒有相同值的字符串,則將自己的地址注冊(cè)到表中 是錯(cuò)的:
      看例 4
    String s1=new String("kvill");
    String s2=s1.intern();
    System.out.println( s1==s1.intern() );
    System.out.println( s1+" "+s2 );
    System.out.println( s2==s1.intern() );
      結(jié)果:

    false
    kvill kvill
    true
      在這個(gè)類中我們沒有聲名一個(gè) ”kvill” 常量,所以常量池中一開始是沒有 ”kvill” 的,當(dāng)我們調(diào)用 s1.intern() 后就在常量池中新添加了一個(gè) ”kvill” 常量,原來(lái)的不在常量池中的 ”kvill” 仍然存在,也就不是 將自己的地址注冊(cè)到常量池中 了。
       s1==s1.intern() false 說明原來(lái)的 “kvill” 仍然存在; s2 現(xiàn)在為常量池中 “kvill” 的地址,所以有 s2==s1.intern() true
    5.
    關(guān)于 equals() ==
      這個(gè)對(duì)于 String 簡(jiǎn)單來(lái)說就是比較兩字符串的 Unicode 序列是否相當(dāng),如果相等返回 true; == 是比較兩字符串的地址是否相同,也就是是否是同一個(gè)字符串的引用。
    6.
    關(guān)于 String 是不可變的
      這一說又要說很多,大家只要知道 String 的實(shí)例一旦生成就不會(huì)再改變了,比如說: String str=”kv”+”ill”+” “+”ans”;
      就是有 4 個(gè)字符串常量,首先 ”kv” ”ill” 生成了 ”kvill” 存在內(nèi)存中,然后 ”kvill” 又和 ” “ 生成 ”kvill “ 存在內(nèi)存中,最后又和生成了 ”kvill ans”; 并把這個(gè)字符串的地址賦給了 str, 就是因?yàn)?/span> String 不可變 產(chǎn)生了很多臨時(shí)變量,這也就是為什么建議用 StringBuffer 的原因了,因?yàn)?/span> StringBuffer 是可改變的。

    posted on 2006-11-05 14:32 honzeland 閱讀(278) 評(píng)論(0)  編輯  收藏 所屬分類: Java

    主站蜘蛛池模板: 最近免费视频中文字幕大全| 成年大片免费高清在线看黄| 午夜无码A级毛片免费视频| 亚洲AV日韩精品一区二区三区| 亚洲欧美日本韩国| 毛片大全免费观看| 亚洲人成电影在线观看网| 日本最新免费网站| 亚洲综合偷自成人网第页色| 皇色在线视频免费网站| 国产人成亚洲第一网站在线播放| 成人免费在线观看网站| 亚洲av色香蕉一区二区三区| 国产区卡一卡二卡三乱码免费| 日韩亚洲人成在线综合| 在线观看亚洲成人| 国产猛男猛女超爽免费视频| 亚洲综合无码一区二区| 麻豆高清免费国产一区| 亚洲综合av一区二区三区| 在线免费观看国产视频| 72pao国产成视频永久免费| 亚洲国产精品无码久久SM| 美女内射毛片在线看免费人动物| 国产午夜亚洲精品国产| 亚洲黄黄黄网站在线观看| 成全视频免费观看在线看| 亚洲人成人77777网站不卡| 国产精品色午夜视频免费看| 中国极品美軳免费观看| 亚洲网址在线观看| 免费A级毛片无码A∨男男| 99久久成人国产精品免费| 亚洲情A成黄在线观看动漫软件| 四虎影永久在线高清免费| 久久免费动漫品精老司机 | 青娱乐免费视频在线观看| 色婷婷六月亚洲综合香蕉| 亚洲国产精品SSS在线观看AV| 国产精品久久久久久久久久免费| 国产成人精品免费大全|