javalangString类对大家来说最熟悉不过了我们写java程序很少能不用String的本文讲述如何正确的使用String内容主要涉及初始化串联和比较等操作 首先我们必须清楚的一点是String类是final类型的因此你不可以继承这个类不能修改这个类我们使用String的时候非常简单通常都是String s = hello但是Java API中同时提供了一个构造函数为String(String s)因此你也可以这样使用String s = new String(hello)对于后面这样初始化一个String的方式是不推荐的因为new操作符意味着将会在heap上生成一个新的对象如果这样的操作发生在一个循环中那么代价是惨重的比如 Java代码 for(int i = ;i<;i++) { String s = new String(hello); } 这将会创建个String类型的对象由于String类是final的因此这样的操作事实上是每次都生成了一个新的String对象的如果你使用String s = hello;那么就可以实现复用了为什么可以复用呢下面会有解释 当我们使用+实现串联操作的时候比如String s = hello+world;其实是通过StringBuffer类的append()方法实现的最后返回String给s如果有兴趣的话你可以写一个简?在使用串联的时候我们同样应该注意String是final类如果你需要多次串联比如 Java代码 String sql = xxx; sql = xxxx; sql = ssssss; 那么为了提高效率节省空间我们应该自己用StringBuffer来替代+; 通常对String的比较有两种情况一个是使用==另一个是使用equals()方法注意==是对对象的地址进行比较的而String中的equals()方法是覆盖了Object类的方法并且实现为对String对象的内容的比较所以String s = new String(hello);String s = new String(hello)我们对s和s进行上述比较的时候前者应该返回false因为使用new生成的是两个不同的对象后者应该返回true因为他们的内容是一样的都是hello那么如果我们还有一个String s = hello;他和s的比较应该是什么样子的呢答案是s==s为falseequals的比较位true事实上String类是维持着一个String池的这个池初始化为空的当我们String x = hello的时候hello就会被放入这个池中当我们再次String y = hello的时候他首先去检查池中是否存在一个和hello内容一样的对象如果存在的话就会把这个引用返回给y如果不存在的话就会创建一个并放入到池中这样就实现了复用在String有一个方法intern()他可以把String的对象放入到池沖并返回池中的对象如果我们对s(String s = new String(hello))调用interns = sintern()这时候我们再把s和s进行==的判断你会发现结果返回true! 看下面的例子 Java代码 public class StringTest { public static void main(String[] args) { String s = hello; String s = new String(hello); String s = new String(hello); testString(sss); s = sintern(); Systemoutprintln(after sintern); testString(sss); } private static void testString(String sString sString s) { Systemoutprintln(s = s is +(s==s)); Systemoutprintln(s = s is +(s==s)); Systemoutprintln(sequals(s) is +sequals(s)); Systemoutprintln(sequals(s) is +sequals(s)); } } 输出结果为 s = s is false s = s is false sequals(s) is true sequals(s) is true after sintern s = s is true s = s is false sequals(s) is true sequals(s) is true |