1 字符串概述
在现实生活中,大家一定注册过电子邮箱,用户名和密码等使用的就是字符串。字符串是一系列字符组成的序列。其实,从进入Java编程世界的第一天起,大家就已经在使用字符串了,如程序从控制台输出字符串"欢迎进入"、"教育改变生活"等,可以说字符串无处不在。
1.1如何使用字符串
简单地说,使用字符串主要分为两步。
(1) 定义并初始化字符串。
(2) 使用字符串,对字符串进行一些处理。
前面已经学过如何创建一个字符串,如下所示。
语法:
//创建一个字符串对象” Hello World"
String s = n Hello World";
在Java中,字符串被作为String类型的对象来处理。String类是Java设计人员预先提供的一个非常有用的类,它位于java, lang包中,默认情况下,该包被自动导入所有的程序。创建String对象的另外两种方法如下列代码所示。
//创建一个空字符串
String s = new String ();
或者
//创建一个字符串对象” Hello World"
String s = new String("Hello World");
正因如此,大家可以通过使用String类提供的方法来完成对字符串的操作。String类提供了许多有用的方法,如获得字符串的长度、对两个字符串进行比较、连接两个字符串及提取一个字符串中的某一部分等。下面我们就来领略一下它的强大之处。
1.2字符串的长度
问题:注册新用户,要求密码长度不能小于6位。
分析:学习了 Scanner类之后,在控制台接收一个从键盘上输入的字符串已经不再是一件难事。那么,如何计算字符串的长度呢? String类提供了 length()方法。字符串是一串字符序列,String类的length()方法用来确定字符串的长度,即字符串中的字符数目。调用length()方法返回的结果就是字符串中的字符数,如图15.1所示。
图15.1获得字符串的长度
调用length()方法的语法如下。
字符串 1. length ();
返回字符串1的长度。
示例1
package cn.jbit.classandobject;
import java.util.*;
public class Register {
/*
* 注册密码长度不少于6位
*/
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String uname,pwd;
System.out.print("请输入用户名: ");
uname=input.next();
System.out.print("请输入密码: ");
pwd=input.next();
if(pwd.length()>=6){
System.out.print("注册成功! ");
}else{
System.out.print("密码长度不能小于6位!");
}
}
}
运行示例1,运行结果如图15.2所示。
在示例1中,使用字符串对象pwd的length()方法 "pwd.length()" 获得密码字符串的长度。由于 "1234567" 的长度为7,因此符合 ">=6" 的要求,打印输出 "注册成功"。
图15.2示例1的运行结果
1.3字符串的比较
在生活中,经常会对字符串进行比较。登录计算机操作系统时,输入的密码会和系统中已保存的密码进行比较;去书店买书时,看到的书名会和你大脑中想买的书名进行比较;考试结束去查成绩时,无意中也在将看到的名字和自己的名字进行比较,最终找到自己的成绩。可见,字符串的比较遍布我们的生活。接下来学习如何使用计算机进行字符串的比较。
问题:注册成功后,实现登录验证。用户名为 ”wangfeng” , 密码为 “1234567”。
分析:要编写程序让计算机比较两个字符串对象的内容是否一致,在前面章节的学习中已经接触过了,使用equals()方法可以帮助大家解决这个问题。下面一起来回顾一下,分析它的工作原理,如图15.3所示。
在使用equals()方法比较两个字符串时,它逐个对照组成两个字符串的每个字符是否相同。如果都相同,则返回true ; 否则返回false。对于字符的大小写,也在检查范围之内,语法如下。
语法:
字符串1. equals (字符串2);
比较两个字符串的值是否相同,返回boolean类型的值。如果相同,则返回true;否则返回false。
示例2
package cn.jbit.classandobject;
import java.util.*;
public class Login {
/*
* 登录
*/
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String uname,pwd;
System.out.print("请输入用户名: ");
uname=input.next();
System.out.print("请输入密码: ");
pwd=input.next();
if(uname.equals("wangfeng")&&pwd.equals("1234567")){
System.out.print("登录成功! ");
}else{
System.out.print("用户名或密码不匹配,登录失败!");
}
}
}
运行示例2,运行结果如图15.4所示。
图15.4示例2的运行结果
uname.equals("wangfeng")和pwd.equals("1234567") 分别比较输入的值是否符合要求。如果符合,则返回true,打印输出 "登录成功"。
可能大家会有疑问,为什么不能使用双等号(==)来判断两个字符串是否相同呢?在Java中,双等号(==)和equals()方法虽都应用于两个字符串,但所判断的内容是有差别的。简单地讲,"=="判断的是两个字符串对象在内存中的首地址是否相等,即判断是否是同一个字符串对象,而equals()判断的是两个字符串对象的值是否相等。了解了这一点,就不难理解示例3的运行结果了。
示例3
package cn.jbit.classandobject;
public class Difference {
public static void main(String[] args){
String str1 = new String("我爱我的祖国");
String str2 = new String("我爱我的祖国");
if (str1.equals(str2)){
System.out.println("两个字符串值相同。");
}else{
System.out.println("两个字符串值不相同。");
}
if (str1==str2){
System.out.println("两个字符串相同。");
}else {
System.out.println("两个字符串不相同。");
}
}
}
运行示例3,运行结果如图15.5所示。
图15.5示例3的运行结果
在使用equals()方法比较两个字符串时,对于字符的大小写,也在检查范围之内。但有时我们会碰到忽略大小写的验证,如"Java"和"java"都是指Java这门课程,使用equals()方法比较会认为它们不是一门课,因此,需要使用另一种方法——equalslgnoreCase()方法。Ignore是"忽略"的意思,这种方法在比较字符串时会忽略字符的大小写,语法如下。
语法:
字符串 1. equalsIgnoreCase ( 字符串 2);
忽略大小写比较字符串1和字符串2。如果都相同,则返回true;否则返回false。
问题:系统规定,登录时不考虑用户名的大小写问题,该如何实现登录?
分析:修改示例2,使用equalsIgnoreCase()方法即可实现。
示例4
package cn.jbit.classandobject; import java.util.*; public class Login1 { /** * 登录 * */ public static void main(String[] args) { Scanner input = new Scanner(System.in); String uname,pwd; System.out.print("请输入用户名: "); uname=input.next(); System.out.print("请输入密码: "); pwd=input.next(); /* if(uname.equals("TOM")&&pwd.equals("1234567")){ System.out.print("登录成功! "); }else{ System.out.print("用户名或密码不匹配,登录失败!"); }*/ if(uname.equalsIgnoreCase("wangfeng")&&pwd.equalsIgnoreCase("1234567")){ System.out.print("登录成功! "); }else{ System.out.print("用户名或密码不匹配,登录失败!"); } } }
运行示例4,运行结果如图15.6所示。
图15.6示例4的运行结果
那么,还有别的解决办法吗?如果在比较之前就变成全部大写或是全部小写,然后使用equals(),是否也会得到同样的效果呢?下面就来试一试。
在Java中,String类提供了两个方法改变字符串中字符的大小写,如图15.7所示。
toLowerCase():转换字符串中的英文字母为小写。
toUpperCase():转换字符串中的英文字母为大写。
语法:
字符串.toLowerCase ()
返回字符串的小写形式
字符串.toUpperCase ()
返回字符串的大写形式
修改示例2,代码如下,同样可以实现忽略大小写实现登录。
if(uname.toLowerCase().equals(("WANGFENG").toLowerCase())
&&pwd.toUpperCase().equals(("1234567").toUpperCase())){
System.out.print("登录成功! ");
}else{
System.out.print("用户名或密码不匹配,登录失败!");
}