Java 字符串

目录

1 字符串概述

1.1如何使用字符串

1.2字符串的长度

1.3字符串的比较

2 复杂的字符串处理

2.1字符串的连接

2.2字符串的提取和查询

1. indexOf( )方法

2. lastlndexOf( )方法

3. substring(int index) 方法

5. trim( )方法

2.3字符串的拆分

3 String Buffer 类

3.1 如何使用 StringBuffer 类

1. 声明 StringBuffer 对象并初始化

2. 使用 StringBuffer 对象

3.2 常用的 StringBuffer 类方法


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("用户名或密码不匹配,登录失败!");


}

2 复杂的字符串处理

2.1字符串的连接


问题:某学员三门课的成绩分别如下:SQL 80分、Java 90分、HTML 86.7分。打印输出图15.9所示的成绩单。

 

分析:使用前面已经学过的输出语句可以直接按照图15.9显示的格式输出成绩单,参考代码如下所示。

System.out.println("SQL:" + sqlScore + "  Java:" + javaScore  
+ "  HTML:" + htmlScore); 
 
这里的 ”+” 运算符就起到了连接字符串的作用。同样,在定义一个字符串时也可以使用 ”+ 运算符进行连接,如示例5所示。
示例5
 

package cn.jbit.classandobject;
public class PrintScore {
   
/**
     *
打印成绩单
    
*
     */
   
public static void main(String[] args) {
       
int sqlScore = 80;         //SQL成绩
       
int javaScore = 90;        //Java成绩
       
double htmlScore = 86.7;   //HTML成绩

       
String scoreSheet = "SQL:" + sqlScore + "  Java:" + javaScore  + "  HTML:" + htmlScore;              //成绩单
       
//打印成绩单
       
System.out.println("*****成绩单*****");
       
System.out.println(scoreSheet);
    }
}

 

在示例5中,创建字符串对象scoreSheet时,使用 "+" 运算符将多个字符串连接成一个新字符串,并且使用"+" 可以将任意多个字符串连接在一起。可能大家会问,变量sqlScore、javaScore和htmlScore都是int类型,字符串和整型也可以连接吗?

请记住,在使用 "+" 运算符连接字符串和int (或double)类型数据时,"+" 将int (或double)类型数据自动转换成String类型。

除此之外,在Java中,String类也提供了另一个方法concat(),将一个字符串连接到另一个字符串的后面,语法如下。

语法:

字符串1. concat (字符串2);

字符串2被连接到字符串1的后面,返回连接后的新字符串。

使用这个方法,让计算机向你问好,代码如下所示。

String s = new String("你好,");
String name = new String("张三!");
String sentence = s.concat(name);
System.out.println(sentence);

执行完毕,字符串sentence的内容便是"你好,张三!" , s和name的值依然为 "你好,"、"张三"。

小结:连接字符串的方法有两种:使用 "+" 运算符和使用String类的concat()方法。

2.2字符串的提取和查询

在应用中,也会遇到要对字符串的某一部分进行查询和提取的问题。

问题:学生使用作业提交系统提交Java作业时,输入Java源代码文件名,并输入自己的邮箱,提交前系统会检查:是否是合法的Java文件名;邮箱是否为合法邮箱。编写代码,实现提交前的验证功能。

分析:判断Java的文件名是否合法,关键是判断它是不是以 “.java” 结尾的;判断邮箱是否合法,至少要检查邮箱名中是否包含字符 ”@” 和 ”.” 并检查 ”@” 是否在 ”.” 之前。要解决这样的问题,就要使用String类提供的提取和搜索字符串的方法。根据不同的情况,可以选用不同的提取和搜索字符串的方法。

表15-1列出了 String类提供的一些常用的提取和查询方法

 

字符串是一个字符序列,每一个字符都有自己的位置,字符串事实上也是一个字符数组,因此它的位置从0开始到(字符串长度-1)结束,如图15.10所示,这是一个字符串"青春无悔",其中,"青"、"春"、"无"、"悔"的索引下标依次为0、1、2、3。

在表15-1中,前面四个方法的作用是执行搜索操作,后面三个方法用于提取字符或字符串

 

1. indexOf( )方法

该方法是在字符串内搜索某个指定的字符或字符串,它返回出现第一个匹配字符的位置。如果没有找到匹配,则返回-1。调用时,括号中写明要搜索的字符(或字符串)的名字。例如,搜索字符串 "青春无悔" 中字符 "春" 的位置。

String s = "青春无悔";
int index = s.indexOf('');

执行后,返回字符 "" 的位置是1。

2. lastlndexOf( )方法

该方法也是在字符串内搜索某个指定的字符或字符串,但是它是搜索最后一个出现的字符(或字符串)的位置。例如,搜索字符串 "青春无悔无悔青春" 中最后出现字符串 "青春" 的位置。

String s = "青春无悔无悔青春";
int index = s.lastIndexOf("青春");

执行后,返回字符串 "青春" 的首字符位置,index的值为6。

3. substring(int index) 方法

该方法用于提取从位置索引开始的字符串部分,调用时括号中写的是要提取的字符串的开始位置,方法的返回值就是要提取的字符串。例如,要提取字符串 "青春无悔" 中的 "春无悔"。

String s = "青春无悔";
String result = s.substring(
1);

4. substring(int beginindex, int endindex) 方法

该方法用于提取位置beginindex和位置endindex位置之间的字符串部分。特别要注意的是,对于开始位置beginindex,Java是基于字符串的首字符为0来进行处理的,但是对于终止位置endindex,Java是基于字符串的首字符为1来处理的,如图15.11所示。

 

例如,要提取"青春无悔无悔青春"中的"无悔无悔"。

String s = "青春无悔无悔青春";
String result = s.substring(
2,6);

5. trim( )方法


该方法可以忽略字符串前后的空格,因此在实现图15.12所示的需求时使用。在接收用户输入的字符串时,一般会调用trim()方法过滤掉字符串前后的多余空格。

图15.12 trim()的用武之地

可见,要想在程序中处理好字符串,关键是将这些方法巧妙地结合起来,灵活运用。下面就来解决刚才提出的问题,如示例6所示。

示例6

package cn.jbit.classandobject;
import java.util.*;
public class Verify{
   
public static void main(String[] args) {
       
// 声明变量
       
boolean fileCorrect = false;   //标识文件名是否正确
       
boolean emailCorrect = false//标识E-mail是否正确
       
System.out.print("---欢迎进入作业提交系统---");
       
Scanner input = new Scanner(System.in);
       
System.out.println("请输入Java文件名: ");
       
String fileName = input.next();
       
System.out.print("请输入你的邮箱:");
       
String email = input.next();

       
//检查Java文件名
        
int index = fileName.lastIndexOf(".");  //"."的位置
       
if(index!=-1 && index!=0 &&
               
fileName.substring(index+1,
                       
fileName.length()).equals("java")){

            fileCorrect =
true;    //标识文件名正确
       
}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("作业提交失败!");
        }
    }
}


示例6的运行结果如图15.13所示。

图15.13示例6的运行结果

判断Java文件名是否有效时,使用的判断条件如下。

index!=-1 && index!=0 &&
       
fileName.substring(index+1,
               
fileName.length()).equals("java")

index是字符 "." 在字符串中的位置,条件 "index!=-1 && index!=0" 是指字符串中包含点号并且点号不在首位。除此之外,通过substring方法获得字符后的字符串,然后判断是否是 "java",只有三个条件全部满足,才是合法的文件名。在判断邮箱名时,检查是否包含字符 "@",是否包含字符 "." 并且检查字符 "@" 是否在字符 "." 的前面。

2.3字符串的拆分

字符串的拆分在实际应用中也是经常用到的。

问题:有一段歌词,每句都以空格“”结尾,请将歌词的每句按行输出,效果如图15.14所示。

图15.14字符串的拆分

分析:要实现这个需求,只要将每句歌词按照空格“ ”拆分即可。 Java 的 String 类提供了一个拆分字符串的方法 split(), 将一个字符串分割为子字符串,结果作为字符串数组返回。

语法:

字符串  1. split (String separator, int limit);

其中:

(1) separator 可选项,标识拆分字符串时使用一个或多个字符。如果不选择该项,则返回包含该字符串所有单个字符的元素数组。

(2) limit 可选项,该值用来限制返回数组中的元素个数。

示例7

package cn.jbit.classandobject;
public class Lyric {
   
/**
     *
拆分歌词
    
*
     */
   
public static void main(String[] args) {
       
String words="长亭外 古道边 芳草碧连天 晚风扶 柳笛声残 夕阳山外山";
       
String[] printword=new String[100];//接收数组
       
System.out.println("***原歌词格式***\n"+words);
       
System.out.println("\n***拆分后歌词格式***");
        printword=
words.split(" ");//按照空格进行拆分
       
for(int i=0;i<printword.length;i++){
           
System.out.println(printword[i]);//打印输出
       
}
    }
}

运行示例 7, 效果如图 15.14 所示。

经验:

String 类操作字符串的方法很多,本章讲解了一些常见的方法,大家如果还想更深入地了解这些方法的用法,或者在实际开发中需要使用的方法本章没有讲解,可以通过查看 Java API 帮助文档,进行深入学习。

3 String Buffer

在 Java 中,除了使用 String 类存储字符串之外,还可以使用 StringBuffer 类存储字符串。StringBuffer也是 Java 开发人员给我们提供的用于处理字符串的一个类,而且它是比 String 类更高效的存储字符串的一种引用数据类型。特别是对字符串进行连接操作时,使用 StringBuffer 类可以大大提高程序的执行效率。

3.1 如何使用 StringBuffer 类

StringBuffer 类位于 java.lang 包中,是 String 类的增强类。使用 StringBuffer 类也需要两步完成。

1. 声明 StringBuffer 对象并初始化

//声明一个空的 StringBuffer 对象

StringBuffer sbl = new StringBuffer();

//声明一个字符串”青春无悔”

StringBuffer sb2 = new StringBuffer ("青春无悔”);

2. 使用 StringBuffer 对象

StringBuffer 类提供了很多方法以供使用,调用时使用操作符完成。

3.2 常用的 StringBuffer 类方法

下面介绍几个比较常用的 StringBuffer 类提供的方法。

语法:

字符串 1.toString();

将 StringBuffer 类型的字符串 1 转换为 String 类型的对象并返回。

例如:

String s1 = sb2.toString();

语法:

字符串 1. append(字符串 2);

将字符串 2 连接到字符串 1 后并返回。

该方法和 String 类的 concat()方法一样,都是把一个字符串追加到另一个字符串后面,所不同的是 String 中只能将 String 类型的字符串追加到一个字符串后,而 StringBuffer 可以将任何类型的值追加到字符串之后。

示例8

package cn.jbit.classandobject;

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);
    }
}


运行示例 8, 运行结果如图 15.17 所示。

图 15.17 示例 8 的运行结果

语法:

字符串 1.insert位置,参数);

将参数插入字符串 1 的指定位置(int 类型)后并返回。参数可以是包括 String 的任何类型。


问题:编写一个方法,实现将一个数字字符串转换成逗号分隔的数字串,即从右边开始每三个数字用逗号分隔,运行结果如图 15.18 所示。

图 15.18 用逗号分隔字符串

分析:利用 StringBuffer 类的 length() 方法,获取数字串的长度,使用 for 循环从后向前每隔三位插入一个逗号。

示例9

package cn.jbit.classandobject;
import java.util.*;
public class TestInsert {
   
/**
     *
每隔三位插入逗号
    
*
     */
   
public static void main(String[] args) {
       
Scanner input = new Scanner(System.in);
       
//接收数字串,存放于StringBuffer类型的对象中
       
System.out.print("请输入一串数字: ");
       
String nums = input.next();
       
StringBuffer str=new StringBuffer(nums);
       
//从后往前每隔三位添加逗号
       
for(int i=str.length()-3;i>0;i=i-3){
           
str.insert(i,',');
        }
       
System.out.print(str);
    }
}

运行示例 9, 运行结果如图 15.18 所示

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值