??xml version="1.0" encoding="utf-8" standalone="yes"?>wwwxxx在线观看,精品少妇一区二区三区视频免付费 ,国产一区二区影视http://www.aygfsteel.com/dodoma/category/9063.htmlzh-cnTue, 27 Feb 2007 12:30:41 GMTTue, 27 Feb 2007 12:30:41 GMT60对Stringcȝ深刻理解 http://www.aygfsteel.com/dodoma/articles/37779.htmldodomadodomaTue, 28 Mar 2006 05:19:00 GMThttp://www.aygfsteel.com/dodoma/articles/37779.htmlhttp://www.aygfsteel.com/dodoma/comments/37779.htmlhttp://www.aygfsteel.com/dodoma/articles/37779.html#Feedback0http://www.aygfsteel.com/dodoma/comments/commentRss/37779.htmlhttp://www.aygfsteel.com/dodoma/services/trackbacks/37779.html摘选自 Matrix

作者:Matrix成员Qjdbc

 

q期到CSDN论坛看看一些网友脓的面试题Q其中关于String的问题常常被提及。我一直以己很清楚q个东西了,其实qhQ发现自己ƈ不那么清楚,会犯一些错误;同时也生了一些联惟뀂小l一下?br />
1?abc"与new String("abc");
    l常会问到的面试题:String s = new String("abc");创徏了几个String Object?【如q里创徏了多对? 和一道小的面试??br />
    q个问题比较单,涉及的知识点包括Q?br />
引用变量与对象的区别Q?
字符串文?abc"是一个String对象Q?
文字池[pool of literal strings]和堆[heap]中的字符串对象?br />    一、引用变量与对象Q除了一些早期的Java书籍和现在的垃圾书籍Qh们都可以从中比较清楚地学习到两者的区别。A aa;语句声明一个类A的引用变量aa[我常常称之ؓ句柄]Q而对象一般通过new创徏。所以题目中s仅仅是一个引用变量,它不是对象。[ref 句柄、引用与对象]

    二、Java中所有的字符串文字[字符串常量]都是一个String的对象。有人[特别是CE序员]在一些场合喜Ƣ把字符?当作/看成"字符数组Q这也没有办法,因ؓ字符串与字符数组存在一些内在的联系。事实上Q它与字W数l是两种完全不同的对象?br />
        System.out.println("Hello".length());
        char[] cc={'H','i'};
        System.out.println(cc.length);

    三、字W串对象的创?׃字符串对象的大量使用[它是一个对象,一般而言对象L在heap分配内存]QJava中ؓ了节省内存空间和q行旉[如比较字W串Ӟ==比equals()快]Q在~译阶段把所有的字符串文字放C个文字池[pool of literal strings]中,而运行时文字池成为常量池的一部分。文字池的好处,是该池中所有相同的字符串常量被合ƈQ只占用一个空间。我们知道,对两个引用变量,使用==判断它们的值[引用]是否相等Q即指向同一个对象:

String s1 = "abc" ;
String s2 = "abc" ;
if( s1 == s2 )
    System.out.println("s1,s2 refer to the same object");
else     System.out.println("trouble");


    q里的输出显C,两个字符串文字保存ؓ一个对象。就是说Q上面的代码只在pool中创Z一个String对象?br />
    现在看String s = new String("abc");语句Q这?abc"本n是pool中的一个对象,而在q行时执行new String()Ӟpool中的对象复制一份放到heap中,q且把heap中的q个对象的引用交ls持有。okQ这条语句就创徏?个String对象?br />
String s1 = new String("abc") ;
String s2 = new String("abc") ;
if( s1 == s2 ){ //不会执行的语句}


    q时?=判断可知,虽然两个对象?内容"相同[equals()判断]Q但两个引用变量所持有的引用不同,

    BTWQ上面的代码创徏了几个String Object? [三个Qpool中一个,heap?个。]
    [Java2 认证考试学习指南 (W??( 英文?p197-199有图解。]


2、字W串?q算和字W串转换
    字符串{换和串接是很基础的内容,因此我以个问题简直就是送分题。事实上Q我自己q错了?br />
String str = new String("jf"); // jf是接?br />str = 1+2+str+3+4;
一共创Z多少String的对象?[我开始的{案Q?个。jf、new?jf?jf3?jf34]

    首先看JLS的有兌qͼ

    一、字W串转换的环境[JLS 5.4 String Conversion]

    字符串{换环境仅仅指使用双元?q算W的情况Q其中一个操作数是一个String对象。在q一特定情Ş下,另一操作数{换成StringQ表辑ּ的结果是q两个String的串接?br />
    二、串接运符[JLS 15.18.1 String Concatenation Operator + ]

    如果一个操作数/表达式是StringcdQ则另一个操作数在运行时转换成一个String对象Qƈ两者串接。此ӞMcd都可以{换成String。[q里Q我漏掉?3"?4"]

如果是基本数据类型,则如同首先{换成其包装类对象Q如int x视ؓ转换成Integer(x)?
现在全部统一到引用类型向String的{换了。这U{换如同[as if]调用该对象的无参数toStringҎ。[如果是null则{换成"null"]。因为toStringҎ在Object中定义,故所有的c都有该ҎQ而且Boolean, Character, Integer, Long, Float, Double, and String改写了该Ҏ?
关于+是串接还是加法,由操作数军_?+2+str+3+4 很Ҏ知道?3jf34"。[BTW :在JLS?5.18.1.3中D的一个jocular little exampleQ真的很无趣。]
    下面的例子测试了改写toStringҎ的情??br />
class A{
    int i = 10;
    public static void main(String []args){
        String str = new String("jf");
        str += new A();
        System.out.print(str);
    }

    public String toString(){
        return " a.i ="+i+"\n";
    }
}


三、字W串转换的优?br />
按照上述说法Qstr = 1+2+str+3+4;语句g应该应该生?个String对象Q?br />
1+2 Q?Qthen 3↺nteger(3)?3" in pool? [假设如此]
"3"+str(in heap) = "3jf"     (in heap)
"3jf" +3 ,first 3↺nteger(3)?3" in pool? [则不创徏] then "3jf3"
"3jf3"+4 create "4"  in pool
then "3jf34"

    q里我ƈ不清??转换成字W串后是否在池中Q所以上q结果仍然是猜测?br />
    Z减少创徏中间q渡性的字符串对象,提高反复q行串接q算时的性能Qa Java compiler可以使用StringBuffer或者类似的技术,或者把转换与串接合q成一步。例如:对于 a + b + c QJava~译器就可以它视ؓ[as if]

    new StringBuffer().append(a).append(b).append(c).toString();

    注意Q对于基本类型和引用cdQ在append(a)q程中仍然要先将参数转换Q从q个观点看,str = 1+2+str+3+4;创徏的字W串可能?3"?4"?3jf34"[以及一个StringBuffer对象]?br />
    现在我仍然不知道怎么回答str = 1+2+str+3+4;创徏了多String的对象,。或许,q个问题不需要过于研IӞ臛_SCJP不会考它?br />
3、这又不同:str = "3"+"jf"+"3"+"4";
    如果是一个完全由字符串文字组成的表达式,则在~译Ӟ已经被优化而不会在q行时创Z间字W串。测试代码如下:

String str1 ="3jf34";
        String str2 ="3"+"jf"+"3"+"4";
        if(str1 == str2) {
            System.out.println("str1 == str2");
        }else {
            System.out.println("think again");
        }
        if(str2.equals(str1))
            System.out.println("yet str2.equals(str1)");


    可见Qstr1与str2指向同一个对象,q个对象在pool中。所有遵循Java Language Spec的编译器都必d~译时对constant expressions q行化。JLS规定QStrings computed by constant expressions (ý15.28) are computed at compile time and then treated as if they were literals.

    对于String str2 ="3"+"jf"+"3"+"4";我们说仅仅创Z个对象。注意,“创建多对象”的讨论是说q行时创建多对象?br />
    BTWQ编译时优化

    String x = "aaa " + "bbb ";
    if (false) {
        x = x + "ccc ";
    }
    x +=  "ddd ";

    {h于:

    String x = "aaa bbb ";
    x = x + "ddd ";


4、不变类
    String对象是不可改变的(immutable)。有人对str = 1+2+str+3+4;语句提出疑问,怎么str的内容可以改变?其实仍然是因Z清楚Q引用变量与对象的区别。str仅仅是引用变量,它的值——它持有的引用可以改变。你不停地创建新对象Q我׃断地改变指向。[参考TIJ的Read-only classes。]

    不变cȝ关键是,对于对象的所有操作都不可能改变原来的对象[只要需要,p回一个改变了的新对象]。这׃证了对象不可改变。ؓ什么要一个类设计成不变类Q有一个OOD设计的原则:Law of Demeter。其q义解读是:

    使用不变cR只要有可能Q类应当设计Z变类?br />

dodoma 2006-03-28 13:19 发表评论
]]>
վ֩ģ壺 | | | | | | ɾ| | | | | | | | | | | | | | | γ| | | | | ij| | ͩ®| | | ͨ| | | | Ӫ| | | Į| | ƽ|