JAVA入门

来源:互联网 发布:保险公司业务数据分析 编辑:程序博客网 时间:2024/05/29 11:20

String,StringBuffer,StringBuilder都是用于字符串处理

String

看一下String类的声明

public final class String implements java.io.Serializable, Comparable<String>, CharSequence

通过声明可以看到

  • String类是final的,所以String是不可变的。对字符串的任何操作,其实都是创建一个新的字符串,而不是在原字符串基础上的操作。
  • String类实现了Serializable接口,所以String是可序列化的。
  • String类实现了Comparable接口,所以String是可排序的

String在JAVA中是非常特别的一个类,他不是基本数据类型,但在声明String变量时,我们却可以像声明一个基本数据类型一样地去声明

String str = "abc";

这是因为String使用过于频繁,JVM针对String类做了特别设计。

JVM内存大致可以分为堆及栈,栈存储一些基本数据类型的数据以及对象的引用等,而对象则都保存的堆内存中,堆内存通常可分为JAVA堆跟方法区,方法区内存一般称为永生代,即这部分内存存储的东西基本上是不会被当垃圾回收掉的,是常驻内存。(更多关于JVM内存结构的知识,可以关注[JVM系列文章]{http://blog.csdn.net/gongm24/article/category/6738880})

一般的对象是存储在JAVA堆中,String类有很多不同的构造方法,通过

String str = new String("abc")

这种方式构造的对象也跟普通对象一样是存储在JAVA堆中,但是通过

String str = "abc"

方式生成的String对象却有点不一样,它并不存储在JAVA堆中,JVM在方法区中单独开辟了一个区域叫做运行时常量池,专门用于缓存这类对象,所以用上述方法再声明一个”abc”对象时,JVM并不会再创建一个新的对象,而是使用运行时常量池已经存在的abc对象,所以下面代码的结果就很容易解释了。

String s1 = "abc";  String s2 = "abc";  String s3 = "a"+"bc";  String s4 = new String("abc");  s1==s2;  //true  s2==s3;  //true  s1==s4;  //false

但是想像一种情况,程序中要做大量的字符串拼接的工作,使用String类的话就会每拼接一次生成一个新对象,这样就会不断生成对象,而这些对象的存活周期可能都是只使用一次,这样的程序在性能上必然不高,而解决方案也很容易想到:给String一个缓冲。

StringBuffer跟StringBuilder

StringBuffer跟StringBuilder两个类都是为了解决上述情况。他们俩都继承自AbstractStringBuilder类,AbstractStringBuilder类跟String类的实现非常像,都是通过一个char[]来存储字符串,但AbstractStringBuilder类没有在char[]前加上final修饰符,AbstractStringBuilder提供了大量的方法,其中很多方法跟String类都一样,实现方式也一样。AbstractStringBuilder另外提供的最重要的方法就是append跟insert方法。

而StringBuffer跟StringBuilder作为AbstractStringBuilder的实现类,也有两者不一样的地方:
StringBuffer类中几乎所有的方法都带有synchronized修饰符,用于保证线程安全。而StringBuilder则没有,所以在不需要考虑线程安全的地方使用StringBuilder将拥有更高性能。

0 0
原创粉丝点击