Day20:实用类介绍(二)


任务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);
    }
}
  1. 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。

猜你喜欢

转载自blog.csdn.net/sanjiang521/article/details/107783934