第十章总结

一、String类

单个字符可以用char类型保存,多个字符组成的文本就需要保存在String对象中。String通常被称为字符串,一个String对象最多可以保存(2的32次方-1)个字节(占用4GB空间大小)的文本内容。

10.1.1声明字符串

在java语言中,字符串必须包含在一对双引号("  ")之内

"23.23"、"ABCD"、"你好"

以上这些都是字符串常量,字符串常量可以是 系统能够显示的任何文字信息,甚至可以是单个字符 

在Java中由双引号("  ")包围的都是字符串,不能作为其他数据类型来使用,如"1+2"的输出结果不可能为3

可以通过以下语法格式来声明字符串变量:

String str;

String:指定该变量为字符串类型

str:任意有效的标识符,表示字符串变量的名称

声明字符串变量s

String s; 

声明的字符串变量必须经过初始化才能使用,否则 编译器会报出"变量未被初始化错误"

10.1.2创建字符串

在Java语言中,将字符串作为对象来处理,因此可以将创建其他类对象一样来创建字符串对象。

 创建对象要使用类的构造方法。String类的常用构造方法如下。

1.String(char a[])

该方法用一个字符数组a创建String对象,代码如下:

char a[] = {'g','o','o','d'};    String s = new String(a);    等价于 String s = new String("good")

2.String(char a[], int offset, int length)

该方法提取字符数组a中的一部分创建一个字符串对象。参数offset表示开始截取字符的位置,length表示截取字符串的长度。代码如下:

char a[] = {'s','t','u','d','e','n','t'}; String s = new String(a,2,4); 等价于String s = new String("uden")

3.String(char[] value)

该构造方法可分配一个新的String对象,使其表示字符数组参数中所有元素连接的结果。代码如下:

char a[] = {'s','t','u','d','e','n','t'} ; String s = new String(a);  等价于String s = new String("student")

还可以通过将字符串常量的引用赋值给一个字符串变量来创建字符串。代码如下:

String str1,str2 ;

str1 = "We are students"

srt2 = "We sre students"

此时,str1与str2 引用相同的字符串常量,因此具有相同的实体,内存示意如下:

str1==We are student;

str2==We are student;

二、连接字符串

对于已经声明的字符串,可以对其进行相应的操作,连接字符串就是字符操作中较简单的一种,可以对多个字符串进行连接,也可使字符串与其他数据进行连接。

10.2.1连接多个字符串

使用"+"运算符可以实现连接多个字符串的功能。"+"运算符可以连接多个String对象并产生一个新的String对象。

【例10.1】先连接一副对联的上、下联,再分行输出在控制台上

package Package10;

public class Join {//创建类

	public static void main(String[] args) {//主方法
		String s1 = new String("春色绿千里");//声明String对象s1
		String s2 = new String("马蹄香万家");//声明String对象s2
		String s = s1 + "\n" + s2;//将对象s1、"\n"和对象s2连接并将结果赋值给s
		System.out.println(s);//将s输出

	}

}

 结果

第十章总结_第1张图片

 10.2.2连接其他数据类型

字符串也可同其他基本数据类型进行连接。如果将字符串同其他数据类型进行连接,会将其他数据类型的数据直接转换成字符串。

【例10.2】统计每天的阅读和上机时间

package Package10;

public class Link {//创建类

	public static void main(String[] args) {//主方法
		int booktime = 4;//声明的int型变量booktime
		float practice = 2.5f;//声明float型变量practice
		//将字符串与整型、浮点型变量相连,将结果输出
		System.out.println("我每天花费"+booktime+"小时看书;"+practice+"小时上机练习");

	}

}

 结果

第十章总结_第2张图片

 本实例实现的是字符串常量与整型变量booktime和浮点型变量practice相连后的结果输出。在这里booktime和practice都不是字符串,当它们与字符串相连接时会自动调用toString()方法并转换成字符串形式,然后参与字符串连接。

误区警告:只要"+"运算符的一个操作数是字符串,编译器就会将另一个操作数转换成字符串形式,所以应谨慎地将其他数据类型的数据与字符串相连,以免出现意想不到的结果

三、获取字符串信息

字符串作为对象,可通过相应方法获取字符串的有效信息,如获取某字符串的长度、某个索引位置的字符等。

10.3.1获取字符串长度

使用String类的length()方法可获取声明变量的字符串对象的长度。语法如下:

str.length(); 

其中,str为字符串对象。

获取字符串长度,代码如下:

String str = "We are student";

int size = str.length(); 

上代码是将字符串str的长度赋值给int型变量size,此时变量size的值为15,这表示length()方法返回的字符串的长度(包括字符串的空格) 。

10.3.2字符串查找

String类提供了两种查找字符串的方法,即indexOf()与lastIndexOf()方法。这两种方法都允许在字符串中搜索指定条件的字符或字符串。indexOf()方法返回的时搜索的字符或字符串首次出现的位置,lastIndexOf()方法返回的是字符或字符串最后一次出现的位置。

1.indexOf(String s)

该方法用于返回参数字符串s在指定字符串中首次出现的索引位置。当调用String类的indexOf'()方法时,会从当前字符串的开始位置搜索s的位置。如果没有检索到字符串s,该方法的返回值是-1,语法如下:

str.indexOf(substr)

str:任意字符串对象。

substr:要搜索的字符串。

查找字符a在字符串str中的索引位置,代码如下:

String str = "We are sudente";

int size = str.indexOf("a");                    //变量size的值是3 

 在Java语言中,String对象是用数组表示的。字符串的下标是0~length()-1。因此,字符串"We are students"的下标

2.lastlndexOf(String str)

该方法用于返回指定字符串最后一次出现的索引位置。当调用String类的lastlndecOf()方法时,会从当前字符串的开始位置检索参数字符串str,并将最后一次出现str的索引位置返回。如果没有索引到字符串str,该方法

返回-1。语法如下:

str.lastIndexOf(substr)

str:任意字符串对象。

substr:要搜索的字符串。

说明:如果lastIndexOf()方法中的参数是空字符串""(注意g),则返回的结果与调用length()方法的返回结果相同。

【例10.3】用两种方式判断字符串的长度

package Package10;

public class Text {//创建类

	public static void main(String args[]) {//主方法
		String str = "We are students";//定义字符串str
		int size = str.lastIndexOf("");//将空字符串str中的索引位置赋值给变量size
		System.out.println("空字符串在字符串str中的索引位置是:"+size);//将变量size输出
		System.out.println("字符串str的长度是:"+str.length());//将字符串str的长度输出

	}

}

结果:

第十章总结_第3张图片

 10.3.3获取指定索引位置的字符

使用charAt()方法可将指定索引处的字符返回。语法如下:

str.charAt(int index)

str:任意字符串。

index:任意值,用于指定要返回字符串的下标。

【例10.4】查看指定索引位置上的字符

package Package10;

public class Ref {//创建类

	public static void main(String args[]) {//主方法
		String str = "hello world";//定义字符串str
		char mychar = str.charAt(6);//将字符串str中索引位置是6的字符返回
		System.out.println("字符串str中索引位置是6的字符为:"+mychar);//输出信息

	}

}

结果:

第十章总结_第4张图片

 四、字符串操作

Sstring类中包含了很多方法,允许程序员对字符串进行操作来满足实际的編程中的需要。

10.4.1获取子字符串

通过String类的substring()方法可对字符串进行截取。substring()方法被两种不同的重载形式,来满足不同的需要。这些形式的共同点就是都利用字符串的下标进行截取,且应明确字符串下标是从0开始的。

1.substring(int benginIndex)

该方法返回的是指定的索引位置开始截取直到该字符串结尾的子串。语法如下:

str.substring(int benginIndex)

其中,benginIndex指定从某一索引处开始截取字符串。

截取字符串,代码如下:

String str = "Hello World";      //定义字符串str

String substr = str.substring(3);       //获取字符串,此时substr值为lo world

 误区警示:在字符串中,空格占用一个索引位置。

2.substring(int benginIndex,int endIndex)

该方法返回的是从字符串某一索引位置开始截取至某一索引位置结束的子串。语法如下:

substring(int beginIndex,int endIndex)

beginIndex :开始截取子字符串的索引位置。

endIndex:子字符串在整个字符串中的结束位置。

【例10.5】《将进酒》的作者是哪位诗人?

package Package10;

public class Subs {//创建类

	public static void main(String args[]) {//主方法
		String str = "《将进酒》:李白(唐)";//定义的字符串
		String substr = str.substring(6,8);//对字符串进行截取
		System.out.println("《将进酒》的作者是"+substr);//输出截取后的字符串

	}

}

结果:

第十章总结_第5张图片

 10.4.2去除空格

trim()方法返回字符串的副本,忽略前导空格和尾部空格。语法如下:

str.trim()

 其中,str为任意字符串对象。

【例10.6】去掉字符串首、尾的空格

package Package10;

public class Blak {//创建类

	public static void main(String args[]) {//主方法
		String str = "   java     class     ";//定义i字符串str
		System.out.println("字符串原来的长度:"+str.length());//将str原来的长度输出
		//将str去掉前导和尾部的空格后的长度输出
		System.out.println("去掉空格后的长度:"+str.trim().length());

	}

}

结果:

第十章总结_第6张图片

 10.4.3字符替换

replace()方法可实现将指定的字符或字符串替换成新的字符或字符串。语法如下:

str.replace(CharSequence target,CharSequence replacement)

target:要替换的字符或字符串。

replacement:用于替换原来字符串的内容。

replace()方法返回的结果是一个新的字符串。如果字符或字符串oldChar没有出现在该对象表达式中的字符串序列中,则将原字符串返回。

【例10.7】将单词中的字母a替换成字母A

package Package10;

public class NewStr {//创建类

	public static void main(String args[]) {//主方法
		String str = "address";//定义字符串str
		String newstr = str.replace("a","A");//将str中的"a"替换成"A"并返回新字符串newstr
		System.out.println(newstr);//将字符串newstr输出

	}

}

 结果:

第十章总结_第7张图片

说明:如果要替换oldChar在字符串中重复出现多次,replace()方法会将所有oldChar全部替换成newChar。例如:

String str = "java project";

String newstr = str.replace("j","J");

此时,newstr的值为Java proJect。

需要注意的是,要替换的字符oldChar的大小写要与原字符串中字符串的大小写保持一致,否则不能成功地替换。例如,上面的实例如果写成如下语句,则不能 成功替换:

String str = "java project";

String newstr = str.replace("P","t");

 10.4.4判断字符串的开始和结尾

starts With()方法与ends With()方法分别用于判断是否以指定的内容开始或结束。这两个方法的返回值都为boolean类型。

1.startsWith()方法

该方法用于判断当前字符串对象的前缀是否为参数指定的字符串。语法如下:

str.startsWith(String prefix)

其中,prefix是指作前缀的字符串。

2.endsWith()方法

该方法用于判断当前字符串是否为给定堵塞子字符串结束。语法如下:

str.endsWith(String suffix)

其中,suffix是指作为前缀的字符串。

【例10.8】判断字符串是否为以给定的内容开始或结束

package Package10;

public class StartOrEnd {//创建类

	public static void main(String args[]) {//主方法
		String num1 = "22045612";//定义字符串num1
		String num2 = "21304578";//定义字符串num2
		boolean b = num1.startsWith("22");//判断字符串num1是否以‘22’开头
		boolean b2 = num2.startsWith("78");//判断字符串num2是否以‘78’结束
		System.out.println("字符串num1是以‘22’开始的吗?"+b);
		System.out.println("字符串num2是以‘78’结束的吗?"+b2);//输出信息

	}

}

结果:

 第十章总结_第8张图片

10.4.5判断字符串是否相等

对字符串对象进行比较不能简单地使用比较运算符”==“,因为比较运算符比较的是两个字符串的地址是否相同。即使两个字符串的内容相同,两个对象的内存地址也是不同的,使用比较运算符仍会返回false。使用比较运算符比较两个字符串。代码如下:

String tom = new String("I am a student");

String jerry = new String("I am a student");

boolean b = (tom == jerry):

此时,布尔型变量b的值为false,因为字符串是对象,tom、Jerry是引用,内存如下示:

tom ————I am a student

Jerry————I am a student

因此,要比较两个字符串内容是否相等,应使用equals()方法和equalsIgnoreCase()方法。

 1.equals()方法

 如果两个字符串具有相同的字符和长度,则使用equals()方法进行比较时,返回true。否则,返回false。语法如下:

str.equals(String otherstr)

其中,str、otherstr是要比较的两个字符串对象。

2.equalsIgnoreCase ()方法

使用equals()方法对字符串进行比较时是区分大小写的,equalsIgnoreCase()方法是在忽略了大小写的情况下比较两个字符串是否相等,返回结果仍为boolean类型。语法如下:

str.equalsIgnoreCase(String otherstr)

其中, str、otherstr是要比较的两个字符串对象。

通过下面的例子可以看出equals()方法和equalsIgnoreCase()方法的区别。

【例10.9】判断”abc“与”ABC“是否相等

package Package10;

public class Opinion {//创建类

	public static void main(String args[]) {//主方法
		String s1 = new String("abc");//创建字符串对象s1
		String s2 = new String("ABC");//创建字符串对象s2
		boolean b = s1.equals(s2);//使用equals()方法比较s1与s2
		boolean b2 = s1.equalsIgnoreCase(s2);//使用equalsIgnoCase()方法比较s1与s2
		System.out.println(s1 + "equals" + s2 + ":" + b);//输出信息
		System.out.println(s1 + "equalsIgnoreCase" + s2 + ":" + b2);
	}

}

结果:

第十章总结_第9张图片

10.4.6按字典顺序比较两个字符串

compareTo()方法为按字典顺序比较两个字符串,该比较基于字符串中各个字符的Unicode值,按字典顺序将String对象的字符序列与参数字符串所表示的字符序列进行比较。如果按字典顺序此String对象位于参数字符串之前,则比较结果为一个负整数:如果按字典顺序此String对象位于参数字符串之后,则比较结果为一个正整数:如果这两个字符串相等,则结果为0。语法如下:

str.compareTo(String otherstr) 

其中,  str、otherstr是要比较的两个字符串对象。

说明:compareTo()方法只有在equals(Object)方法返回true是才返回0.

【例10.10】判断字母b的位置

package Package10;

public class Wordbook {//创建类

	public static void main(String args[]) {//主方法
		String str = new String("b");//用于比较的字符串
		String str2 = new String("a");//用于比较的字符串
		String str3 = new String("c");//用于比较的字符串
		System.out.println(str + "compareTo " + str2 + ":" + str.compareTo(str2));//将str与str2比较的结果输出
		System.out.println(str + "compareTo " + str3 + ":" + str.compareTo(str3));//将str与str3比较的结果输出

	}

}

结果:

 第十章总结_第10张图片

 10.4.7字母大小写转换

String类的toLowerCase()方法可将字符串中的所有大写字母改写为小写字母,而toUpperCase()方法可将字符串中的所有小写字母改写为大写字母。

1.toLowerCase()方法

该方法将字符串中的所有大写字母转换为小写。如果字符串中没有应该被转换的字符,则将原字符串返回:否则将 返回一个新的字符串,将原字符串中每个大写字母都转换成小写,字符串长度不变。语法如下:

str.toLowerCase()

 其中,str是要进行转换的字符串。

2.toUpperCase()方法

该方法将字符串中的所有小写字母转换为大写。如果字符串中没有应该被转换的字符,则将原字符串返回:否则将返回一个新字符串,将原字符串中每个小写字母都转换成大写,字符串长度不变。语法如下:

str.toUpperCase()

其中,str是要进行转换的字符串。

说明:使用toLowerCase()方法和toUpperCase()方法进行大小写转换时,数字或其他非英文文字母类字符不受影响。

【例10.11】字母大小写转换

package Package10;

public class UpAndLower {//创建类

	public static void main(String args[]) {//主方法
		String str = new String("Oh My God");//创建字符串str
		String newstr = str.toLowerCase();//使用toLowerCase()方法实行小写转换
		String newstr2 = str.toUpperCase();//使用toUpperCase()方法实行大写转换
		System.out.println(newstr);//将转换后的结果输出
		System.out.println(newstr2);

	}

}

 结果:

第十章总结_第11张图片

10.4.8字符串分割 

使用split()方法可以是字符串按指定的分割字符或字符串进行分割,并将分割后的结果存放在字符串数组中。split()方法提供了以下两种字符串分割形式。

1.split(String sign)

该方法可根据给定的分割符对字符串进行拆分。语法如下:

str.split(String sign)

 其中,sign为分割字符串的分割符,也可以的使用正则表达式。

说明:没有统一的对字符进行分割的符号。如果想定义多个分割符,可使用符号”|“。例如,”,=“表示分割符分别为”|“和”,=“。

2.split(String sign,int limit)

sign:分割字符串的分割符,也可以使用正则表达式。

limit:限制的分割次数。

【例10.12】按要求分割”192.168.0.1“

package Package10;

public class Division {

	public static void main(String[] args) {
		String str = "192.168.0.1";//创建字符串
		String[] firstArray = str.split("\\.");//按照“.”进行分割,使用转义字符“\\.”
		String[] secondArray = str.split("\\.",2);//按照“.”进行两次分割,使用转义字符“\\.”
		System.out.println("str的原值为:["+str+"]"); //输出 str 原值
		System.out.print("全部分割的结果:");//输出全部分割的结果
		for(String a : firstArray) {
			System.out.print("["+a+"]");
		}
		System.out.println();//换行
		System.out.print("分割两次的结果:");//输出分割两次的结果
		for(String a : secondArray) {
			System.out.print("["+a+"]");
		}
		System.out.println();
	}

}

 结果:

第十章总结_第12张图片

 五、格式化字符串

String 类的静态 format0方法用于创建格式化的字符串。format0方法有两种重载形式。

1. format(String format,Object...args)

该方法使用指定的格式字符串和参数返回--个格式化字符串,格式化后的新字符串使用本地默认的语言环境。语法如下:

str.format(String format,Object...args) 

 format:格式字符串。

args: 格式字符串中由格式说明符引用的参数。如果还有格式说明符以外的参数,则忽略这些额外的参数。此参数的数自是可变的,可以为 0。

2. format(Local l,String format,Object...args)

该方法使用指定的语言环境、格式字符串和参数返回一个格式化字符串,格式化后的新字符串使用其指定的语言环境。语法如下:

str.format(Local l,String format,Object...args)

 1: 格式化过程中要应用的语言环境。如果1为 null,则不进行本地化。

format:格式字符串。

args: 格式字符串中由格式说明符引用的参数。如果还有格式说明符以外的参数,则忽略这些额外的参数。此参数的数目是可变的,可以为 0。

10.5.1日期和时间字符串格式化

在应用程序设计中,经常需要显示日期和时间。如果想输出满意的日期和时间格式,一般需要编写大量的代码、经过各种算法才能实现。fomat0方法通过给定的特殊转换符作为参数来实现对日期和时间的格式化。

 1.日期格式化

先来看一个例子。返回一个月中的天数,代码如下:

Date date = new Date():       //创建 Date 对象 date

String s = String.format("%te", date);       //通过 format()方法对 date 进行格式化

 上述代码中变量。的值是当前日期中的天数,如今天是 15号,则 s的值为 5;te 是转换符。常用的日期格式化转换符如表 10.1 所示。

第十章总结_第13张图片

【例10.13】按照格式输出今天的年、月、日  

package Package10;

import java.util.Date;//导入java.util.Date 类

public class Eval {//新建类

	public static void main(String[] args) {//主方法
		Date date = new Date();//创建 Date 对象 date
		String year = String.format("%ty", date);//将 date 进行格式化
		String month = String.format("%tB", date);
		String day = String.format("%td", date);
		System.out.println("今年是:"+ year +"年");//输出信息
		System.out.println("现在是:"+ month);
		System.out.println("今天是:"+ day +"号");
	}

}

 结果:

第十章总结_第14张图片

 2.时间格式化

使用 format0方法不仅可以完成日期的格式化,也可以实现时间的格式化。时间的格式化转换符要比日期的格式化转换符更多、更精确,它可以将时间格式化为时、分、秒、毫秒等。格式化时间的转换符如表 10.2 所示。

第十章总结_第15张图片

 【例10.14】按照格式输出当下的时、分、秒

package Package10;

import java.util.Date;//导入 java.util.Date 类

public class GetDate {//新建类

	public static void main(String[] args) {//主方法
		Date date = new Date();//创建 Date 对象 date
		String hour = String.format("%tH", date);//将 date 进行格式化
		String minute = String.format("%tM", date);
		String second = String.format("%tS", date);
		System.out.println("现在是:"+ hour +"时"+ minute +"分"+ second +"秒");//输出的信息
	}

}

结果:

第十章总结_第16张图片 3.格式化常见的日期时间组合

 格式化日期与时间组合的转换符定义了各种日期时间组合的格式,其中最常用的如表 10.3 所示:

第十章总结_第17张图片

 【例 10.15】按照格式输出当下的年、月、日

package Package10;

import java.util.Date;//导入java.util.Date类

public class DateAndTime {//创建类

	public static void main(String[] args) {//主方法
		Date date = new Date();//创建 Date 对象 date
		String time = String.format("%tc", date);//将 date 格式化
		String form = String.format("%tF", date);
		System.out.println("全部的时间信息是:"+ time);//将格式化后的日期时间输出
		System.out.println("年-月-日格式:"+form);

	}

}

 结果:

第十章总结_第18张图片

 10.5.2常规类型格式化

常规类型格式化可应用于任何参数类型,可通过如表 10.4所示的转换符来实现。

第十章总结_第19张图片

 【例10.16】使用转换符获取表达式的结果

package Package10;

public class General {//新建类

	public static void main(String[] args) {//主方法
		String str = String.format("%d", 400 / 2);//将结果以十进制格式显示//将结果以 boolean 型显示//将结果以十六进制格式显示
		String str2 = String.format("%b", 3 > 5);//将结果以 boolean 型显示//将结果以十六进制格式显示
		String str3 = String.format("%x", 200);//将结果以十六进制格式显示
		System.out.println("400 的一半是:"+ str);//输出格式化字符串
		System.out.println("3>5 正确吗:"+ str2);
		System.out.println("200 的十六进制数是:"+ str3);
		
	}

}

结果:

第十章总结_第20张图片 六、使用正则表达式

正则表达式通常被用于判断语句中,用来检查某一字符串是否满足某一格式。正则表达式是含有一些具有特殊意义字符的字符串,这些特殊字符称为正则表达式的元字符。例如,“\\d”表示数字0~9中的任何一个,“\d”就是元字符。正则表达式中的元字符及其意义如表 10.5 所示。

第十章总结_第21张图片

 说明:在正则表达式中,“.”代表任何一个字符,因此在正则表达式中如果想使用普通意义的点字符“.”,,必须使用转义字符“\”。

在正则表达式中,可以使用方括号括起若干个字符来表示一个元字符,该元字符可代表方括号中的任何一个字符。例如,reg ="[abc]4",这样字符串 a4、b4、c4 都是和正则表达式匹配的字符串。方括号元字符还可以为其他格式。如:

 [^456]:代表 4、5、6之外的任何字符。

[a-r]:代表 a~r 中的任何一个字母。

[a-zA-Z]: 可表示任意一个英文字母。

[a-e[g-z]]: 代表 a~e或 g~z 中的任何一个字母 (并运算)

 [a-o&&[defl:代表字母 d、e、f(交运算)。

 [a-d&&[^bc]l: 代表字母 a、d (差运算)。

在正则表达式中允许使用限定修饰符来限定元字符出现的次数。例如,“A*”代表 A 可在字符串中出现0次或多次。限定修饰符的用法如表 10.6 所示。

第十章总结_第22张图片

 【例10.17】验证E-mail地址是否“合法”

package Package10;

public class Judge {											//新建类
	public static void main(String[] args) {					//主方法
		String regex = "\\w+@\\w+(\\.\\w{2,3})*\\.\\w{2,3}";	
		//定义要匹配E-mail地址的正则表达式
		String str1 = "aaa@";									//定义要进行验证的字符串
		String str2 = "aaaaa";
		String str3 = "[email protected]";
		if(str1.matches(regex)) {		
			//判断字符串变量是否与正则表达式匹配
			System.out.println(str1+"是一个合法的E-mail地址格式");
		}
		if(str2.matches(regex)) {
			System.out.println(str2+"是一个合法的E-mail地址格式");
	}
		if(str3.matches(regex)) {
			System.out.println(str3+"是一个合法的E-mail地址格式");
	}

	}
}

 结果:

第十章总结_第23张图片

正则表达式分析:
通常情况下 E-mail 的格式为“[email protected]”字符 X 表示任意的一个或多个字符,@为 E-mai地址中的特有符号,符号@后还有一个或多个字符,之后是字符“.com”,也可能后面还有类似“.cn”的标记。总结 E-mail 地址的这些特点,可以写正则表达式“\\w+@\\w+\\w2.3)w{2.3}”来匹配 E-mail 地址。字符集“\\ w”匹配任意字符符号“+”表示字符可以出现 1 次或多次,表达式“(\\.\\w{2,3})*”表示形如“.com”格式的字符串以出现 0 次或多次。而最后的表达式“\\.\\w{23}”用于匹配 E-mail 地址中的结尾字符,如“.cn”。 

 七、 字符串生成器

创建成功的字符串对象,其长度是固定的,内容不能被改变和编译。虽然使用“+”可以达到附加新字符或字符串的目的,但“+”会产生一个新的 String 实例,会在内存中创建新的字符串对象。如重复地对字符串进行修改,将极大地增加系统开销。而JDK 新增了可变的字符序列 StringBuilder类.大大提高了频繁增加字符串的效率。

【例10.18】效率比拼

package Package10;
	public class Jerque{//新建类
		public static void main(String[] args){//主方法
		String str = "";//创建空字符串
		long starTime = System.currentTimeMillis();//定义对字符串执行操作的起始时间
		for (int i= 0;i< 10000; i++){//利用 for 循环执行10000 次操作
		str = str + i;//循环追加字符串
		}
		long endTime = System.currentTimeMillis();//定义对字符串操作后的时间
		long time = endTime - starTime;//计算对字符串执行操作的时间
		System.out.println("String 消耗时间:"+time);//将执行的时间输出
		StringBuilder builder = new StringBuilder("");//创建字符串生成器
		starTime = System.currentTimeMillis();//更新操作执行前的时间
		for (int i= 0;i< 10000; i++){//利用 for 循环进行操作
		builder.append(i);//循环追加字符
		}
		endTime = System.currentTimeMillis();//更新操作后的时间//将操作时间输出
		time = endTime - starTime;//更新追加操作执行的时间
		System.out.println("StringBuilder 消耗时间:"+ time);//将操作时间输出

	}

}

 结果:

第十章总结_第24张图片

 通过这一实例可以看出,两种操作执行的时间差距很大如果在程序中频繁地附加字符串,建议使用 StringBuilder 类新创建的 StringBuilder 对象初始容量是16个字符,可以自行指定初始长度。如果附加的字符超过可容纳的长度,则StringBuilder 对象将自动增加长度以容纳被附加的字符。若要使用 StringBuilder 类最后输出字符串结果,可使用 toString0方法。利用 StringBuilder 类中的方法可动态地执行添加、删除和插入等字符串的编辑操作。该类的常用方法如下。

1.append()方法
该方法用于向字符串生成器中追加内容。通过该方法的多个重载形式,可实现接受任何类型的数据,如 int、boolean、char、String、double 或者另一个字符串生成器等。语法如下:

append(content)

 其中,content 表示要追加到字符串生成器中的内容,可以是任何类型的数据或者其他对象
2.insert(int offset, arg)方法
该方法用于向字符串生成器中的指定位置插入数据内容。通过该方法的不同重载形式,可实现向字符串生成器中插入 int、flat、char 和 boolean 等基本数据类型的数据或其他对象。语法如下:

insert(int offset arg)

  offset: 字符串生成器的位置。该参数必须大于等于 0,且小于等于此序列的长度。

arg: 将插入至字符串生成器的位置。该参数可以是任何数据类型的数据或其他对象向字符串生成器中指定的位置添加字符,代码如下:

StringBuilde bf=newStringBuilder("hello");//创建字符生成器

bf.insert(5,"world");//添加至字符生成器的位置及内容

System.out.println(bf.toString());//此时输出信息为 helloworld

 3,delete(int start , int end)方法
移除此序列的子字符串中的字符。该子字符串从指定的 start 处开始,一直到索引 end-1 处的字符。如果不存在这种字符,则一直到序列尾部。如果 start 等于 end,则不发生任何更改。语法如下:

delete(int start , int end)

  start:将要删除的字符串的起点位置。

end:将要删除的字符串的终点位置。

删除指定位置的子字符串,代码如下:

 StringBuilder bf = new StringBulder("StringBuilder");//创建字符串生成器 

bf.delete(5,10)://删除的子字符串

System.out.println(bf.toString());//此时输出的信息为Strinder

说明:想要了解更多 StringBuilder 类的方法,可查询java.lang.StringBuilder 的 API说明

你可能感兴趣的:(java,jvm,开发语言)