- Java程序设计基础(第6版)
- 陈国君主编
- 1659字
- 2021-03-28 02:51:03
5.5 字符串
字符串就是一系列字符的序列。在Java语言中字符串是用一对双引号("")括起来的字符序列,在前几章的例子中已多次用到,如“你好”、"Hello"等。字符串也是编程中经常要使用的数据结构,从某种程度上说字符串有些类似于字符数组。在Java语言中无论是字符串常量还是字符串变量,都是用类来实现的。程序中用到的字符串可以分为两大类:一类是创建之后不会再做修改和变动的字符串变量;另一类是创建之后允许再做修改的字符串变量。对于前一种字符串变量,由于程序中经常需要对它做比较、搜索之类的操作,所以通常把它放在一个具有一定名称的对象之中,由程序完成对该对象的上述操作,在Java程序中存放这种字符串的变量是String类对象;对于后一种字符串变量,由于程序中经常需要对它做添加、插入、修改之类的操作,所以这种字符串变量一般都存放在StringBuilder类的对象之中。本书只讨论String类型的串变量。
5.5.1 字符串变量的创建
首先再强调一下字符串常量与字符常量的不同,字符常量是用单引号(')括起来的单个字符,而字符串常量是用双引号(")括起来的字符序列。
声明字符串变量的格式与其他变量一样,分为对象的声明与对象创建两步,这两步可以分成两个独立的语句,也可以在一个语句中完成。
格式一:
String变量名; 变量名=new String("字符串");
如:
String s; //声明字符串型引用变量s,此时s的值为null s=new String("Hello"); //在堆内存中分配空间,并将s指向该字符串首地址
第一个语句只声明了字符串引用变量s,此时s的值为null;第二个语句则在堆内存中分配了内存空间,并将s指向了字符串的首地址。
上述的两个语句也可以合并成一个语句。其格式如下。
格式二:
String变量名=new String(“字符串”);
如:
String s=new String("Hello");
还有一种非常特殊而常用的创建String对象的方法,这种方法就是直接利用双引号括起来的字符串为新建的String对象赋值,即在声明字符串变量时直接初始化。
格式三:
String变量名="字符串";
如:
String s="Hello";
由于字符串是引用型变量,所以其存储方式与数组的存储方式基本相同。
程序中可以用赋值运算符为字符串变量赋值,除此之外,Java语言定义“+”运算符可用于两个字符串的连接操作(关于字符串的运算符在3.7.7中已讲述过)。例如:
str="Hello"+"Java"; //str的值为"HelloJava"
如果字符串与其他类型的变量进行“+”运算,系统自动将其他类型的数据转换为字符串型。例如:
int i=10; String s="i="+i; //s的值为"i=10"
前面说过,利用String类创建的字符串变量,一旦被初始化或赋值,它的值和所分配的内存内容就不可再改变。如果硬要改变它的值,它会产生一个新的字符串。例如:
String str1="Java"; str1=str1+"Good";
这看起来像是一个简单的字符串重新赋值,实际上在程序的解释过程中却不是这样的。程序首先产生str1的一个字符串对象并在内存中申请了一段空间,由于发现又需要重新赋值,在原来的空间已经不可能再追加新的内容,系统不得不将这个对象放弃,再重新生成第二个新的对象str1并重新申请一个新的内存空间。虽然str1指向的内存地址(句柄)是同一个,但对象已经不再是同一个了。
5.5.2 String类的常用方法
Java语言为String类定义了许多方法。可以通过下述格式调用Java语言定义的方法:
字符串变量名.方法名();
表5.2列出了String类的常用方法。
表5.2 String类的常用方法

【例5.6】 判断回文字符串。
回文是一种“从前往后读”和“从后往前读”都相同的字符串,例如,"rotor"就是一个回文字符串。在本例中使用两种算法来判断回文字符串。
程序中比较两个字符时,使用关系运算符“==”,而比较两个字符串时,需使用equals()方法。程序代码如下:

该程序运行时可以带命令行参数。若在命令行方式下输入java App5_6 hello,则程序的运行结果如下:
sChar=h eChar=o 算法1:false temp=olleh 算法2:false
该程序的第9行用于判断是否带命令行参数,在执行程序时,若带有参数,则第一个参数args[0]赋值给字符串变量str,否则,将str仍取程序中设定的值"rotor";第14~24行是算法1,分别从前向后和从后向前依次获得源串str的一个字符sChar和eChar,比较sChar和eChar,如果不相等,则str肯定不是回文字符串,所以yn=false,立即退出循环;否则,继续比较,直到str的所有字符全部比较完,若yn值仍为true,才能肯定str是回文字符串;第25~32行是算法2,将源串str反转存入字符串变量temp中,再比较两个字符串,如果相等则是回文字符串。