字符串
一、String类
1、声明字符串
格式:String s;
- String:指定该变量为字符串类型
- S:任意有效的标识符,表示字符串变量的名称
2、创建字符串
(1)String(char a[])
char a[]={'a','b','c','d'};
String s=new String(a);
等价于String s="abcd";
(2)String(char a[],int offset,int length)
提取字符数组a中的一部分创建一个字符串对象。参数 offset表示开始截取字符的位置,length表示截取字符串的长度
char a[]={'a','b','c','d'};
String s=new String(a,1,4);
等价于String s="bcd";
(3)String(char [] value)
char a[]={'a','b','c','d'};
String s=new String(a);
等价于String s="abcd";
例1:
//创建字符串
package String类;
public class 例1 {
public static void main(String [] args) {
// String s, s1;
// s="ddada";
// s1="dasfasf";
char s[]= {'s','a','d'};
String s1=new String(s);
System.out.println(""+s1);
}
}
二、连接字符串
1、连接多个字符串
//链接多个字符串
package 链接字符串;
public class 例2 {
public static void main(String[]agrs) {
String s1,s2;
s1="你是煞笔";
s2="你就傻逼";
String s=s1+s2;
System.out.println("你说你是不是傻逼:"+s +" 傻逼!!");
}
}
Java中一句相连的字符串不能分开在两行中写。例如
System.out.println("I like
Java")
这种写法是错误的,如果一个字符串太长,为了便于阅读,可以将这个字符串分在两行上书写。比时就可以使用“+” 将两个字符串联起来,之后在加号处换行。因此,上面的语 句可以修改为:
Systerm.out.printn("I like'+
"Java);
2、连接其他数据类型
//连接其他数据类型
package 链接字符串;
import java.util.Scanner;
public class 例3 {
private static Scanner sc;
public static void main(String [] args){
sc = new Scanner(System.in);
int x;
System.out.println("输入购买金额:");
x=sc.nextInt();
if(x<50) {
System.out.println("你输入的金额不足以支持你购买这件商品!!!");
}else {
System.out.println("你购买了一件"+"50元的衣服;" +"找你:"+(x-50)+"元");
}
}
}
三、获取字符串信息
1、获取字符串长度
格式:s.length();
//获取字符串长度
package 获取字符串信息;
public class 例4 {
public static void main(String[]agrs) {
String s1="haoge";
int s=s1.length();
System.out.println("这个字符串长度为:"+s);
}
}
2、字符串查找
(1)indexOf(String s)
格式:s.indexOf(a);
- s:任意字符串对象
- a:要搜索的字符串
(2)lastIndexOf(String s)
该方法用于返回指定字符串最后-次出现的索引位置。当调用字符串的lastIndexOf()方法时,会从当前字符串的开始位置检索参数字符串s, 并将最后次出现 s 的索引位置返回。如果没有 检索到字符串s,该方法返回-1。
格式:s.lastIndexOf(a)
//字符串查找
package 获取字符串信息;
public class 例5 {
public static void main(String[]agrs) {
String s1="haogegood";
int s=s1.indexOf("g");//g字符在S1字符串的位置
int s2=s1.lastIndexOf("g");//g字符在S1字符串的索引位置
System.out.println("g在字符串S1的第几位:"+(s+1));
System.out.println("g字符在S1字符串的索引位置:"+s2);
}
}
- 如果lastIndexOf(方法中的参数是空字符串"" (注意没有空格),则返回的结果与调用该字符串length0方法的返回结果相同。上述程序就可说明这个问题。
3、获取指定索引位置的字符串
格式:s.charAt(int index)
index:整型值,用于指定要返回字符的下标
//获取指定索引位置的字符
package 获取字符串信息;
public class 例6 {
public static void main(String[]args) {
// int x[]= {1,2,3,4,5,6};
// int i=1;
// for(int s:x) {
// if(s==6) {
// System.out.printf("6在数组x的第%d位",i);
// }
// i++;
// }
String s="haogeliubi";
char x=s.charAt(5);
System.out.println("字符串中索引位置为5的字符是:"+x);
}
}
四、字符串操作
1、获取子字符串
(1)substring(int beginIndex)
格式:s.substring(int beginIndex)
- beginIndex指定从某一索引处开始截取字符串
(2)substring(int beginIndex,int endIndex) - beginIndex:开始截取子字符串的索引位置
- endIndex:子字符串在整个字符串中的结束位置
//获取子字符串
package 字符串操作;
public class 例7 {
public static void main(String[]agrs) {
String s="haoge",s2="www,baidu.com";
String s1=s.substring(2),s3=s2.substring(0, 3);
System.out.println(""+s1 +" " +s3);
}
}
2、去除空格
格式:s.trim();
//去除空格
package 字符串操作;
public class 例8 {
public static void main(String[]agrs) {
String s1,s2,s;
s1=" haige ";s2=" huji ";
s=s1.trim()+s2.trim();
System.out.println("S等于s1+s2除去空格的长度:"+s.length()+" S为:"+s);
}
}
3、字符串替换
格式:s.replace(char oldChar,char newChar);
- oldChar:要替换的字符或字符串
- newChar:用于替换原来字符串的内容
//字符串替换
package 字符串操作;
public class 例9 {
public static void main(String[]agrs) {
String s1,s2,s,s3;
s1="swdcsaw";s2="dsadf";
s3=s1+s2;
s=s3.replace(s1, s2);
System.out.println(s);
}
}
4、判断字符串的开始和结尾
(1)startsWith()
格式:s.startsWith(String prefix)
prefix:指作为前缀的字符
(2)endsWith()
格式:s.endsWith(String suffix)
suffix:指作为后缀的字符串
//判断字符串的开始和结尾
package 字符串操作;
public class 例10 {
public static void main(String[]args) {
String s="85852422963",s2="4821582236";
boolean a=s.startsWith("85"), b=s.endsWith("85"),c=s2.startsWith("85"),d=s2.endsWith("36");
System.out.println("s字符串是以85开头的吗?"+a+" s字符串是以85结尾的吗?"+b+" s2字符串是以85开头的吗?"+c+" s2字符串是以36结尾的吗?"+d);
}
}
5、判断字符串是否相等
(1)equals()
格式:s.equals(String otherstr)
- 其中 s,otherstr是要比较的两个字符串对象
(2)equalslgnoreCase()
格式:s.equalslgnoreCase(String otherstr)
- 其中 s,otherstr是要比较的两个字符串对象
//判断字符串是否相等
package 获取字符串信息;
public class 例7 {
public static void main(String[]agrs) {
String s1="haoge",s2="shuai!!";
System.out.println(""+s1.equals(s2)+" "+s1.equalsIgnoreCase(s2));
}
}
6、按字典顺序比较两个字符串
compareTo()方法为按字典顺序比较两个字符串,该比较基于字符串中各个字符的Unicode值,按字典顺序将此String对象表示的字符序列与参数字符串所表示的字符序列进行比较。如果按字典顺序此String对象位于参数字符串之前,则比较结果为一个负数。
格式:s.compareTo(String otherstr)
//按字典顺序比较两个字符串
package 获取字符串信息;
public class 例8 {
public static void main(String[]agrs) {
String s1="ABCD",S2="GFDC";
System.out.println(""+s1.compareTo(S2));//比较S1字符串第一个字符与S2字符串的第一个字符在字典的位置
}
}
7、字母大小转换
(1)toLowerCase()(小写转换)
格式:s.toLowerCase()
(2)toUpperCase()(大写转换)
格式:s.toUpperCase()
//字母大小写转换
package 获取字符串信息;
public class 例9 {
public static void main(String[]args) {
String s1="ABDCE",s2="adefrgh";
System.out.println(""+s1.toLowerCase()+" "+s2.toUpperCase());
}
}
8、字符分割
(1)split(Stirng sign)
格式:s.split(String sign)
该方法可根据给定的分割符对字符串进行分割
格式:s.split(Sting sign)
- sigh为分割字符串的分割符,也可以正则是表达式
(2)split(String sign,int limit)
格式:s.split(String sign,int limit)
- limit为限制分割次数
//字符串分割
package 获取字符串信息;
public class 例10 {
public static void main(String[]agrs) {
String s1="abc|vfr|kij|oki";
String[] s2,s3;
s3=s1.split("\\|", 3);
s2=s1.split("\\|");
for(String a:s2) {
System.out.print("{"+a+"}");
}
System.out.println();
for(String b:s3) {
System.out.print("{"+b+"}");
}
}
}
五、格式化字符串
1、日期和时间字符串格式化
(1)日期格式化
做格式化之前一定要导入import java.util.*;
类,然后在主方法里创建Date对象dateDate date=new Date();
常用日期格式化转换符如下表:
转换符 | 说明 | 示例 |
---|---|---|
%te | 一个月中的某一天 | 2 |
%tb | 指定语言环境的月份简称 | Feb(英语)、二月(中文) |
%tB | 指定语言环境的月份全称 | February(英语)、二月(中文) |
%tA | 指定语言环境的星期几全称 | Monday(英语)、星期一(中文) |
%ta | 指定语言环境的星期几简称 | Mon(英语)、星期一(中文) |
%tc | 包括全部日期和时间信息 | 星期二 三月 25 13:37:22 CST 2008 |
%tY | 4位年份 | 2008 |
%tj | 一年中的第几天 | 085 |
%tm | 月份 | 03 |
%td | 一个月中的第几天 | 02 |
%ty | 2位年份 | 08 |
(2)时间格式化
转换符 | 说明 | 示例 |
---|---|---|
%tH | 2位数字的24时制的小时(00~23) | 14 |
%tI | 2位数字的12时制的小时(01~12) | 05 |
%tk | 2位数字的24时制的小时(0~23) | 5 |
%tl | 2位数字的12时制的小时(1~12) | 10 |
%tM | 2位数字的分钟(00~59) | 05 |
%tS | 2位数字的秒钟(00~60) | 12 |
%tL | 3位数字的毫秒数(000~999) | 920 |
%tN | 9位数字的微秒数(000000000~999999999) | 062000000 |
%tp | 指定语言环境下上午或下午标记 | 下午(中文)、pm(英文) |
%tz | 相对于GMT RFC 82格式的数字时区偏移量 | +0800 |
%tZ | 时区缩写形式的字符串 | CST |
%ts | 1970-01-01 00:00:00至今经过的秒数 | 1206426646 |
%tQ | 1970-01-01 00:00:00至今经过的毫秒数 | 1206426737453 |
//日期和时间字符串格式化
package 格式化字符串;
import java.util.*;
public class 例10 {
public static void main(String[]agrs) {
Date date=new Date();
String year=String.format("%tY", date), L=String.format("%tm", date)
,R=String.format("%td", date), S=String.format("%tH", date),F=String.format("%tM", date),
M=String.format("%tS", date),f=String.format("%tc", date);
System.out.println(""+year+"年"+L+"月"+R+"日"+S+"时"+F+"分"+M+"秒");
System.out.println("全部信息:"+f);
}
}
(3)格式化常见的日期和时间组合
转换符 | 说明 | 示例 |
---|---|---|
%tF | “年-月-日” 格式(4位年份) | 2008-03-12 |
%tD | “月/日/年”格式(2位年份) | 03/05/08 |
%tc | 全部日期和时间信息 | 星期二 三月 25 15:20:00 CST 2008 |
%tr | “时:分:秒PM(AM)“格式(12时制) | 03:22:06 下午 |
%tT | ”时:分:秒“格式(12时制) | 15:23:50 |
%tR | ”时:分“格式(24时制) | 15:25 |
2、常规类型格式化
转换符 | 说明 | 示例 |
---|---|---|
%b,%B | 结果被格式化为布尔类型 | true |
%h,%H | 结果被格式化为散列码 | A05A5198 |
%s,%S | 结果被格式化为字符串类型 | “abcd” |
%c,%C | 结果被格式化为字符类型 | ‘a’ |
%d | 结果被格式化为十进制 | 40 |
%o | 结果被格式化为八进制 | 11 |
%x,%X | 结果被格式化为十六进制 | 4b1 |
%e | 结果被格式化为用计算机科学记数法表示的十进制数 | 1.700000e+01 |
%a | 结果被格式化为带有有效位数和指数的十六进制浮点值 | 0X1.C000000000001P4 |
%n | 结果为特定于平台的行分隔符 | |
%% | 结果为字面值% | % |
//常规类型格式化
package 格式化字符串;
import java.util.Scanner;
public class 例11 {
private static Scanner sc;
public static void main(String []agrs) {
sc = new Scanner(System.in);
int m,n;
System.out.printf("输入数值M:");
m=sc.nextInt();
System.out.printf("输入比较数值N:");
n=sc.nextInt();
System.out.printf("输入数值M为%d,比较数值N为%d",m,n);
System.out.printf("\nM>=N?:%b",m>=n );
System.out.printf("\nm转换为八进制数为%o,n转换为十六进制数为%x",m,n);
}
}
六、使用正则表达式
//使用正则表达式
package 使用正则表达式;
import java.util.*;
public class 例12 {
private static Scanner sc;
public static void main(String [] args) {
sc = new Scanner(System.in);
String regex="\\w+@\\w+(\\.\\w{2,3})*\\.\\w{2,3}";
String s1;
System.out.printf("输入验证E-mail邮箱:");
s1=sc.next();
if(s1.matches(regex)) {
System.out.println(s1+"是一个合法的E-mail地址格式");
}else {
System.out.println(s1+"不是一个合法的E-mail地址格式");
}
}
}
七、字符串生成器
//字符串生成器
package 字符串生成器;
import java.util.*;
public class 例13 {
private static Scanner sc;
public static void main(String[]args) {
int i,x;
sc = new Scanner(System.in);
String s="";
System.out.printf("要创造多大的字符串:");
x=sc.nextInt();
long sTime=System.currentTimeMillis();
for(i=0;i<x;i++) {
if(i%3==0) {
s=s+'A';
}
else if(i%2==0) {
s=s+'B';
}else if(i%5==0) {
s=s+'C';
}else {
s=s+'D';
}
}
long eTime=System.currentTimeMillis();
long Time=eTime-sTime;
System.out.println("创造字符串消耗的时间"+Time+"S"+" s为"+s);
sTime=System.currentTimeMillis();
StringBuilder s1=new StringBuilder("");
for(i=0;i<x;i++) {
if(i/1==0) {
s1.append('A');
}else if(i%2==0) {
s1.append('B');
}else if(i%3==0) {
s1.append('C');
}else if(i%4==0) {
s1.append('D');
}else if(i%5==0) {
s1.append('E');
}else {
s1.append('F');
}
}
eTime=System.currentTimeMillis();
Time=eTime-sTime;
System.out.println("创造字符串消耗的时间"+Time+"S"+" s1为"+s1);
}
}
通过这一实例可以看出,两种操作执行的时间差距很大。如果在程序中频繁地附加字符串,建议使用StringBuidere新创建的StringBuilder对象初始容量是16个字符,可以自行指定初始长度。如果附加的字符超过可容纳的长度,则StringBuider对象将自动增加长度以容纳被附加的字符。若要使用StringBuilder最后输出字符串结果,可使用toString0方法。利用StringBuider类中的方法可动态地执行添加、删除和插入等字符串的编辑操作。该类的常用方法如下。
(1) appendO方法
该方法用于向字符审生成器中追加内容。通过该方法的多个重载形式,可实现接受任何类型的数据,如训、boolean. char. Sring, double或者另个字符串生成器等。
语法如下:append(content)
其中,content 表示要追加到字符串生成器中的内容,可以是任何类型的数据或者其他对象。
(2) insert(int offset, arg)方法
- ofset:字符事生成器的位置。该参数必须大于等于0,且小于等于此序列的长度。
- arg: 将插入至字符串生成器的位置。该参数可以是任何的数据类型或其他对象。
StringBuilder bf = new tringlilerT(hello");
bf.inser(5, "word");
System.outprintn(bftotring());
(3) delete(int start,int end)方法
移除此序列的子字符串中的字符。该子字符申从指定的stat处开始,一直到索引end- 1处的字符是不存在这种字符,则直到序列尾部。 如果start等于end,则不发生任何更改。
语法如下:delete(int start, int end)