从”JAVA“而终 9:javaAPI(一)字符串

通过前面的成列我们了解了java的一些基本特性以及判断处理数据的方式,现在开始javaAPI的学习,一起去看看java语言有哪些工具和方法可以供我们使用以及如何使用。

首先我们先看String类,下面是它的API首页位置,我们可以向下拉查看它有哪些方法、构造器和属性以及如何使用和获得怎样的返回值:

如果没有文档,可以再这里查看或者下载:http://tool.oschina.net/apidocs/apidoc?api=jdk-zh(不用谢我,嘿嘿);

另外,只要我们以后看见string类,就要想到它的兄弟类:StringBuffer类;同样我们也可以根据API来查看它具有哪些方法和构造方法以及如何使用。下面讲解下java中对字符串操作的三大类:

在Java中有3个类来负责字符的操作。
1.Character 是进行单个字符操作的,
2.String 对一串字符进行操作。不可变。
3.StringBuffer 也是对一串字符进行操作,但是可变类。
String:
是对象不是原始类型。
为不可变对象,一旦被创建,就不能修改它的值。
对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去。
String 是final 类,即不能被继承。


StringBuffer:
是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象它只能通过构造
函数来建立,
StringBuffer sb = new StringBuffer();
note:不能通过赋值符号对他进行赋值。
sb = "welcome to hrer!"; //error
对象被建立以后,在内存中就会分配内存空间,并初始保存一个null,向StringBuffer中赋值的时候
可以通过它的append方法。
sb.append("hello");


字符串连接操作中StringBuffer的效率要比String高;


String str = new String("welcome to");
str += "here";
的处理步骤实际上是通过建立一个StringBuffer,然后调用append(),最后再将
StringBuffer toStrig();



这样的话String的连接操作就比StringBuffer多出了一些附加操作,当然效率上要打折扣。
并且由于String对象是不可变对象,每次操作String 都会重新建立新的对象来保存新的值。


看看以下代码:
将26个英文字母重复加了5000次,
1. String tempstr ="abcdefghijklmnopqrstuvwxyz";
2. int times = 5000;
3. long startTime = System.currentTimeMillis();
4. String str = "";
5. for(int i=0;i<times;i++){
6. str += tempstr;
7. }
8. long lendTime = System.currentTimeMillis();
9. long time = (lendTime - startTime);
10. System.out.println(time);

得到的结果每次不一定一样一般为46687左右。也就是46秒。
我们再看看以下代码
1. String tempstr ="abcdefghijklmnopqrstuvwxyz";
2. int times = 5000;
3. long startTime = System.currentTimeMillis();
4. StringBuffer sb = new StringBuffer();
5. for(int i=0;i<times;i++){
6. sb.append(tempstr);
7. }
8. long lendTime = System.currentTimeMillis();
9. long time = (lendTime - startTime);
10. System.out.println(time);


得到的结果为16 有时还为0 。所以结论很明显,StringBuffer的速度比String要快的多。
总结: 如果在程序中需要对字符串进行频繁的修改连接操作的话.使用StringBuffer性能会更高


String的值永远不会改变!
String a ="a"; //假设a指向地址0x0001,
a = "b"; //重新赋值后a指向地址0x0002,但0x0001地址中保存的“a”依旧存在,但已经不再是a所指向的。
从表面上看String类型的对象改变了值,但事实是他不能改变值,只能改变指向的地址。


StringBuffer则不同,直接改变指向的地址中保留的值。


还有:
StringBuffer sb1 = new StringBuffer("a");
StringBuffer sb2 = new StringBuffer("a");
sb1.equals(sb2) //为什么是false


String str1 = new String("a");
String str2 = new String("a");
str1.equals(str2) //为什么是true
StringBuffer类中没有重新定义equals这个方法,因此这个方法就来自Object类,而Object类中的equals
方法是用来比较地址的,所以等于false

String类中重新定义了equals这个方法,而且比较的是值,而不是地址。所以会是true。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值