您的位置:首页 > 编程语言 > Java开发

Java之怪脾气String-1

2015-06-19 16:30 369 查看
学习Java的人因为有了String省了不少事,但也在使用的过程中遇到了很多意想不到的情况。

1 String类是字符串常量类,String对象是不可改变的。在代码中我们看起来好像改变了String对象,其实都是创建了一个新的对象。通常来说,如果String对象内容没变,返回的仍然是指向原先对象的引用;如果String对象内容发生了改变,返回的则是一个新的String对象的引用。

public class Test {
public String changeIt(String s) {
s+="d";
return s;
}
public static void main(String args[]) {
Test test=new Test();
String s1="abc";
String s2=test.changeIt(s1);
System.out.println(s1);
System.out.println(s2);
}

}
/*
output:
abc
abcd
*/


2 重载操作符”+”和StringBuilder的append方法

重载操作符”+”和append方法都可以用来连接多个字符串。其实,即便使用了重载操作符,底层调用的仍然是append方法。那么我们是否可以肆意的使用重载操作符,而来让编译器替我们完成优化呢?

public class Test {
public String linkByOperator(String[] s) {
String result="";
for(String i:s){
result+=i;
}
return result;
}
public String linkByAppend(String[] s){
StringBuilder result=new StringBuilder();
for(String i:s){
result.append(i);
}
return result.toString();
}
public static void main(String args[]) {
Test test=new Test();
String[] s={"a","b","c","d"};
String s1=test.linkByOperator(s);
String s2=test.linkByAppend(s);
System.out.println(s1);
System.out.println(s2);
}
}
/*
output:
abcd
abcd
*/


上面代码分别用重载操作符和append方法实现了字符串的连接,结果也都一样。但其实,在linkByOperator中每次循环都会创建一个StringBuilder对象,而linkByAppend中从始至终只创建了一个StringBuilder对象。由此可见,编译器不会帮我们做到最完美,使用哪种方法需要我们自己拿捏。

3 在toString方法中打印对象的内存地址

Java的每一个类都是继承于Object,每个类中都会有toString方法。我们也可以覆盖该方法,使它最终生成的结果是我们所希望的。在toString方法中,如果你想要打印对象的内存地址,可能会使用到this。

package ChapterThirteen;

public class Test {
public String toString(){
//return "test's address: "+this+"\n";
return "test's address: "+super.toString()+"\n";
}
public static void main(String args[]) {
Test test=new Test();
System.out.println(test);
}
}
/*
output:
test's address: ChapterThirteen.Test@19e0bfd
*/


通过代码测试会发现,使用this会报出异常。原因在于,toString方法中会试图将this转为String,那么就会调用this上的toString方法,就会陷入无效的递归中。所以要想打印出对象的内存地址,应该使用Object.toString。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  string java