1、重载"+"
重载操作符:操作符在用于特定的类的时候,被赋予特殊的意思。String的+,+=是java中仅有的重载操作符,java不允许程序员重载操作符。
2、String,StringBuffer,StringBuilder
String是定长的,是不可变对象,每次对String对象进行改变长度的操作实际都是生成了新的对象。对StringBuilder与StringBuffer对象的操作都是针对其自身,在字符串对象会经常改变的情况下使用这两个比较好。StringBuffer是线程安全的,而StringBuilder是非线程安全的,所以StringBuilder要快一些。StringBuilder是javaSE5引入的。
●以下代码对于String的实际操作是生成了新的对象。
●对于“+”,se5以前是对于String创建三个对象,se5以后jvm进行了优化,编译器调用了StringBuilder。
代码段:
public static void main(String[] args){
String mango="mango";
String s="abc"+mango+""def"+47;
}
如果是为一个类编写toString(),字符串操作比较简单就可以依赖编译器。如果在toString()方法中使用了循环,那么最好自己创建StringBuilder对象来构造最终的结果。
●packagestringBuilderTest;
importjava.util.Random;
/**
* Created by wanchuang on 2015/11/28.
*/
public classStringBuilderTest {
public staticRandomrandom=newRandom(47);
@Override
publicString toString()
{
StringBuilder result=newStringBuilder("[");
for(inti=0;i<25;i++ ){
result.append(random.nextInt(100));
result.append(", ");
}
result.delete(result.length() -2, result.length());
result.append("]");
returnresult.toString();
}
public static voidmain(String[] args) {
StringBuilderTest stringBuilderTest=newStringBuilderTest();
System.out.println(stringBuilderTest);
}
}
//结果:[58, 55, 93, 61, 61, 29, 68, 0, 22, 7, 88, 28, 51, 89, 9, 78, 98, 61, 20, 58, 16, 40, 11, 22, 4]
容器类都有覆写toString()方法,例如ArrayList().toString()方法遍历ArrayList所有对象,调用每个元素的toString()方法。
3、格式化输出
格式修饰符:
printf("Row 1: [%d %f]\n",x,y);
不仅仅说明了插入数据的位置,还说明了变量类型。%d表示x是一个整数,%f表示y是浮点数。
javaSE5引入的format方法实际等价于printf方法。format方法作用于PrintStream,PrintWrite方法。
java中所有格式化的功能由java.util.Formatter类处理,Formatter一个翻译器,把格式化字符串和数据翻译。创建Formatter对象的时候,向构造器传递一些信息,告诉最终结果输出到哪里。
●public classStringFormat294 {
public static voidmain(String[] args) {
String s="wan";
inta=1,b=2;
System.out.println(String.format("(t%d,q%d) %s",a,b,s));
}
}//(t1,q2) wan
packagethinkingInJava13String;
importjava.io.PrintStream;
importjava.util.Formatter;
/**
* Created by wanchuang on 2015/11/28.
*/
public classFormatter290 {
privateStringname;
privateFormatterformatter;
publicFormatter290(String name,Formatter formatter){
this.name=name;
this.formatter=formatter;
}
public voidmove(intx,inty){
formatter.format("%s The location is at (%d,%d)\n",name,x,y);
}
public static voidmain(String[] args) {
PrintStream outAlias=System.out;
Formatter290 f1=newFormatter290("f1",newFormatter(System.out));
Formatter290 f2=newFormatter290("f2",newFormatter(outAlias));
f1.move(0,0);
f2.move(4,8);
}
}
//输出:f1 The location is at (0,0) f2 The location is at (4,8)