浏览 6087 次
锁定老帖子 主题:正确使用String类应注意的几点!
精华帖 (0) :: 良好帖 (0) :: 新手帖 (9) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-07-01
java.lang.String类对大家来说最熟悉不过了,我们写java程序很少能不用String的。本文讲述如何正确的使用String,内容主要涉及初始化、串联和比较等操作。 首先我们必须清楚的一点是String类是final类型的,因此你不可以继承这个类、不能修改这个类。我们使用String的时候非常简单,通常都是String s = "hello",但是Java API中同时提供了一个构造函数为String(String s),因此你也可以这样使用String s = new String("hello"),对于后面这样初始化一个String的方式是不推荐的,因为new操作符意味着将会在heap上生成一个新的对象,如果这样的操作发生在一个循环中,那么代价是惨重的。比如 for(int i = 0;i<1000;i++) { String s = new String("hello"); }这将会创建1000个String类型的对象,由于String类是final的,因此这样的操作事实上是每次都生成了一个新的String对象的。如果你使用String s = "hello";那么就可以实现复用了,为什么可以复用呢,下面会有解释。 当我们使用"+"实现串联操作的时候,比如String s = "hello"+"world";其实是通过StringBuffer类的append()方法实现的,最后返回String给s。如果有兴趣的话,你可以写一个简?在使用串联的时候我们同样应该注意String是final类,如果你需要多次串联比如: String sql = "xxx"; sql = "xxxx"; sql = "ssssss"; 那么为了提高效率节省空间,我们应该自己用StringBuffer来替代"+"; 通常对String的比较有两种情况,一个是使用==,另一个是使用equals()方法,注意==是对对象的地址进行比较的,而String中的equals()方法是覆盖了Object类的方法,并且实现为对String对象的内容的比较。所以String s1 = new String("hello");String s2 = new String("hello"),我们对s1和s2进行上述比较的时候,前者应该返回false,因为使用new生成的是两个不同的对象。后者应该返回true因为他们的内容是一样的,都是"hello"。那么如果我们还有一个String s3 = "hello";他和s1的比较应该是什么样子的呢,答案是s1==s3为false,equals的比较位true。事实上String类是维持着一个String池的,这个池初始化为空的,当我们String x = "hello"的时候,hello就会被放入这个池中,当我们再次String y = "hello"的时候,他首先去检查池中是否存在一个和hello内容一样的对象,如果存在的话就会把这个引用返回给y,如果不存在的话,就会创建一个并放入到池中。这样就实现了复用。在String有一个方法intern()他可以把String的对象放入到池冲并返回池中的对象。如果我们对s1(String s1 = new String("hello"))调用intern,s1 = s1.intern()这时候,我们再把s1和s3进行“==”的判断,你会发现结果返回true! 看下面的例子 public class StringTest { public static void main(String[] args) { String s1 = "hello"; String s2 = new String("hello"); String s3 = new String("hello"); testString(s1,s2,s3); s2 = s2.intern(); System.out.println("after s2.intern"); testString(s1,s2,s3); } private static void testString(String s1,String s2,String s3) { System.out.println("s1 = s2 is "+(s1==s2)); System.out.println("s2 = s3 is "+(s2==s3)); System.out.println("s1.equals(s2) is "+s1.equals(s2)); System.out.println("s2.equals(s3) is "+s2.equals(s3)); } } 输出结果为 s1 = s2 is false s2 = s3 is false s1.equals(s2) is true s2.equals(s3) is true after s2.intern s1 = s2 is true s2 = s3 is false s1.equals(s2) is true s2.equals(s3) is true 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-01-14
“String s = "hello"+"world";其实是通过StringBuffer类的append()方法实现的”,错误的,这个例子是两个常量连接,这是编译期直接连接的,并不会运行时采用StringBuilder来处理。
String s = "hello"; s=s+"world"; 这种情况会。 |
|
返回顶楼 | |
发表时间:2009-01-15
对,是StringBuffer,不是StringBuilder!
|
|
返回顶楼 | |
发表时间:2009-01-15
何必呢, 除了大规模的string运算会有性能问题, 其他怎么连都不会出问题。 机器的性能是很强的。
|
|
返回顶楼 | |
发表时间:2009-01-15
howesen 写道 对,是StringBuffer,不是StringBuilder!
1.4 buffer, 1.5 builder |
|
返回顶楼 | |
发表时间:2009-01-15
String a = "123";
String b = a + "123"; 和 String a = "123"; StringBuilder s = new StringBuilder(); s.append(a); s.append("123"); String b = s.toString(); 其实是一样的把。 |
|
返回顶楼 | |
发表时间:2009-01-15
炒饭好吃么?
小“+”一下,相信不会是溢出的凶手 |
|
返回顶楼 | |
发表时间:2009-01-16
并不是+ 就比.append性能差
如果是简单的拼接个String用 + 和 append是一样的 只是有循环的时候 如果用+性能比append低 |
|
返回顶楼 | |
发表时间:2009-01-20
String s2 = new String("hello");
这里是产生2个对象 S2只是一个reference 而已 "hello" 本身自己占一个空间,new 又占一个,如果string s2="hello",这里只有一个对象,就是"hell0" |
|
返回顶楼 | |