[size=small]在JAVA中,我是最不喜欢对字符串进行操作的,说真的,觉的很是麻烦哦.呵呵,每当要操作时,我都是在网上搜索的.这次把自己常看到的东西写到自己的博客上来,以后好查看
String和StringBuffer的区别,网上资料可以说是数不胜数,但是看到这篇文章,感觉里面做的小例子很有代表性,所以转一下,并自己做了一点总结。
在java中有3个类来负责字符的操作。
1.Character 是进行单个字符操作的,
2.String 对一串字符进行操作。不可变类。
3.StringBuffer 也是对一串字符进行操作,但是可变类。
String:
是对象不是原始类型.
为不可变对象,一旦被创建,就不能修改它的值.
对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.
String 是final类,即不能被继承.
StringBuffer:
是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象
它只能通过构造函数来建立,
StringBuffer sb = new StringBuffer();
note:不能通过付值符号对他进行付值.
sb = "welcome to here!";//error
对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer
中付值的时候可以通过它的append方法.
sb.append("hello");
字符串连接操作中StringBuffer的效率要比String高:
String str = new String("welcome to ");
str += "here";
的处理步骤实际上是通过建立一个StringBuffer,让侯调用append(),最后
再将StringBuffer toSting();
这样的话String的连接操作就比StringBuffer多出了一些附加操作,当然效率上要打折扣.
并且由于String 对象是不可变对象,每次操作Sting 都会重新建立新的对象来保存新的值.
这样原来的对象就没用了,就要被垃圾回收.这也是要影响性能的.
看看以下代码:
将26个英文字母重复加了5000次,
String tempstr = "abcdefghijklmnopqrstuvwxyz";
int times = 5000;
long lstart1 = System.currentTimeMillis();
String str = "";
for (int i = 0; i < times; i++) {
str += tempstr;
}
long lend1 = System.currentTimeMillis();
long time = (lend1 - lstart1);
System.out.println(time);
可惜我的计算机不是超级计算机,得到的结果每次不一定一样一般为 46687左右。
也就是46秒。
我们再看看以下代码
String tempstr = "abcdefghijklmnopqrstuvwxyz";
int times = 5000;
long lstart2 = System.currentTimeMillis();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < times; i++) {
sb.append(tempstr);
}
long lend2 = System.currentTimeMillis();
long time2 = (lend2 - lstart2);
System.out.println(time2);
得到的结果为 16 有时还是 0
所以结论很明显,StringBuffer 的速度几乎是String 上万倍。当然这个数据不是很准确。因为循环的次数在100000次的时候,差异更大。不信你试试。
根据上面所说:
str += "here";
的处理步骤实际上是通过建立一个StringBuffer,让侯调用append(),最后
再将StringBuffer toSting();
所以str += "here";可以等同于
StringBuffer sb = new StringBuffer(str);
sb.append("here");
str = sb.toString();
所以上面直接利用"+"来连接String的代码可以基本等同于以下代码
String tempstr = "abcdefghijklmnopqrstuvwxyz";
int times = 5000;
long lstart2 = System.currentTimeMillis();
String str = "";
for (int i = 0; i < times; i++) {
StringBuffer sb = new StringBuffer(str);
sb.append(tempstr);
str = sb.toString();
}
long lend2 = System.currentTimeMillis();
long time2 = (lend2 - lstart2);
System.out.println(time2);
平均执行时间为46922左右,也就是46秒。
案例二
public class Test {
public static void stringReplace (String text) {
text = text.replace('j' , 'i');
}
public static void bufferReplace (StringBuffer text) {
text = text.append("C");
}
public static void main (String args[]) {
String textString = new String ("java");
StringBuffer textBuffer = new StringBuffer ("java");
stringReplace (textString);
bufferReplace (textBuffer);
System.out.println (textString + textBuffer);
}
}
答案是 javajavaC
这是Java参数传递(by value)造成的
而题目中第七行text = text.append (“C”),append方法会改变text中的值
而这个text与main中的textBuffer是指向同一个对象,所以对应的输出是javac。
string的值永远不会改变!
String a = "a";//假设a指向地址0x0001,
a = "b";//重新负值后a指向地址0x0002,但0x0001地址中保存的"a"依旧存在,但已经不再是a所指向的。
从表面上看String类型的对象改变了值,但事实是他不能改变值,只能改变指向的地址
StringBuffer则不同,直接改变指向的地址中保留的值
还有
StringBuffer s1 = new StringBuffer("a");
StringBuffer s2 = new StringBuffer("a");
s1.equals(s2)//为什么是false
String s1 = new String("a");
String s2 = new String("a");
s1.equals(s2)//为什么是true
StringBuffer类中没有重新定义equals这个方法,因此这个方法就来自Object类,
而Object类中的equals方法是用来比较地址的,所以等于false.
String类中重新定义了equals这个方法,而且比较的是值,而不是地址。所以会是
true。
本篇文章来源于 :刘志猛博客 原文链接:http://www.liuzm.com/article/java/91010b.htm[/size]
分享到:
相关推荐
在Java中,String对象一旦创建便不可更改,每次对字符串进行修改时实际上都是创建了一个新的字符串对象,因此,在需要频繁修改字符串的场合,使用StringBuffer类的性能要优于String类。StringBuffer内部维护了一个...
在Java编程语言中,`String`、`StringBuffer`和`StringBuilder`是处理字符串的三个核心类。它们各自有其特点和应用场景,尤其在多线程环境和性能方面存在显著差异。下面将详细介绍这三个类的方法及其实现,并提供...
- **Java String源码**:Java中的String类是不可变的,理解其内部实现,如字符串池、StringBuilder和StringBuffer的区别,以及如何高效地操作字符串,是Java程序员的基本功。 - **面试设计模式**:在面试中,设计...
### MyBatis 3.2.7 与 EHCache 2.6.8 在 Oracle 数据库中的集成及测试用例 #### 一、基础知识简介 **MyBatis** 是一个支持普通 SQL 查询、存储过程以及高级映射的优秀持久层框架。它消除了几乎所有的 JDBC 代码和...
通过以上代码,我们可以在Java中实现String字符串与Unicode字符的相互转换。这在处理特殊字符或者需要编码传输时非常有用。理解这些基本的转换方法有助于我们在实际开发中更好地处理字符编码问题。
最后,"Java经验技巧"部分可能会分享一些实际开发中的实用技巧和最佳实践,比如代码风格规范、调试技巧、问题排查方法等,这些都是提升开发效率和代码质量的关键。 通过这个资源包,初学者可以系统地学习和实践Java...
6. `StringBuffer`类:在`StringZip()`函数中,使用了`StringBuffer`而不是`String`进行拼接,因为`StringBuffer`是线程安全的,并且在大量拼接操作时效率更高,避免了每次拼接时创建新字符串的开销。 7. 数学运算...
Java中String、StringBuilder和StringBuffer的区别在于它们的可变性以及线程安全性。String对象是不可变的,因此每次对String的操作都可能导致新的String对象的创建。StringBuilder和StringBuffer都提供了可变的字符...
本规范覆盖了Java开发过程中多个方面的要求,包括但不限于代码组织与风格、注释规范、命名规则、声明规则、类与接口的设计、方法实现、表达式与语句的使用、错误与异常处理机制、测试与BUG跟踪流程以及性能优化与...
Java的String类和StringBuilder或StringBuffer类在这里发挥关键作用。开发者需要掌握这些类的方法来实现文本编辑功能。 5. **事件监听** 记事本的大部分功能,如菜单点击、按钮按下,都需要响应用户的操作。Java ...
该文档详细介绍了Java开发过程中的各项规范要求,包括代码组成与风格、注释、命名规则、声明、语句编写方式、单元测试、性能与安全以及编程习惯等方面。 #### 二、代码组成与风格 **2.1 文件组织** - **文件注释*...
《阿里巴巴Java开发规范》是Java开发者的一份重要指南,它为编写高质量的Java代码提供了全面的规则和建议。这份规范源自阿里巴巴集团内部的实践经验,经过不断优化和完善,已经成为业界广泛认可的标准之一。以下是对...
在Java编程过程中,掌握一些关键的注意事项至关重要,这不仅能提高代码质量,还能避免常见的编程陷阱。以下是一些关于"JAVA注意事项"的详细说明: 1. **命名规范**:Java有严格的命名规则,类名应使用驼峰式命名,...
1. Java中的String、StringBuilder和StringBuffer的区别:不可变性、可变性、线程安全性。 2. 字符串拼接的性能影响:内存分配、对象创建、线程安全。 3. 性能测试的方法:基准测试、运行时间测量。 4. 实际应用中的...
在压缩包的子文件中,可能包含了不同版本或测试用例的"Abc.java"文件,如"复件 (3) Abc.java"、"复件 Abc.java"和"复件 (2) Abc.java"。这些文件可能包含不同的实现方式,或者用于测试各种输入情况,确保程序的正确...
Java因其跨平台性、高效性和安全性而在企业级应用开发中占据主导地位。 课件内容可能涵盖以下关键知识点: 1. **Java概述**:解释Java的历史、特点和应用领域,如Web开发、移动应用(Android)、桌面应用和大型...
2. 使用StringBuilder替换String拼接:在循环中进行字符串拼接时,使用StringBuilder或StringBuffer可以显著提高性能。 3. 避免过度优化:优先考虑代码的可读性和可维护性,只有在必要时才进行性能优化。 四、并发...
4. **文本处理**:在编辑器中,开发者可能使用了String、StringBuilder或StringBuffer类来处理文本,以及Pattern和Matcher类进行正则表达式匹配。 5. **异常处理**:为了确保程序的健壮性,Java程序员通常会使用try...
- 列出了提高开发效率的常用快捷键。 ##### 2.8 总结 - 回顾了Eclipse IDE的使用技巧。 #### 第三章:JAVA语言基础 ##### 3.1 简介 - 引入了Java语言的基础知识。 ##### 3.2 数据类型 - **3.2.1 标识符** - ...
以下是对Java编程的30条实用建议,旨在帮助提升代码质量,提高开发效率。 1. **遵循编码规范**:使用统一的命名规则,如驼峰命名法,保持代码整洁。 2. **注释清晰**:为关键代码段添加注释,解释功能和逻辑,方便...