<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
    主站蜘蛛池模板: 亚洲男同gay片| 国产中文字幕免费| 久久国产乱子伦精品免费午夜| 曰批全过程免费视频免费看| 亚洲综合综合在线| 国产精品成人免费一区二区 | 成年人免费观看视频网站| 小日子的在线观看免费| 久久精品国产亚洲AV久| 久久精品亚洲视频| 国产成人亚洲精品影院| 免费不卡中文字幕在线| 久久免费线看线看| 亚洲综合色婷婷在线观看| 无码欧精品亚洲日韩一区夜夜嗨 | 无码人妻久久一区二区三区免费 | 中文亚洲成a人片在线观看| 无码国模国产在线观看免费| 日本妇人成熟免费中文字幕| 午夜理伦剧场免费| 久久免费视频观看| 嫩草影院在线播放www免费观看| 日本激情猛烈在线看免费观看| 亚洲国产成人手机在线观看| 国产精品亚洲综合久久| 国产亚洲大尺度无码无码专线| 最好看的中文字幕2019免费| 日本亚洲中午字幕乱码| 亚洲精品GV天堂无码男同| 亚洲va久久久久| 中文有码亚洲制服av片| 亚洲AV综合色区无码二区爱AV| 亚洲午夜久久久精品影院| 久久91亚洲人成电影网站| 午夜私人影院免费体验区| 国产视频精品免费视频| 精品多毛少妇人妻AV免费久久| 一级毛片在线免费播放| 亚洲乱码在线观看| 亚洲欧美中文日韩视频| 亚洲AV色欲色欲WWW|