1.不可变String
String对象时不可变的,String类中每一个看起来会修改String值的方法,实际上都是创建了一个全新的String对象,包含修改的字符串内容,最初的String对象没有变化。
public class Immutable{
public static String upcase(String s){
return s.toUpperCase();
}
public static void main(String[] args){
String q="howdy";
print(q);
String qq=upcase(q);
print(qq);
print(q);
}
}
当把q传给upcase()方法,实际传递的是引用的一个拷贝。每当把String对象作为方法的参数时,都会复制一份引用,而该引用所指的对象其实一直在单一的物理位置上,未改变。upcase()的定义,传入其中的引用有了名字s,只有upcase()运行的时候,局部引用s才存在,当upcase()运行结束s则消失。upcase()的返回值其实只是最终结果的引用。因此,upcase()返回的引用已经指向了一个新的对象,而原本的q则不变。
2.重载“+”与StringBuilder
String对象时不可变的,可以给一个String对象加任意多的别名。因为String对象具有只读特性,所以指向它的任何引用都不可能改变它的值,因此,不会对其他引用有影响。重载是指一个操作符咋应用于特定的类时,被赋予特殊的意义。
显式创建StringBuilder允许预先为其指定大小。如果已经知道最终的字符串大概多长,那么预先指定StringBuilder的大小可以避免多次重新分配缓冲。StringBuilder提供丰富的方法,包含insert(),repleace(),substring()
3.无意识的递归
Java中的每一个类从根本上继承Object,因此容器类都有toString()方法,并覆写该方法,使得他生成的String结果能够表达容器自身,以及容器所包含的对象。