Java提供了三种字符串对象,分别为String,StringBulider,StringBufferjava
String在操做时不修改原对象,而是会生成一个新的String对象来做为返回结果。 //适用于较少修改字符串的状况。安全
StringBulider是为了解决对String频繁修改的效率底下问题产生的,对StringBulider的操做会修改原对象。 // 适用于单线程频繁修改字符串的状况。多线程
StringBuffer效果与StringBuilder相似,但它加入了线程安全。 //适用于多线程频繁修改字符串的状况。app
public class Test{ public static void main(String[] args){ String s1 = "hello",s3; StringBuilder s2 = new StringBuilder("hello"); StringBuilder s4; s3 = s1.toUpperCase(); s4 = s2.append("world"); System.out.printf("String:" + s1 + "\n" + "StringBuilder:" + s2); //String:hello s1无变化 //StringBuilder:helloworld s2发生变化 } }
对于效率问题须要注意,即使有时候编译器会进行优化(隐式地建立StringBulider来防止频繁建立String对象),在部分状况下它仍比不上彻底使用StringBuilder。显式地建立StringBuilder并给定最大长度能极大地提高对字符串频繁操做的效率。ide
集合类都继承自Object,故都有toString()方法并覆盖了它,以便容器能表达自身。但愿toString()方法打印对象内存地址优化
import java.util.*; public class Test{ public String toString(){ return "TestAddress:" + super.toString() + "\n"; //return "TestAddress:" + this + "\n"; } public static void main(String[] args){ List<Test> t = new ArrayList<>(); for (int i = 0;i < 5;i++){ t.add(new Test()); } System.out.println(t); } }
编译器看见TestAddress后,发现一个+号,会试着将后面对象转换为String类型,即调用对象的toString方法。若是写成注释样子,则会发生toString方法的递归调用,从而致使栈溢出。ui
String基本方法this
Java提供了printf(),该方法相似于c语言的输出格式,能够进行格式化输出;又提供了一样效果的format(),但它可用于PrintWriter和PrintStream。spa
public class Test{ public static void main(String[] args){ int x = 10; double y = 10.333; System.out.println("[" + x + " "+ y + "]"); System.out.printf("[%d %.3f]\n", x, y); System.out.format("[%d %.3f]", x, y); //结果 //[10 10.333] //[10 10.333] //[10 10.333] } }
Java中,全部新格式化功能都由java.util.Formatter处理,能够将它看做一个翻译器,将格式化字符串与数据翻译成想要的结果,建立Formatter对象时,还须要向其构造器传入参数,以便告诉它须要向哪里输出结果。线程
import java.util.Formatter; public class Test{ public static void main(String[] args){ int x = 10; double y = 10.333; Formatter f = new Formatter(System.out); f.format("[%d %.3f]\n", x, y); Formatter g = new Formatter(System.err); g.format("[%d %.3f]\n", x, y); //输出到标准流 //输出到错误流 } }
更精细的格式话说明符须要能够达到更加美观的输出效果,抽象语法为:
%[argument_index$][flags][width][.precision]conversion
argument_index就是格式化字符串;flags表示左对齐或右对齐,有-符号即左对齐,默认为右对齐;width为一个域的最小宽度;.precision用于字符串表示字符串输出的最大长度,用于小数则表示要保留的小数位数。
import java.util.Formatter; public class Test{ public static void main(String[] args){ Formatter f = new Formatter(System.out); f.format("%-8s %-8s %-8s %-10s\n","name","id","salary","address"); f.format("%-8s %-8.8s %-8.3f %-10.12s\n","sakura","2015100320",8000.64651,"wuhan of Chinese"); //f.format("%-8s %-8.8d %-8.3f %-10.12s\n","sakura",2015100320,8000.64651,"wuhan of Chinese");
//结果以下 //name id salary address //sakura 20151003 8000.647 wuhan of Chi //注:第三条语句将.precision用于整数,抛出异常 } }
Formatter经常使用类型转换