都说StringBuffer效率高,那么在任何时候都是StringBuffer的效率高吗?有没有一种情况下String的效率要比StringBuffer的效率高呢?请大家畅所欲言~
解决方案 »
- 统计一个进程的线程数,java如何实现?
- Unable to load configuration. - bean - jar:file
- 直连2005起了怪的问题
- 用Tomcat调试jsp程序出现如下:“ userName cannot be resolved” 是怎么回事,请高手帮帮忙阿,急
- SSH + Oracle CLOB字段Insert时报错
- 在EJB里如何使用retry机制?
- log4j的问题:我现在的环境连用到的第三方lib的debug信息都用Log4就打出来了,如何屏蔽?
- STRUTS问题
- JSP如何解决权限的问题?
- strusts
- java动态页面转静态页面
- 局域网中两台机子相互copy文件
但如果涉及到连接字符串的时候,对于String每次连接都要重新分配内存,因此StringBuffer好些
总之,对于静态处理,如:储存字符串,用String
动态改变字符串内容则使用StringBuffer
可以使用equals方法检测两个字符串是否相等。
如果字符串s与字符串t相等,则表达式s.equals(t)返回true;
否则返回false。
需要注意,s与t可以是字符串变量,也可以使字符串常量。
一定不能使用==运算符检测两个字符串是否相等!
这个运算符只能够确定两个字符串是否被放置在同一个位置。
当然,如果字符串放在同一个位置,他们必然相等。
但是,完全有可能将内容相同的两个字符串放在不同的位置上。
如果虚拟机总是将相同的字符串共享,就可以使用==运算符检测是否相等。
但实际上只有字符串常量是共享的,而+或substring等操作产生的结果都不是共享的。
因此,永远都不要使用==运算符的测试字符串的相等性,否则在程序中会出现很糟糕的bug,从表面上看很像随机产生的间歇性错误!
From《Java2核心技术第七版卷I,基础知识,Page49》
String:字符串常量,JVM共享,但不可更改
StringBuffer:内容可变字符串,JVM不共享(大多数时候),内容可改变
类似
String s = "";
StringBuffer b = new StringBuffer();
for(int i = 0; i < len; i++) {
s += i;
b.append(i);
}这样的代码,b.append的效率远远比String相加快得多,这是因为append不需要每次都复制一次原来字符串的值。如果你的StringBuffer不需要在多线程中共享使用,应该使用StringBuilder,这个线程不安全,但是更高效
String str = "abc";
等效于:
char data[] = {'a', 'b', 'c'};
String str = new String(data);
下面给出了一些如何使用字符串的更多示例:
System.out.println("abc");
String cde = "cde";
System.out.println("abc" + cde);
String c = "abc".substring(2,3);
String d = cde.substring(1, 2);
String 类包括的方法可用于检查序列的单个字符、比较字符串、搜索字符串、提取子字符串、创建字符串副本并将所有字符全部转换为大写或小写。大小写映射基于 Character 类指定的 Unicode 标准版。 Java 语言提供对字符串串联符号("+")以及将其他对象转换为字符串的特殊支持。字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的。字符串转换是通过 toString 方法实现的,该方法由 Object 类定义,并可被 Java 中的所有类继承。有关字符串串联和转换的更多信息,请参阅 Gosling、Joy 和 Steele 合著的 The Java Language Specification。 除非另行说明,否则将 null 参数传递给此类中的构造方法或方法将抛出 NullPointerException。 String 表示一个 UTF-16 格式的字符串,其中的增补字符 由代理项对 表示(有关详细信息,请参阅 Character 类中的 Unicode 字符表示形式)。索引值是指 char 代码单元,因此增补字符在 String 中占用两个位置。 String 类提供处理 Unicode 代码点(即字符)和 Unicode 代码单元(即 char 值)的方法。
String str="";
StringBuffer sb=new StringBuffer();
long start=System.currentTimeMillis();
for (int i = 0; i < 900; i++) {
str=str+"d";
}
System.out.println(System.currentTimeMillis()-start+"String");
long start1=System.currentTimeMillis();
for (int i = 0; i < 700; i++) {
sb.append("a");
}
System.out.println(System.currentTimeMillis()-start1+"StringBuffer");
//用事实说话.