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

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

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

    鷹翔宇空

    學習和生活

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      110 Posts :: 141 Stories :: 315 Comments :: 1 Trackbacks
    引自:http://www.mengyan.org/blog/archives/2004/08/14/87.html

    These days, when I’m reading some other guy’s code, I encounter some problem. In these code, I can read following codes:

    1. JButton?button?= new?JButton("OK");
    2. button.setActionCommand("OK");
    3. button.addActionListener(this);
    4. ......
    5. actionPerformed(e)?{
    6. ? ? String?s?= e.getActionCommand();
    7. ? ? if(s=="OK")
    8. ? ? ......
    9. }

    Look, it use “==” but not “equals” here. “Oh, it must be a bug!”, I told myself. But, wait, when I excuted the program, it worked quite well. And till this moment, I remembered, current powerful JVM will maintain a constant pool for String, so maybe two “OK” will reference the same place. So, such mechanism will work.

    But, does Java Language Specification has such standard? and all JVM will follow this standard? I continue to dig into it.

    First, I found such item in JLS 3.10.5 — String literals.

    Abstract some points here:

    Literal strings within the same class ($8) in the same package ($7) represent references to the same String object ($4.3.1).
    Literal strings within different classes in the same package represent references to the same String object.
    Literal strings within different classes in different packages likewise represent references to the same String object.
    Strings computed by constant expressions ($15.28) are computed at compile time and then treated as if they were literals.
    Strings computed at run time are newly created and therefore distinct.
    The result of explicitly interning a computed string is the same string as any pre-existing literal string with the same contents.

    So, this is the feature of String class, every JVM should follow. And, when I read the code of String.java, I found such comments in method “intern“.

    public String intern()
    Returns a canonical representation for the string object.
    A pool of strings, initially empty, is maintained privately by the class String.
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~So good:-)

    When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.
    It follows that for any two strings s and t, s.intern() == t.intern() is true if and only if s.equals(t) is true.
    All literal strings and string-valued constant expressions are interned. String literals are defined in $3.10.5 of the Java Language Specification.

    It’s quite clear about the case I encountered. Then I understand, this is not a bug, but the trick :P . But, why he use “==” but not “equals“, I think that will be more clear and more easy to read, I think there must be other guys to be puzzled as me :-) .

    I think the author must care more about the performance than the code, the performance of “==” sure if better than “equals“, especially when the String is long~.

    Ok, everything clear now, and sure, not only String has such pool. For example:

    1. Integer?i?= 1;
    2. Integer?j?= 1;

    what will System.out.println(i==l) output? I think you can get the right answer. :P

    Update (2005.11.09):

    "String"’s method "equalsIgnoreCase" also take advantage of this string pool:

    1. public?boolean?equalsIgnoreCase(String?anotherString)?{
    2. ? ? return?(this?== anotherString)?? true?:
    3. ? ? ? ? ? ?(anotherString?!= null)?&& (anotherString.count?== count)?&&
    4. ? ? regionMatches(true, 0, anotherString, 0, count);
    5. }

    If the two string point the same one, simply return true.

    So, if you need to compare Strings frequently, you should "Intern" them.

    For example, in Lucene’s source code, you need to compare the Field name very often, so, they intern the field name.

    1. this.name?= name.intern();? ? ? ? ? ? ? // field names are interned

    Popularity: 9%

    posted on 2006-09-13 17:45 TrampEagle 閱讀(827) 評論(0)  編輯  收藏 所屬分類: java
    主站蜘蛛池模板: 亚洲美女视频一区二区三区| 亚洲国产精品无码专区| 亚洲三级高清免费| 亚洲精品免费在线| 色噜噜亚洲男人的天堂| 最近中文字幕免费mv视频7| 国产精品亚洲专区在线观看| 免费看香港一级毛片| 久久久久亚洲精品无码网址色欲| 免费看美女被靠到爽| 免费视频成人国产精品网站| 亚洲伦乱亚洲h视频| 两个人看www免费视频| 亚洲AV综合色区无码一区爱AV| 免费A级毛片无码视频| 亚洲一区二区三区精品视频| 免费无码不卡视频在线观看| 免费观看四虎精品成人| 亚洲色精品vr一区二区三区 | 免费黄色小视频网站| 免费激情网站国产高清第一页| 久久久精品国产亚洲成人满18免费网站 | 五月婷婷综合免费| 亚洲AV无码AV吞精久久| 亚洲色一色噜一噜噜噜| 99在线观看免费视频| 中文字幕无码精品亚洲资源网久久| 日本免费人成黄页在线观看视频| 一级毛片免费播放试看60分钟| 久久99国产亚洲精品观看| 在线v片免费观看视频| 日韩少妇内射免费播放| 亚洲情a成黄在线观看动漫尤物| 成年女人毛片免费播放视频m| 九九九国产精品成人免费视频| 亚洲国产一区二区a毛片| 热99re久久免费视精品频软件| 久青草视频在线观看免费| 中文字幕在线观看亚洲视频| 久久精品亚洲男人的天堂| 成人免费视频77777|