Java之怪脾气String-1
2015-06-19 16:30
369 查看
学习Java的人因为有了String省了不少事,但也在使用的过程中遇到了很多意想不到的情况。
1 String类是字符串常量类,String对象是不可改变的。在代码中我们看起来好像改变了String对象,其实都是创建了一个新的对象。通常来说,如果String对象内容没变,返回的仍然是指向原先对象的引用;如果String对象内容发生了改变,返回的则是一个新的String对象的引用。
2 重载操作符”+”和StringBuilder的append方法
重载操作符”+”和append方法都可以用来连接多个字符串。其实,即便使用了重载操作符,底层调用的仍然是append方法。那么我们是否可以肆意的使用重载操作符,而来让编译器替我们完成优化呢?
上面代码分别用重载操作符和append方法实现了字符串的连接,结果也都一样。但其实,在linkByOperator中每次循环都会创建一个StringBuilder对象,而linkByAppend中从始至终只创建了一个StringBuilder对象。由此可见,编译器不会帮我们做到最完美,使用哪种方法需要我们自己拿捏。
3 在toString方法中打印对象的内存地址
Java的每一个类都是继承于Object,每个类中都会有toString方法。我们也可以覆盖该方法,使它最终生成的结果是我们所希望的。在toString方法中,如果你想要打印对象的内存地址,可能会使用到this。
通过代码测试会发现,使用this会报出异常。原因在于,toString方法中会试图将this转为String,那么就会调用this上的toString方法,就会陷入无效的递归中。所以要想打印出对象的内存地址,应该使用Object.toString。
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。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android之获取手机上的图片和视频缩略图thumbnails
- android string.xml文件中的整型和string型代替
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序