[收稿日期]2012-02-01[作者简介]郑霞(1978-),女,讲师,主要从事统计自然语言处理。
Java 语言中字符串常量和变量的分析与比较郑霞,郭磊(安阳师范学院计算机与信息工程学院,河南安阳455000)[摘要]字符串是所有编程语言中都经常需要处理的问题之一。
通过对Java 语言中两类字符串,即字符串常量String 和字符串变量StringBuffer 的分析和比较,分析了它们的特点和区别,便于程序员在以后的编程中更有效地使用它们。
[关键词]String ;StringBuffer ;常量;变量[中图分类号]TP312JA [文献标识码]A [文章编号]1671-5330(2012)02-0046-030引言字符串是由零个或多个字符组成的有限序列。
一般记为s =“a 1a 2…a n ”(n >=0)。
它是编程语言中表示文本的数据类型,代表具有一定意义的信息,现实世界的大部分信息都以字符串的形式表示。
对于一种编程语言来说,字符串处理是许多需要进行的重要任务之一,如用户程序输入信息、程序向用户显示信息等。
所以几乎每一种编程语言都要有专门针对字符串的表示和操作。
Java 语言是纯粹的面向对象的语言,所以它的字符串是用对象表示的,Java 语言的字符串分为字符串常量(用String 类的对象表示)和字符串变量(用StringBuffer 类的对象表示),它们都位于java.lang 包中,他们除了能够表示字符串外,还定义了很多专门进行字符串的处理方法。
本文主要讨论定义两类字符串的特点和区别。
1字符串常量String 类1.1字符串常量的创建和创建其它的任一种对象的方式相同,创建String 对象也需要调用它的构造方法来完成,如:String s =new String (“abc ”);也可用另一种直接赋值的方式来创建String 对象,如:String s =“abc ”;虽然通过以上两种方式都可以创建String 对象,但是二者在创建对象时采用的内存分配方式是不同的。
如果是按照以下调用构造方法的形式来创建String 对象:String s1=new String (“abc ”);String s2=new String (“abc ”);s1和s2的内存分配如图1所示。
s1和s2分别占有独立的内存空间,利用“==”相比较的话,则s1==s2的结果为false 。
但是由于在程序中经常出现大量String 对象的值相同的情况,造成内存空间的冗余。
为了有效地利用内存,Java 中预留了一块特殊的内存区域,称为String 常量池。
当编译器遇到一个String 常量时,先检查常量池中是否存在值相同的String 常量,如果存在,则把该常量的引用指向常量池中的String 常量。
下面是利用直接赋值的方式创建字符串的内存分配方式,如图2所示:图1字符串常量创建举例String 对象被称为字符串常量,这表明一旦为String 对象赋值,它的值就会保持不变。
但是String 引用变量的值却可以改变。
如String s =图2字符串常量池举例“abc”;s=“abcdef”;首先定义s的初值为“abc”,然后将s赋值为“abcdef”,以上语句的内存分配如图3所示:图3字符串常量举例1.2String类的常用方法String类的常用方法有字符串的比较方法:如equals(),equalsIgno-reCase(),compareTo等。
字符串的查找方法:indexOf(),lastIndexOf 等;字符串的连接方法:concat();但是不管什么样的方法,String对象本身的内容并没有改变。
如String s=“hello”,System.out.println(s.concat(“world”));则输出hello world,然后再利用System.out.println (s)输出s的值则仍为hello。
2StringBuffer类String类提供了许多对字符串进行处理的方法,它适用于字符串内容保持不变的情况,如果程序中字符串的内容不会改变,则使用String对象表示字符串,以提高程序的执行效率。
当然也可以修改String对象的内容,但是每次对字符串内容的修改都要创建一个新的String对象,原来的String对象就会被废弃掉,因此会在String常量池中产生大量的被废弃掉的String对象,会大大影响程序的执行性能。
StringBuffer类则专门设计了对字符串内容进行修改的操作,改变后的字符串则仍然存放在原来的内存单元中,而且StringBuffer对象的容量还会随着字符串长度的增加而动态增加,与String 对象相比,如果字符串内容改变了,采用String-Buffer对象比String对象会节省大量的内存空间。
如创建StringBuffer对象:StringBuffer s=new StringBuffer(“abc”);可以通过append()方法增加StringBuffer对象的字符串内容,s.append(“de”);相应的内存分配如图4所示:图4字符串变量举例除此之外,StringBuffer类中还包含很多修改字符串内容的方法,除了append()方法外,还有如insert()、setCharAt()、deleteCharAt()等,都是在原有StringBuffer对象内容的基础上进行修改,而作为字符串常量的String类而言,没有这些直接修改内容的方法。
而对于StringBuffer对象,除了以上对字符串内容进行修改的方法外,还包括String类中的查找方法如indexOf()和lastIndexOf ()方法,截取子串的substring()方法等。
String-Buffer是一个具有对象引用传递特点的字符串对象。
StringBuffer对象可以调用其方法动态地进行增加、插入、修改和删除操作,且不用像数组那样事先指定大小,从而实现多次插入字符,一次整体取出的效果,因而操作字符串非常灵活方便。
一旦通过StringBuffer生成最终想要的字符串,就可调用它的toString方法将其转换为一个String对象。
3String和StringBuffer对象实例下面给出一个关于String和StringBuffer对象的例子。
首先分别产生一个String对象textSring 和StringBuffer对象textBuffer,初始值都为“Ja-va”,然后对textSring执行replace(‘j’,’i’)方法,对textBuffer执行append(“C”)方法,输出的结果是textString保持原来的值不变还是“Java”,而textBuffer的值变成了“JavaC”。
原因是字符串常量String对象的值永远保持不变,除非给它重新赋值,使它指向一个新的对象。
而字符串变量StringBuffer的值是可以改变的,而且是在原来内存的基础上改变的。
运行结果如图5所示。
图5实例public class StringAndStringbuffer{74第2期郑霞,郭磊:Java语言中字符串常量和变量的分析与比较static void stringReplace(String text){text=text.replace('j','i');}static void bufferReplace(StringBuffer text){text=text.append("C");}public static void main(String args[]){String textString=new String("java");StringBuffer textBuffer=new StringBuffer("ja-va");stringReplace(textString);bufferReplace(textBuffer);System.out.println("textString="+text-String);System.out.println("textBuffer="+text-Buffer);}}4结论为了提高程序执行的效率,在Java中提供了字符串常量String和字符串变量StringBuffer来表示字符串。
其中字符串常量String的值一经给定就不会再改变,如果要进行查找、比较等操作的话,最好使用String类;但是如果要频繁改变字符串的值的话,则使用StringBuffer效率较高。
[参考文献][1]赵卓君.Java程序设计———基础教程[M].北京:清华大学出版社,2010.The Analysis and Comparison of Java String Constant and VariableZHENG Xia,GUO Lei(Anyang Normal University,School of Computer and Information Engineering,Anyang56600,China)Abstract:String processing is one of important aspects in programming languages.First,this paper analyses and compares string constant and variable of Java Language,and then prefers the character and the difference between them.It’s useful for programmer to use them correctly.Key words:String;String Buffer;Constant;Variable[责任编辑:D]84安阳师范学院学报2012年。