Java中有3个常用的处理字符串的类:java.lang.String、java.lang.StringBuffer 和 java.lang.StringBuilder。这三个类的相同之处在于都是final类,不允许被继承。
[b][color=red]
String 字符串常量
StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)[/color][/b]
一般来说,在速度上,[color=red][b]StringBuilder>StringBuffer>String[/b][/color]
String实现了3个接口:Serializable、Comparable<String>、charSequence,而StringBuffer和StringBuilder只实现了两个接口Serializable、charSequence。String的实例了通过compareTo方法进行比较,其他两个的实例不可以。
String是字符串常量,即不可改变的对象。这时,你的脑海中可能产生这样的疑问,“不是吧,下面这段代码明明就是改变了String类型的值呀”
其实这时一种欺骗,java是这样解析这段代码的:首先创建一个str,将“abc”赋值给str,然后再创建一个新的str,将abc1赋值给新的str,原来的str会变成来及被GC回收。所以说,String类中每一个看起来会修改String值的方法,实际上都是创建了一个全新放入String对象,以包含修改后的字符串内容,而最初的String丝毫未动。因此,在字符串的值经常被修改的情况下,最好不要使用String类型,否则效率会很低。
下面说说StringBuffer和StringBuilder,这两个类基本上差不多,最主要的区别是StringBuffer是线程安全的,在多线程的情况下不用考虑同步的问题。而StringBuilder是非线程安全的。因此在多线程的情况下,需要考虑同步问题。正因为StringBuilder本身不考虑同步的问题,因此StringBuilder的速度要快于StringBuffer,所以在单线程的情况下,优先考虑StringBuilder。
[b][color=red]
String 字符串常量
StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)[/color][/b]
一般来说,在速度上,[color=red][b]StringBuilder>StringBuffer>String[/b][/color]
String实现了3个接口:Serializable、Comparable<String>、charSequence,而StringBuffer和StringBuilder只实现了两个接口Serializable、charSequence。String的实例了通过compareTo方法进行比较,其他两个的实例不可以。
String是字符串常量,即不可改变的对象。这时,你的脑海中可能产生这样的疑问,“不是吧,下面这段代码明明就是改变了String类型的值呀”
String str="abc";
str = str+1;
System.out.print(str); //输出为:abc1
其实这时一种欺骗,java是这样解析这段代码的:首先创建一个str,将“abc”赋值给str,然后再创建一个新的str,将abc1赋值给新的str,原来的str会变成来及被GC回收。所以说,String类中每一个看起来会修改String值的方法,实际上都是创建了一个全新放入String对象,以包含修改后的字符串内容,而最初的String丝毫未动。因此,在字符串的值经常被修改的情况下,最好不要使用String类型,否则效率会很低。
下面说说StringBuffer和StringBuilder,这两个类基本上差不多,最主要的区别是StringBuffer是线程安全的,在多线程的情况下不用考虑同步的问题。而StringBuilder是非线程安全的。因此在多线程的情况下,需要考虑同步问题。正因为StringBuilder本身不考虑同步的问题,因此StringBuilder的速度要快于StringBuffer,所以在单线程的情况下,优先考虑StringBuilder。