Java 字符串 2

简介: Java 字符串

2 复杂的字符串处理

2.1字符串的连接


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

b3d2d0d0b54a4bb5b758d1e102dee325.png


分析:使用前面已经学过的输出语句可以直接按照图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类提供的一些常用的提取和查询方法


e6c9edad6325403c995405d724a1aed2.png



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


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


24e8aab119964fe7af8cca578e1b8e52.png



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所示。


322c4b67d21345d093732dc2862df784.png



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


String s = "青春无悔无悔青春";

String result = s.substring(2,6);


5. trim( )方法

6f88aa5c5cf94c06867ab9a2ad18cb5b.png

该方法可以忽略字符串前后的空格,因此在实现图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("作业提交失败!");

       }

   }

}


6f8b51dc91f546bb95fe2c944cca0250.png

示例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所示。


12ab6609dc27432bb2a137a49d4f9448.png


图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 所示。


bea56c53b16a4603ad5f4584374f1361.png


图 15.17 示例 8 的运行结果


语法:


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


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



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

22de7b04813f4cb390a67233346cda5c.png



图 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 所示

目录
相关文章
|
19天前
|
SQL Java 索引
java小工具util系列2:字符串工具
java小工具util系列2:字符串工具
135 83
|
4月前
|
安全 Java API
【Java字符串操作秘籍】StringBuffer与StringBuilder的终极对决!
【8月更文挑战第25天】在Java中处理字符串时,经常需要修改字符串,但由于`String`对象的不可变性,频繁修改会导致内存浪费和性能下降。为此,Java提供了`StringBuffer`和`StringBuilder`两个类来操作可变字符串序列。`StringBuffer`是线程安全的,适用于多线程环境,但性能略低;`StringBuilder`非线程安全,但在单线程环境中性能更优。两者基本用法相似,通过`append`等方法构建和修改字符串。
74 1
|
1月前
|
存储 安全 Java
Java零基础-字符串详解
【10月更文挑战第18天】Java零基础教学篇,手把手实践教学!
105 60
|
19天前
|
Java 数据库
java小工具util系列1:日期和字符串转换工具
java小工具util系列1:日期和字符串转换工具
51 26
|
23天前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
42 8
|
1月前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
47 6
|
2月前
|
Java 数据库
案例一:去掉数据库某列中的所有英文,利用java正则表达式去做,核心:去掉字符串中的英文
这篇文章介绍了如何使用Java正则表达式从数据库某列中去除所有英文字符。
56 15
|
2月前
|
Java
JAVA易错点详解(数据类型转换、字符串与运算符)
JAVA易错点详解(数据类型转换、字符串与运算符)
53 4
|
3月前
|
Java 数据库
java小工具util系列1:日期和字符串转换工具
java小工具util系列1:日期和字符串转换工具
55 3