目录
一、String类
单个字符可以用char类型保存,多个字符组成的文本需要保存在String对象中。String通常被称为字符串,一个String对象最多可以保存个字节(占用4GB空间大小)的文本内容。
1.1 声明字符串
在Java语言中,字符串必须包含在一对双引号("")之内。例如:
"23.23"、"ABCDE"、"你好"
以上这些都是字符串常量,字符串常量可以是系统能够显示的任何文字信息,甚至可以是单个字符。
在Java中由双引号("")包围的都是字符串,不能作为其他数据类型来使用,如“1+2”的输出结果不可能是3。
可以通过以下语法格式来声明字符串变量:
String str;
声明的字符串变量必须经过初始化才能使用,否则编译器会报出“变量未被初始化错误”。
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类的构造方法来创建字符串变量之外,还可以通过字符串常量的引用赋值给一个字符串变量来创建字符串。代码如下:
String str1,str2;
str1="We are students";
str2="We sre students";
二、连接字符串
对于已声明的字符串,可以对多个字符串进行连接,也可使字符串与其他数据类型进行连接。
2.1 连接多个字符串
使用“+”运算符可以实现连接多个字符串的功能。“+”运算符可以连接多个String对象并产生一个新的Srting对象。
package haha;
public class computer{
public static void main(String[] args) {
String s1=new String("春色绿千里");
String s2=new String("马蹄香万家");
String s=s1+"\n"+s2;
System.out.println(s);
}
}
2.2 连接其他数据类型
字符串也可同其他数据类型进行连接。如果将字符串同其他数据类型数据进行连接,会将其他数据类型的数据直接转换成字符串。
package haha;
public class computer{
public static void main(String[] args) {
int booktime=4;
float practice=2.5f;
System.out.println("我每天花费"+booktime+"小时看书;"+practice+"小时上机练习");
}
}
package haha;
public class computer{
public static void main(String[] args) {
int booktime=4;
float practice=2.5f;
System.out.println("我每天花费"+booktime+"小时看书;"+(practice+booktime)+"小时上机练习");
}
}
圆括号的优先级最高,所以先被执行。
三、获取字符串信息
3.1 获取字符串长度
使用String类的length()方法可以获取声明的字符串对象的长度(包括字符串中的空格),语法如下:
str.length();
获取字符串长度,代码如下:
String srt="We are students";
int size=str.length();
3.2 字符串查找
String类提供了两种查找字符串的方法,即indexOf()和lastIndexOf()方法。这两种方法都允许在字符串中搜索指定条件的字符或字符串。indexOf()方法返回的是搜索的字符或字符串首次出现的位置,lastIndexOf()方法返回的是搜索的字符或字符串最后一次出现的位置。
1.indexOf(Srting s)
如果没有检索到字符串s,该方法的返回值是-1。语法如下:
str.indexOf(substr)
String str="We are students";
int size=str.indexOf("a"); //变量size的值是3
在Java语言中,String对象是用数组表示的,字符串下标是0~length()-1。
2.lastIndexOf(String str)
如果没有检索到字符串s,该方法的返回值是-1。语法如下:
str.lastIndexOf(substr)
如果lastIndexOf()方法中的参数是空字符串""(注意没有空格),则返回的结果与调用length()方法的返回结果相同。
package haha;
public class computer{
public static void main(String[] args) {
String str="We are students";
int size=str.lastIndexOf("");
System.out.println("空字符串在字符串str中的索引位置是:"+size);
System.out.println("字符串str的长度是:"+str.length());
}
}
3.3 获取指定索引位置的字符
使用charAt()方法可将指定索引处的字符返回,语法如下:
srt.charAt(int index)
package haha;
public class computer{
public static void main(String[] args) {
String str="hello world";
char mychar=str.charAt(6);
System.out.println("字符串str中索引位置是6的字符为:"+mychar);
}
}
四、字符串操作
4.1 获取字符串
通过String类的substring()方法可以对字符串进行截取。
1.substring(int beginIndex)
该方法返回的是从指定的索引位置开始截取直到该字符串结尾的子串。语法如下:
str.substring(int beginIndex)
String str="Hello world";
String substr=str.substring(3); //获取字符串,此时substr值为lo World
在字符串中,空格占用一个索引位置。
2.substring(int beginIndex,int endIndex)
该方法返回的是从字符串某一索引位置开始截取至某一索引位置结束的子串。语法如下:
substring(int beginIndex,int endIndex)
package haha;
public class computer{
public static void main(String[] args) {
String str="《将进酒》:李白(唐)";
String substr=str.substring(6,8);
System.out.println("《将进酒》的作者是"+substr);
}
}
4.2 去除空格
trim()方法返回字符串的副本,忽略前导空格和尾部空格,语法如下:
srt.trim()
package haha;
public class computer{
public static void main(String[] args) {
String str=" Java class ";
System.out.println("字符串原来的长度:"+str.length());
System.out.println("去掉空格后的长度:"+str.trim().length());
}
}
4.3 字符串替换
replace()方法可实现将指定的字符或字符串替换成新的字符或字符串,语法如下:
str.replace(CharAequence target,CharSequence replacement)
如果字符或字符串oldChar没有出现在该对象表达式中的字符串序列中,则将原字符串返回。
package haha;
public class computer{
public static void main(String[] args) {
String str="address";
String newstr=str.replace("a","A");
System.out.println(newstr);
}
}
如果要替换的字符oldChar在字符串中重复出现多次,replace()方法会将所有oldChar全部替换成newChar。
要替换的字符oldChar的大小写要与原字符串中字符的大小写保持一致。
4.4 判断字符串的开始与结尾
startsWith()方法与endsWith()方法分别用于判断字符串是否以指定的内容开始或结束。这两个方法的返回值都为boolean类型。
1.startsWith()方法
该方法用于判断当前字符串对象的前缀是否为参数指定的字符串。语法如下:
str.startsWith(String prefix)
2.endsWith()方法
该方法用于判断当前字符串是否为以给定的子字符串结束,语法如下:
str.endsWith(String suffix)
package haha;
public class computer{
public static void main(String[] args) {
String num1="22045612";
String num2="21304578";
boolean b=num1.startsWith("22");
boolean b2=num2.endsWith("78");
System.out.println("字符串num1是以‘22’开始的吗?"+b);
System.out.println("字符串num2是以‘78’结束的吗?"+b2);
}
}
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是引用。
要比较两个字符串内容是否相等,应使用equals()方法和equalsIgnoreCase()方法。
1.equals()方法
如果两个字符串具有相同的字符和长度,则使用equals()方法进行比较时,返回true。否则,返回false,语法如下:
str.equals(String otherstr)
2.equalsIgnoreCase()方法
使用equals()方法对字符串进行比较时是区分大小写的,而使用equalsIgnoreCase()方法是在忽略大小写的情况下比较两个字符串是否相等,返回结果仍为boolean类型,语法如下:
str.equalsIgnoreCase(String otherstr)
package haha;
public class computer{
public static void main(String[] args) {
String s1=new String("abc");
String s2=new String("ABC");
boolean b=s1.equals(s2);
boolean b2=s1.equalsIgnoreCase(s2);
System.out.println(s1+" equals "+s2+":"+b);
System.out.println(s1+" equalsIgnoreCase "+s2+":"+b2);
}
}
4.6 按字典顺序比较两个字符串
compareTo()方法为按字典顺序比较两个字符串,该比较基于字符串中各个字符的Unicode值,按字典顺序将String对象表示的字符序列与参数字符串所表示的字符序列进行比较。如果按字典顺序此String对象位于参数字符串之前,则比较结果为一个负整数;如果按字典顺序此String对象位于参数字符串之后,则比较结果为一个正整数;如果两个字符串相等,则结果为0。语法如下:
str.compareTo(String otherstr)
compareTo()方法只有在equals(Object)方法返回true时才返回0。
package haha;
public class computer{
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));
System.out.println(str+" compareTo "+str3+":"+str.compareTo(str3));
}
}
4.7 字母大小写转换
String类的toLowerCase()方法可将字符串中的所有大写字母改写为小写字母,而toUpperCase()方法可将字符串中的所有小写字母改写为大写字母。如果字符串中没有应该被转换的字符,则将原字符串返回。
str.toLowerCase()
str.toUpperCase()
package haha;
public class computer{
public static void main(String[] args) {
String str=new String("Oh My God");
String newstr=str.toLowerCase();
String newstr2=str.toUpperCase();
System.out.println(newstr);
System.out.println(newstr2);
}
}
4.8 字符串分割
使用split()方法可以使字符串按指定的分割字符或字符串进行分割,并将分割后的结果存放在字符串数组中。split()方法提供了以下两种字符串分割形式。
1.split(String sign)
该方法可根据给定的分割符对字符串进行拆分。代码如下:
str.split(String sign)
没有统一的对字符进行分割的符号。如果想定义多个分割符,可使用符号“|”。例如,“,|=”表示分割符分别为“,”和“=”。
2.split(String sign,int limit)
该方法可根据给定的分割符对字符串进行拆分,并限定拆分的次数。语法如下:
str.split(String sign,int limit)
package haha;
public class computer{
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+"]");
System.out.print("全部分割的结果:");
for (String a:firstArray) {
System.out.print("["+a+"]");
}
System.out.println();
for (String a:secondArray) {
System.out.print("["+a+"]");
}
System.out.println();
}
}
五、格式化字符串
String类的静态format()方法用于创建格式化的字符串。format()方法有两种重载形式。
1.format(String format.Object...args)
该方法使用指定的格式字符串和参数返回一个格式化字符串,格式化后的新字符串使用本地默认的语言环境,语法如下:
str.format(String format,Object...args)
2.format(Local I,String format,Object...args)
该方法使用指定的语言环境,格式化字符串和参数返回一个格式化字符串,格式化后的新字符串使用其指定的语言环境。语法如下:
str.format(Local I,String format,Object...args)
5.1 日期和时间字符串格式化
5.1.1 日期格式化
先看一个例子,返回一个月中的天数,代码如下:
Date date=new Date();
String s=String.format("%te",date);
package haha;
import java.util.Date;
public class computer{
public static void main(String[] args) {
Date date=new Date();
String year=String.format("%tY", 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+"号");
}
}
5.1.2 时间格式化
package haha;
import java.util.Date;
public class computer{
public static void main(String[] args) {
Date date=new Date();
String hour=String.format("%tH",date);
String minute=String.format("%tM", date);
String second=String.format("%tS",date);
System.out.println("现在是:"+hour+"时"+minute+"分"+second+"秒");
}
}
5.1.3 格式化常见的日期时间组合
package haha;
import java.util.Date;
public class computer{
public static void main(String[] args) {
Date date=new Date();
String time=String.format("%tc", date);
String form=String.format("%tF", date);
System.out.println("全部的时间信息是:"+time);
System.out.println("年-月-日格式:"+form);
}
}
5.2 常规类型格式化
常规类型格式化可应用于任何参数类型。
package haha;
import java.util.Date;
public class computer{
public static void main(String[] args) {
String str=String.format("%d", 400/2);
String str2=String.format("%b", 3>5);
String str3=String.format("%x", 200);
System.out.println("400的一半是:"+str);
System.out.println("3>5正确吗:"+str2);
System.out.println("200的十六进制数是:"+str3);
}
}
六、使用正则表达式
正则表达式通常被用于判断语句中,用来检查某一字符串是否满足某一格式。正则表达式是含有一些具有特殊意义字符的字符串,这些特殊字符称为正则表达式的元字符。例如,"//d"表示数字0~9中的任何一个,"/d"就是元字符。
在正则表达式中,"."代表任何一个字符,因此在正则表达式中如果想使用普通意义的点字符".",必须使用转义字符"\"。
在正则表达式中,可以使用方括号括起若干个字符来表示一个元字符,该元字符可代表方括号中的任何一个字符。例如,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&&[def]]:代表字母d、e、f(交运算)。
- [a-d&&[^bc]]:代表字母a、d(差运算)。
在正则表达式中允许使用限定修饰符来限定元字符出现的次数。例如,"A*"代表A可在字符串中出现0次或多次。
例:验证E-mail地址是否“合法”
package haha;
public class computer{
public static void main(String[] args) {
String regex="\\w+@\\w+(\\.\\w{2,3})*\\.\\w{2,3}";
String str1="aaa@";
String str2="aaaaa";
String str3="1111@111ffyu.dfg.com";
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地址格式");
}
}
}
七、字符串生成器
创建成功的字符串对象,其长度是固定的,内容不能被改变和编译。虽然使用"+"可以达到附加新字符或字符串的目的,但"+"会产生一个新的String实例,会在内存中创建新的字符串对象。如果重复地对字符串进行修改,将极大地增加系统开销。而JDK新增了可变的字符序列StringBulider类,大大提高了频繁增加字符串的效率。
package haha;
public class computer{
public static void main(String[] args) {
String str="";
long startTime=System.currentTimeMillis();
for(int i=0;i<10000;i++) {
str=str+1;
}
long endTime=System.currentTimeMillis();
long time=endTime-startTime;
System.out.println("String消耗时间:"+time);
StringBuilder builder=new StringBuilder();
startTime=System.currentTimeMillis();
for(int j=0;j<10000;j++) {
builder.append(j);
}
endTime=System.currentTimeMillis();
time=endTime-startTime;
System.out.println("StringBuilder消耗时间:"+time);
}
}
通过上面的例子可以看出,两种操作执行的时间差距很大。
如果在程序中频繁地附加字符串,建议使用StringBuilder类。新创建的StringBuilder对象初始容量是16个字符,可以自行指定初始长度。如果附加的字符超过可容纳的长度,则StringBuilder对象将自动增加长度以容纳被附加的字符。若要使用StringBuilder类最后输出字符串结果,可使用toString()方法。利用StringBuilder类中的方法可动态地执行添加、删除和插入等字符串中的编辑操作。
1.append()方法
该方法用于向字符串生成器中追加内容。通过该方法的多个重载形式,可实现接受任何类型的数据,如int、boolean、char、String、double或者另一个字符串生成器。语法如下:
append(content)
2.insert(int offset,arg)方法
该方法用于向字符串生成器中的指定位置插入数据内容。通过该方法的不同重载形式,可实现向字符串生成器中插入int、float、char和boolean等基本数据类型的数据或其他对象。语法如下:
insert(int offset,arg)
SrtingBuilder bf=new StringBuilder("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)
StringBuilder bf=new StringBuilder("StringBuilder");
bf.delete(5,10);
System.out.println(bf.toString()); //输出的信息为Strinder