字符串和String
一、字符串和字符串常量
字符串常量
"ABC"是字符串常量的一个示例,字符串常量是用双引号括起来的字符序列,字符序列即为拼写的内容;双引号中也可以不是字符,无字符的" "是由0个字符构成的字符串常量
String型变量
String s = "ABC";是使用String型变量表示字符串的一个示例,String类并不是从基本类型(int、double等内置类型),而是java.lang包中的类;
字符串常量是String型实例的引用,也就是说,不论是字符串常量,还是显式声明的变量,这些字符串都是String型;
二、String型
String型变量s,赋给该变量的初始值"ABC"是字符串常量,思考String实例的引用,String 类持有用于保存字符串的字符数组以及表示字符个数的字段,变量s及其引用的实例如图
在final char []型数组的元素中, 从头开始依次保存着字符'A'、'B'、'C',表示字符个数的final int型字段中保存着3;变量s引用的不是单纯的字符序列,而是内部持有字符序列的实例,虽然是类类型,但可以不显式使用new运符符来创建实例是字符串的一个特征
String型变量的引用目标
如果String型变量什么都不引用, 或者引用了空字符串,结果会怎么样?
// 空引用和空字符串
class StringTester {
public static void main(String[] args) {
String s1 = null; // 空引用(无引用)
String s2 = ""; // 引用""
System.out.println("字符串s1 = " + s1);
System.out.println("字符串s2 = " + s2);
}
}
输出:
s1…null (空引用)
变量sl被初始化为null,名为空常量的null是什么都不引用的空引用
s2…引用空字符串
而s2引用的是没有字符的字符串,即构成字符为0个的字符串
引用其他的字符串
对于引用某个字符串的String型变量,如果再赋入其他的字符串,结果会怎么样呢?
// 改变字符串的引用目标
class ChangeString {
public static void main(String[] args) {
String s1 = "ABC"; // 引用"ABC"
String s2 = "XYZ"; // 引用"XYZ"
s1 = "XYZ"; // 引用"XYZ"
System.out.println("字符串s1 = " + s1);
System.out.println("字符串s2 = " + s2);
System.out.println("s1和s2引用的" +
((s1 == s2) ? "是相同的字符串常量。" : "不是相同的字符串常量。"));
}
}
输出;
在main方法的开头,变量sl初始化为“ABC”的引用,变量s2初始化为"XYZ"的引用,之后的部分如下:
1、首先将“XYZ”赋给s1, 然后显示s1。从运行结果可知,字符串s1引用的字符串为“XYZ”;
2、判断并显示s1和s2引用的是否是相同的字符串。从运行结果可以确认表达式sl == s2的值为true;
3、通过1中的赋值,字符串的内容看上去由"ABC" 改写成了"XYZ", 但实际情况并非如此;
赋值后的s1和s2如图所示,s1引用的字符串内容并未变为"XYZ", 只不过是将"XYZ"的引用赋给了s1, 这样s1就变成了对s2
本来引用的" XYZ" 的引用。【"ABC" 将不再被任何地方引用】
三、构造函数
由于String型为类类型,因此可以显式调用构造函数来创建实例:
下表汇总了String型构造函数概要:
下面来显式调用构造函数,实际构造字符串,程序如下:
// 使用String型的构造函数来创建字符串
class StringConstructor {
public static void main(String[] args) {
char[] c = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'};
String s1 = new String(); // String()
String s2 = new String(c); // String(char[])
String s3 = new String(c, 5, 3); // String(char[], int, int)
String s4 = new String("XYZ"); // String(String)
System.out.println("s1 = " + s1);
System.out.println("s2 = " + s2);
System.out.println("s3 = " + s3);
System.out.println("s4 = " + s4);
}
}
输出:
上述程序中存在4个String型变量分别使用了不同形式的构造函数来创建字符串:
1)变量s1...构造函数
创建了一个空字符串,创建的是由0个字符构成的空字符串(是空字符串而不是空引用);
2)变量s2...构造函数
基于char型数组c中包含的所有字符'A','B',...,'J'创建了字符串,s2引用的字符串为"ABCDEFGHIJ";
3)变量s3...构造函数
基于char型数组c中从C[5]开始的3个字符'F'、'G' 、'H' 创建了字符串,s3引用的字符串为"FGH";
4)变量s4...构造函数
使用复制构造函数,基于字符串常量"XYZ", 来创建一个拼写相同的字符串。
四、方法
String型中提供了很多方法,各个方法的概要如下表:
计算字符串长度的方法和访问任意的字符
从读入的字符串的开头开始逐个遍历字符并按顺序显示遍历的字符,代码如下:
// 逐个遍历字符串中的字符并显示
import java.util.Scanner;
class ScanString {
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
System.out.print("字符串s:");
String s = stdIn.next();
for (int i = 0; i < s.length(); i++)
System.out.println("s[" + i + "] = " + s.charAt(i));
}
}
输出:
本程序中调用了两个String型的方法:
1)length … 检查字符个数
length方法用于检查字符串的长度,即字符串中包含的字符个数。它没有参数,调用形式如下所示:
变量名. length() --该方法会返回int型数值的字符串长度
2) charAt … 检查字符串中的字符
charAt方法用于获取字符串中任意位置的字符,第n个字符(与数组的索引相同,也是从0开始计数)可以通过下述表达式获取:
变量名 . charAt(n) --返回值的类型为char型
与其说”字符串中的第n个字符” ,不如说“从头开始的第n个字符",这样的表述更加准确
查找字符串中的字符串
检查字符串中是否包含其他的字符串
// 查找字符串
import java.util.Scanner;
class SearchString {
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
System.out.print("字符串s1:"); String s1 = stdIn.next();
System.out.print("字符串s2:"); String s2 = stdIn.next();
int idx = s1.indexOf(s2);
if (idx == -1)
System.out.println("s1中不包含s2。");
else
System.out.println("s1的第" + (idx + 1) + "个字符中包含s2。");
}
}
输出:
indexOf…查找字符串中包含的字符串
用于检查是否包含参数中传入的字符串。如果不包含则返回-1, 如果包含则返问其"位置" ;位置为从头开始依次计数的数值0、1·····调用形式如下:
变量名 . indexOf(s)
五、字符串的比较
equals方法用于判断字符串是否相等,使用equals方法的程序如下:
// 字符串的比较
import java.util.Scanner;
class CompareString {
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
System.out.print("字符串s1:"); String s1 = stdIn.next();
System.out.print("字符串s2:"); String s2 = stdIn.next();
if (s1 == s2)
System.out.println("s1 == s2 。");
else
System.out.println("s1 != s2 。");
if (s1.equals(s2))
System.out.println("s1和s2的内容相等。");
else
System.out.println("s1和s2的内容不相等。");
}
}
输出:
s1 和s2中都输入f字符串“ABC”,虽然拼写相同,但由于各个实例是分别创建的,如图所示,s1和s2引用了保存在不同空间中的字符串,因此不管s1和s2中输入什么字符串,s1 = s2的判断结果都一定为false
equals…判断与其他的字符串是否相等
equals方法用于判断与参数中传入的字符串是否相等(字符串中的所有字符是否都相等),调用形式如下:
变量名.equals(s) ---如果字符串与s相等则返回true,如果不相等,则返回false
String型变量不可以使用<、<=、>、>=等运算符进行比较。如果要比较大小关系(使用字典顺序进行排列时的前后关系),则可以使用compareTo方法
六、format方法
该方法将System.out.printf 的输出目标由控制台画面变为字符串:
// 使用String.format方法创建字符串
class StringFormat1 {
public static void main(String[] args) {
String s1 = String.format("%5d", 123);
String s2 = String.format("%9.3f", 123.45);
System.out.println("s1 = " + s1);
System.out.println("s2 = " + s2);
}
}
输出:
使用String.format创建字符串如图所示,%%变成%, 黑色阴影部分的%d部分中赋入整数值,例如,如果变量i的值为2, 那么创建的字符串就是"%2d\n"
如果不将创建的字符串赋给变量f ,而是直接传递给printf 方法, 程序会更加简洁:
// 使用String.format方法创建格式字符串
class StringFormat2 {
public static void main(String[] args) {
for (int i = 1; i <= 4; i++) {
System.out.printf(String.format("%%%dd\n", i), 5);
}
}
}
输出: