20、Java基础---字符串和String

字符串和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);
		}
	}
}

输出:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值