字符串简述

1 引言
我们经常会遇到涉及字符串处理和文件输入/输出的问题。假如需要编写一个程序,该程序用一个新字替换 文件中所出现某个字的地方。该如何实现这个功能呢?本次介绍字符串和文本文件,他们可以帮助解决此类问题。
2 字符串类String
字符串是由字符构成的一个序列。在很多语言中,字符串都被当做字符数组来处理,但是在java中,字符串是一个对象。String类中有1个构造方法以及40多个处理字符串的方法。这不仅在程序设计中非常有用,而且也是一个学习类和对象很好的例子。
2.1 构造一个字符串
可以用字符串直接量或字符数组创建一个字符串对象。使用如下语法,从字符串直接量创建一个字符串:

String newString = new String(stringLiteral);

参数StringLiteral是一个括在双引号内的字符序列。下面的语句为字符串直接量”Welcome to Java” 创建一个String对象message:

String message = new String("Welcome to Java");

Java将字符串直接量看做String对象。所以,下面的语句是合法的:

String message = "Welcome to Java";

还可以用字符数组创建一个字符串。例如,下述语句构造一个字符串”Good Day” :

char[ ] charArray = {'G','o','o','d',' ','D','a','y'};
String message = new String(charArray);

注意 String 变量存储的是对String对象的引用,String对象里存储的才是字符串的值。严格的讲,术语String变量、String对象和字符串值是不同的。但在大多数情况下,它们之间的却别是可以忽略的。为简单起见,术语字符串通常用来指String变量、String对象和字符串的值。
2.2 不可变字符串与限定字符串
String对象是不可变的,它的内容是不能改变的。下列代码会改变字符串的内容么?

String s = “Java”;
s = “HTML”;

答案是不能 。第一条语句创建了一个内容为”Java”的String对象,并将其引用赋值给s。第二条语句创建了一个内容为“HTML”的新String对象,并将其引用赋值给s。赋值后第一个String对象仍然存在,但是不能再访问它,因为变量s现在指向了新的对象。
这里写图片描述
因为字符串在程序设计中是不可变的,但同时又会频繁地使用,所以Java虚拟机为了提高效率并节约内存,对具有相同字符串序列的字符串直接量使用同一个实例。这样的实例称为限定的(interned)。

String s1 = “Welcome to Java”
String s2 = new String("Welcome to java");
String s3 = "Welcome to Java";
System.out,println("s1 == s2 is " + (s1 ==s2));
System.out,println("s1 == s3 is " + (s1 ==s3));

程序结果显示:
s1 ==s2 is false
s1 =s3 is true
在上述语句中,由于s1和s3指向相同的限定字符串“Welcome to Java”,因此,s1 ==s3为true。但是,s1 == s2 位false,这是 因为尽管s1 和s2的内容相同,但它们是不同的字符串对象。
2.3 字符串的比较
String类提供了多种对字符串进行比较的方法,
这里写图片描述
如何比较两个字符串的内容是否相等呢?你可能会尝试使用==操作符,如下所示:

if(string1 == string2){
System.out.println("string1 and string2 are the same object");
else
System.out.println("string1 and string2 are different objects");
}

然而,运算符==只能检测string1和string2是否指向同一个对象,但它不会告诉你他们的内容是否相同。因此,不能使用==运算符判断两个字符串的变量的内容是否相同。取而代之,应该使用equals方法。
例如,可以使用下面给出的代码比较两个字符串:

if(string1.equals(string2))
System.out.println("string1 and string2 have the same contents");
else
 System.out.println("string1 and string2 are not equal");

例如,下面的语句先显示true,然后显示false。
String s1 = new String(“Welcome to java”);
String s2 = “Welcome to java”;
String s3 = “Welcome to c++”;
System.out.println(s1.equals(s2));//true;
System.out.println(s1.equals(s3));//false
compareTo方法也用来对两个字符串进行比较。
s1.compareTo(s2)
如果s1与s2相等,那么该方法返回值0;如果按字典序s1小于s2,那么方法返回值小于0;如果按字典序s1大于s2,方法返回值大于0。
方法compareTo返回的实际值是依据s1和s2从左到右数第一个不同字符之间的距离得出的。例如,假如s1为“abc”,s2为“abg”,那么s1.compareTo(s2)返回-4。首先比较的是s1与s2中第一个位置的两个字符(a与a)。因为他们相等,所以比较第二个位置的两个自付(b与b)。因为他们也相等,所以比较第三个位置的两个字符(c与g)。由于字符c比字符g小4,所以比较之后返回-4。
警告:如果使用像>、<=这样的比较运算符比较两个字符串,就会发生语法错误

String类还提供了对字符串进行比较的方法equalsIgnoreCase、compareToIgnoreCase和regionMatches。当比较两个字符串是否相同时,方法equalsIgnoreCase和compareToIgnoreCase忽略字母的大小写。方法regionMatches比较两个字符串是否部分相等。还可以使用str.startsWith(prefix)来检测字符串str是否以特定前缀prefix开始,使用str.endsWith(suffix)来检测字符串str是否以特定后缀suffix结束。
2.4字符串长度、字符以及组合字符串
String类提供获取字符串长度、获取单个字符和链接字符串的方法
这里写图片描述
可以调用字符串的length()方法获取它的长度。例如,message.length()返回字符串的message的长度。
**警告
length是String类的一个方法,但他是数组对象的一个属性。所以,要获取字符串s中的字符个数,必须使用s.length(),而要获取数组a中的元素个数,就必须使用a.length。
方法s.charAt(index)可用于提取字符串s中的某个特定字符,其中下标index的取值范围在0到s.length()-1之间。例如,message.charAt(0)返回字符我W,如图:
这里写图片描述
注意:在计算机内部,字符串的值是私有数据变量表示的。数组是不能从String类的外部访问的。String类提供了许多像length()和charAt(index)这样的公共方法以获取该数组的信息。这是一个关于封装的很好的例子:类的数据域通过私有修饰符对用户隐藏,这样,用户就不能直接操作数据域。如果数组不是私有的,用户就能通过修改数组而改变字符串的内容,这就会违反String类不可变原则。

警告:在字符串s中越界访问字符是一种常见的程序设计错误。为了避免此类错误,要确保 使用的下标不会超过s.length-1。例如,charAt(s.length())会造成一个StringIndexOutofBoundsException异常。
2.5获取子串

可以使用charAt方法从字符串中获取单个字符,也可以使用String类的substring方法从字符串中提取子串。这里写图片描述
这里写图片描述
例如:
String message = “Welcome to Java”.substring(0,11)+”HTML”;
现在,字符串message变成“Welcome to HTML”。
注意 如果beginIndex就是endIndex,那么subString(beginIndex,endIndex)就会返回一个长度为0的空字符串。如果beginIndex>endIndex,就会出现运行错误。
字符串的转换、替换、分隔

String类提供转换、替换、和分隔字符串的犯法。
这里写图片描述
一旦创建了字符串,它的内容就不能改变。但是,方法toLowerCase、toUpperCase、trim、repalce、replaceFirst和replaceAll会返回一个源自原始字符串的新字符串(并未改变原始字符串!)。方法toLowerCase和toUpperCase通过将字符串中所有字符都转换成小写或大写获取一个新字符串。方法trim通过删除字符串两端的空格字符返回一个新字符串。方法replace的版本有好几个,它们实现用新的字符或子串替换字符串中的某个字符或子串。
例如:
“Welcome”.toLowerCase()返回一个新字符串welcome。
“Welcome”.toUpperCase()返回一个新字符串WELCOME。
“Welcome”.trim()返回一个新字符串Welcome。
“Welcome”.replace(‘e’,’A’)返回一个新字符串WAlcomA。
“Welcome”.replaceFirst(“e”,”AB”)返回一个新字符串WABlcome。
split方法可以从一个带特定限定符的字符串中提取标志。例如:
String[] tokens = “Java#HTML#Perl”.split(“#”,0);
for(int i = 0;i

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值