实用类介绍(二)
任务2:操作字符串
关键步骤如下。
➢判断字符串长度。
➢比较字符串。
➢字符串大小写转换
➢连接字符串。
➢获取子字符串。
➢获取字符位置索引。
➢StringBuffer 类及StringBuilder类的用法。
String 类的常用方法
1. String类概述
在Java中,字符串被作为String类型的对象来处理。String类位于java.lang包中,默认情况下,该包被自动导入所有的程序。创建String对象的方法如以下代码所示。
String s="Hello World";
//或者
String s=new String("Hello World");
String类提供了许多有用的方法,例如,获得字符串的长度、对两个字符串进行比较、连接两个字符串以及提取一个字符串中的某一部分等。 可以使用String类提供的方法来完成对字符串的操作。
2. String 类常用方法
(1)求字符串长度length()
调用length()方法的语法格式如下。
字符串.length();
length()方法返回字符串的长度。
示例4
注册新用户,要求密码长度不能小于6位。
关键代码:
public class Register {
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位! ");
}
}
}
(2)字符串比较
字符串比较的语法格式如下。
字符串1.equals(字符串2);
比较两个字符串的值是否相同,返回值为boolea类型,如果相同,则返回真值,否则返回假值。
示例5
注册成功后,实现登录验证。用户名为"TOM",密码为“1234567”。
分析如下。
在使用equals()方法比较两个字符串时,它逐个字符比较组成两个字符串的每个字符是否相同。如果都相同,则返回真值,否则返回假值。对于字符的大小写,也在检查范围之内。
关键代码:
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("TOM") && pwd.equals("1234567") ){
System.out.print(" 登录成功! ");
}else{
System.out.print(" 用户名或密码不匹配,登录失败! ");
}
}
}
在java中,双等号(= =)和equal()方法应用于两个字符串比较时,所比较的内容是有差别的。“==”比较的是两个字符串对象在内存中的地址,就是判断是否是同已个字符串对象,而equals()比较的是两个字符串对象的值。
在使用equals()方法比较两个字符串时,对于字符的大小写,也在检查范围之内。
例如“Java”和“java”都是指Java课程,使用equals()方法比较会认为它们不是同一门课,因此,需要使用equalsIgnoreCase()方法,这个方法在比较字符串时忽略字符的大小写。
忽略大小写的字符串比较的语法格式如下。
字符串1. equalsIgnoreCase(字符串2);
忽略大小写比较字符串1 和字符串2,如果相同,则返回真值,否则返回假值。
示例6
系统规定,登录时不考虑用户名的大小写问题,实现登录。
分析:
修改示例5,使用equalsIgnoreCase()方法即可实现。
关键代码:
public class Login {
public static void main(String[] args) {
//省略部分代码
if (uname.equalsIgnoreCase("TOM")
&& pwd.equalsIgnoreCase("1234567")) {
System.out.print("登录成功! ");
} else {
Systerm.out.print("用户名或密码不匹配,登录失败! ");
}
}
}
在Java中,String 类提供了两个方法改变字符串中字符的大小写。
➢toLowerCase():转换字符串中的英文字符为小写。
➢toUpperCase():转换字符串中的英文字符为大写。
修改示例6,代码如下,同样可以实现登录时忽略大小写。
关键代码:
if (uname.toLowerCase().equals(("TOM").toLowerCase())
&& pwd.toUpperCase().equals(("1234567").toUpperCase())) {
System.out.println("登录成功! ");
} else {
System.out.print("用户名或密码不匹配,登录失败!");
}
(3)字符串的连接
字符串连接的语法格式如下。
字符串1.concat(字符串2);
字符串2被拼接到字符串的后面,返回拼接后的新字符串。
示例7
字符串连接。
关键代码:
public static void main(String[] args) {
String s=new String("你好,");
String name= new String("张三! ");
String sentence=s.concat(name);
System.out.println(sentence);
程序执行后字符串sentence的内容便是“你好,张三!”,s和name的值依然为“你好,”“张三!”。连接字符串还经常使用“+”运算符,如下面的代码所示。
String name="张三";
String sayHi=name+",你好";
则sayHi的值为“张三,你好”。 所以,连接字符串的方法有两种:使用“+”运算符或使用String类的concat()方法。
(4)字符串提取和查询
下面通过示例8学习字符串提取和查询方法的使用。
示例 8
学生使用作业提交系统提交Java作业时,输入Java源文件名,并输入自己的电子邮箱,提交前系统检查:是否是合法的Java文件名;电子邮箱是否为合法电子邮箱。编写代码,实现提交前验证功能。
分析如下。
判断Java 的文件名是否合法,关键要判断它是不是以“.java” 结尾:判断电子邮箱是否合法,至少要检查电子邮箱名中是否包含“@"和“.”字符,并检查“@”是否在“.”之前,要解决这些问题就要使用String 类提供的提取和搜索字符串的方法。如表2-3列出了String 类提供的一些常 用的提取和搜索字符串的方法。
表2-3常 用的提取和搜索字符串的万法
方法 | 说明 |
---|---|
public int indexOf(int ch) | 搜索并返回第一个出现字符ch (或字符串value)的位置 |
Public int indexOf(String value) | 同上 |
public int lastIndexOf(int ch) | 搜索并返回最后个出现字 符ch (或字符串value) 的位置 |
public int lastIndexOf(String value) | 同上 |
public String substring(int index) | 提取从指定索引位置开始的部分字符串 |
public String substring(int beginindex, int endindex) | 提 取beginindex和endindex之间的字符串 |
public String trim() | 截取字符串前后的空格后返回新的字符串 |
字符串是一个字符序列,每一个字符都有自己的位置,字符串事实上也是一个字符数组,因此它的索引位置从0开始到(字符串长度-1)结束。
要想在程序中处理好字符串,关键是将这些方法巧妙地结合起来,灵活运用。以下是示例8的实现代码。
关键代码:
public class Verify {
public static void main(String[] args) {
boolean fileCorrect = false;
//标志文件名是否正确
boolean emailCorrect = false;
//1标志E-mail是否正确
System.out.println("---欢迎进入作业提交系统--");
Scanner input = new Scanner(System.in);
System.out.println("请输入Java文件名: ");
String fileName = input.next();
System.out.println("请输入你的邮箱");
String email = input.next();
//检查Java文件名
int index = fileName.lastIndexOf(".");
//“.”的位置
if (index != -1 && index != 0 && fileName.substring(index + 1, fileName.length()).equals("java")) {
fileCorrect = true;
//1标志文件名正确
} else {
System.out.println("文件名无效。");
//检查你的电子子邮箱格式
if (email.indexOf('@' ) != -1 && email.indexOf('.' ) > email.indexOf('@' )) {
emailCorrect = true;//标志E-mail正确
} else {
System.out.println("E mail无效。");
}
//输出检测结果
if (fileCorrect && emailCorrect) {
System.out.println("作业提交成功! ");
} else {
System.out.println("作业提交失败! ");
}
}
}
}
判断Java文件名是否有效时,使用的判断条件如下:
index!=-1&&index!=0&&fileName.substring(index+ 1,fileName.length()).equals("java");
index 是点号".”在字符串中的位置,条件“index!=1&&index!=0”是指字符串中包含点号并且点号不是在首位。除此之外,通过substring()方法获得点号后的字符串,然后判断是否是“java”, 只有3个条件全部满足,才是合法的文件名。在判断电子邮箱名时,检查是否包含“@”, 是否包含“.”,并且检查“@”是否在“.”的前面。
(5)字符串拆分
字符串拆分的语法格式如下。
字符串名.split(separator,limit);
1)separator 是可选项,表示根据匹配指定的正则表达式来拆分此字符串。如果匹配不上,则结果数组只有一个元素,即此字符串。
2)limit可选项,该值用来限制返回数组中的元素个数。
示例 9
所示。有皮歌词,每句都以空格结尾,请将歌词按句拆分后按行输出。
分析如下。
实现这个需求,只要将每句歌词按照空格拆分即可。此时就可以使用split方法实现
关键代码:
public class Lyric {
public static void main(String[] args) {
String words = "长亭外古道边芳草碧连天晚凤扶柳笛声残夕阳山外山";
String[] printword = new String[100];
System.out.println("****原歌词格式***\n" + words);
//1定义接收数组
System.out.println("\n*** 拆分后歌词格式***");
printword = words.split(" ");
for (int i = 0; i < printword.length; i++) {
//1按照空格进行拆分
System.out.println(printword[i]);
//1打印输出
}
}
}
StringBuffer 类和StringBuilder类
1. 使用StringBuffer 类处理字符串
除了使用String类存储字符串之外,还可以使用StringBuffer类来存储字符串。StringBuffer 类也是Java提供的用于处理字符串的一个类,而且它是比String类更高效地存储字符串的一种引用数据类型。特别是对字符串进行连接操作时,使用StringBuffer类可以大大提高程序的执行效率。
(1)如何使用StringBuffer 类
StringBuffer类位于java.util 包中,是String类的增强类。StringBuffer 类提供了很多方法可供使用。
声明StringBuffer对象并初始化的方法如下所示。
StringBuffer sb2=new StringBuffer("青春无悔");
(2)常用的StringBuffer类方法
下面介绍几个比较常用的StringBuffer 类提供的方法。
1 )toString()方法
转化为String类型的语法格式如下。
字符串1.toString();
将StringBuffer类型的字符串1转换为Sring类型的对象并返回。
例如:
String s1=sb2.toString();
//转换为String类
2)append(方法
追加字符串的语法格式如下。
字符串append(参数);
该方法和String类的concat()方法一样, 都是把一个字符串追加到另一 个字符串后面,所不同的是String类中只能将String类型的字符串追加到一个字符串后, 而StringBuffer类可以将任何类型的值追加到字符串之后。
示例10
使用StringBuffer类实现字符串追加。
关键代码:
public class sbAppend {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("青春无悔");
int num = 110;
//在字符串后面追加字符串
StringBuffer sb1 = sb.append("我心永恒");
System.out.println(sb1);
//在字符串后面追加字符
StringBuffer sb2 = sb1.append('啊');
System.out.println(sb2);
//在字符串后面追加整型数字
StringBuffer sb3 = sb2.append(num);
System.out.println(sb3);
}
}
- insert()方法
插入字符串的语法格式如下。
字符串.insert(位置,参数);
将参数插入到字符串指定位置后并返回。参数值可以是包括String的任何类型。
示例11
编写一个方法,实现将一个数字字符串转换成以逗号分隔的数字串,即从右边开始每3个数字用逗号分隔。
分析:
利用StringBuffer类的length()方法,获取数字串的长度,使用for循环从后向前每
隔3位插入逗号。
关键代码:
import java.util.Scanner;
public class TestInsert {
public static void main(String args[]) {
Scanner input = new Scanner(System.in);
//接收数字串,存放于SringBufer类型的对象中
System.out.println("请输入一串数字");
String nums = input.next();
StringBuffer str = new StringBuffer(nums);
//从后往前每隔3位添加逗号
for (int i = str.length() - 3; i > 0; i = i - 3) {
str.insert(i, ',');
}
System.out.print(str);
}
}
2.使用StringBuilder类处理字符串
java.lang. SringBuider是JDK 5.0版本新增的类,它是一个可变的字符序列。此类提供一个与StringBuffer兼容的API,被设计用作StringBuffer的一 个简易替换,在大多数实现中,它比StringBuffer执行要快。使用StringBuilder类处理字符串的方法与StringBuffer类基本样,这里不再举例。
3. String类、StringBuffer类及StringBuilder类对比
String、StringBuffer 和StringBuilder这3个类在处理字符串时有各自的特点和适用场合,具体如下。
(1)String:字符串常量
String是不可变的对象,在每次对String类型进行改变时其实都等同于生成了一个新的String 对象,然后指向新的String 对象,所以经常改变内容的字符串最好不要用String类型,因为每次生成对象都会对系统性能产生影响。
(2) StringBuffer:字符串变量
StringBuffer是可变的字符串,在每次对StringButfer对象进行改变时,会对StringBuffer对象本身进行操作,而不是生成新的对象,再改变对象引用。所以,在字符串对象经常改变的情况下推荐使用StringBuffer类。
字符串连接操作中,StringBuffer 类的执行效率要比String类高,例如:
String str=new String("welcome to");
str+="here";
以上这两句代码是使用String类型来操作字符串,但其处理步骤实际上是通过建立一个StringBuffer对象,让它调用append()方法,最后再转化成String,这样的还String的连接操作比StringBuffer多出了一些附加操作,当然效率要低。并且由于String对象的不可变性也会影响性能。
(3 ) StringBuilder:字符串变量
JDK5.0版本以后提供了StringBuilder类,它和StringBuffer类等价,区别在工StringBuffer类是线程安全的,StringBuilder 类是单线程的,不提供同步,理论上效率更高。
至此,任务2已经全部完成。String 类方法比较多,需要多做练习,灵活运用,
同
时要理解StringBuffer类及StringBuilder类与String类的不同之处。
任务3使用java.util包中的常用类…
关键步骤如下。
➢使用Date类和Calendar类操作日期时间。
➢使用SimpleDateFormat类格式化时间。
➢使用Random类生成随机函数。
日期操作类
java.util包也是Java内置的一个工具包, 它包含了集合框架、日期和时间、随机函数生成器等各种实用工具类。java.util 包不会默认导入,如果要使用该包中的类,则必须在程序的开始部分进行手工导入。
下面介绍java.util 包中几个常见的类。
java.util 包中提供的和日期时间相关的类有Date类、Calendar 类和SimpleDateFormat类等。
Date类对象用来表示日期和时间,该类提供了一系列操作日期和时间各组成部分的方法。Date类中使用最多的是获取系统当前的日期和时间,如Date date =new Date();这句代码是使用系统当前时间创建日期对象。
Calendar类也是用来报作日期和时间的类,它可以看作是Date类的一个增强版,Calendar类提供了一组方法,允许把 一个以毫秒为单位的时间转换成年、月、个、小时、分、秒。可以把Calendar类当作是万年历,默认显示的是当前的时间,当然也可以查看其他时间。
Calendar类是抽象类,可以通过静态方法getInstance()获得Calendar类的对象,其实这个获得的对象是它的子类的对象。
Calendar类提供一些方法和静态字段来操作日历,例如:
➢int get (int field): 返回给定日历字段的值。”
➢YEAR: 指示年。
➢MONTH:指示月 。
➢DAY OF MONTH:指示一个月中的某天。
➢DAY_ OF WEEK:指示一个星期中的某天。
另外常用的还有格式化日期时间的类——DateFormat类, 它在java.text包下,是一个抽象类,提供了 多种格式化和解析时间的方法。格式化是指将日期转换成文本,解析是指将文本转换成日期格式。使用比较多的是它的子类SimpleDateFormat,SimpleDateFormat类是一个 以与语言环境有关的方式来格式化和解析日期的具体类,如“yyyy-MM-dd HH:mm:ss”就是指定的一种日期和时间格式。
下面通过示例来学习这几个类的用法。
示例12
获取当前系统时间,并使用SimpleDateFormat类格式化时间。
关键代码:
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test {
public static void main(String[] args) {
Date date = new Date();
SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("当前时间为:" + formater.format(date));
}
}
在示例12中,Date date=new Date();获取Date对象,并初始化间格式化为"yyyy-MM-dd HH:mm:ss"这样的形式。
示例13
使用Calendar获取日期及星期。
关键代码:
import java.util.Calendar;
public class Test5 {
public static void main(String[] args) {
Calendar t = Calendar.getInstance();
System.out.println("今天是" + t.get(Calendar.YEAR) + "年"
+ (t.get(Calendar.MONTH) + 1) + "月" + t.get(Calendar.DAY_OF_MONTH) + "日");
System.out.println("今天是星期" + (t.get(Calendar.DAY_OF_WEEK) - 1));
}
}
Random 类
Random类用于生成随机数。每当需要以任意或非系统方式生成数字时,可用此类。之前学习过的Math类的random()方法也可以产生随机数,其实Math类random()方法底层就是使用Random类实现的。
Random类的构造方法有两种重载方式,如表2-4所示。
表2-4 Random类 的构造方法
构造方法 | 说明 |
---|---|
Random() | 创建一个新的随机数生成器 |
Random(long seed) | 使用单个long种子创建一个新的随机数生成器 |
Random类中还定义了很多方法用于获取随机数,最常用的是nextInt()方法,它返回下一个伪随 机数的语法格式如下。
int nextInt();
int nextInt(int n);
➢前者返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的int值。
➢后者返回下一个伪随机数,它是取自此随机数生成器序列的、在0(包括) 和指定值n(不包括n)之间均匀分布的int值。
示例14
随机生成20个10以内大于或等于0的整数,并将其显示出来。
关键代码:
import java.util.Random;
public class RandomDemo {
public static void main(String[] args) {
//创建一个Random对象
Random rand = new Random();
//随机生成20个随机整数,并显示
for (int i = 0; i < 20; i++) {
int num = rand.nextInt(10);
System.out.println("第" + (i + 1) + "个随机数是:" + num);
}
}
}
注意
如果用同样一个种子值来初始化两个Random对象,然后用每个对象调用相同的方法,那么得到的随机数也是是相同的。
Random类还定义了得到长整型、boolean型、 浮点型等伪随机数的方法。具体用法可以在使用时查看Java API。