<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
    主站蜘蛛池模板: 国产大片线上免费看| 亚洲国产美女精品久久久久∴ | 巨胸狂喷奶水视频www网站免费| 日韩免费视频一区二区| 在线免费观看污网站| 久久亚洲AV午夜福利精品一区 | 亚洲神级电影国语版| h视频在线观看免费| 最近2019中文免费字幕| 亚洲资源在线观看| 三级片免费观看久久| 四虎影视www四虎免费| 亚洲AV色欲色欲WWW| 日韩欧毛片免费视频| 亚洲国产日韩一区高清在线| 亚欧洲精品在线视频免费观看| 国产亚洲视频在线播放| 国产天堂亚洲国产碰碰| 成人免费毛片内射美女-百度| 亚洲福利在线视频| 免费在线观看视频网站| 久久亚洲私人国产精品| 国产在线a免费观看| 久久精品国产亚洲AV电影网| 中文字幕无码不卡免费视频| 亚洲av永久无码精品网址| 亚洲熟女乱综合一区二区| 美女扒开屁股让男人桶爽免费 | 麻豆国产精品入口免费观看| 亚洲午夜久久久久久尤物| 69免费视频大片| 亚洲精品人成在线观看| 免费无码又黄又爽又刺激| 亚洲自国产拍揄拍| AV无码免费永久在线观看| 亚洲精品一区二区三区四区乱码 | 亚洲欧美精品午睡沙发| 成年大片免费视频| 久久久久久av无码免费看大片| 亚洲人成无码网站久久99热国产| 人人玩人人添人人澡免费|