字符串(Java自我进阶笔记四)
一级目录
二级目录
三级目录
一 String 类
1声明字符串
在Java语言中字符串必须包含在一对双引号“ ”之内
例如:
“2323”, “ABDG” ,“我爱java”
利用String来声明字符串,
String str;
String :指定该变量为字符串类型,是一个标识符。
str :字符串名称(可任意修改的名称)
声明实例:
String s1;
2 创建字符串
1 String (char())
用一个字符数组a在创建String 对象
char a[]={'m','o','n','e','y'};
String s=new String (a);
上面的实例等价于
String s=new String ("money");
2 String (char a[] ,int offset,int length )
提取字符数组a的一部分创建字符串对象
实例
char a[]={'s','t','u','d','e','n','t'};
String s=new String(a,2,4);
等价于
String s=new String ("upen");
2是开始提取的位置,数组a下标为2的是u,提取长度为4,提取依次4个,结果为upen。
3 String (char [] value)
分配一个String 对象,使得其表示字符数组的参数中所有元素连接的结果
实例
char a[]={'s','t','u','d','e','n','t'};
String s=new String (a);
等价于
String s=new String ("student");
4 直接法
可以通过字符串常量的引用直接赋值给一个字符串变量
实例
String str1,str2;
str1="I love Java";
str2="I love Java";
注意 str1 和 str2 引用的是相同的字符串常量,所有它们的内存是相同的。
二 字符串的连接
1字符串间的连接
“+”运算可以实现多个字符串的连接
package String1;
import java.io.*;
public class Join {
public static void main(String args[]) {
String s1=new String("loss of hair");
String s2=new String("become the strong");
String s=s1+"="+s2;
System.out.println(s);
}
}
注意:
Java中一句相连的字符串不能分开在两行写。比如,下列语句的写法便是错误的
System.out.println("I don't like
Java");
如果一个字符串过长为了美观需要分两行写,可以把这个字符串分成两个字符串,
用+号连接
上面的例子可以写成下面的样子
System.out.println("I don't like"+
"Java");
2 字符串和非字符串连接
字符串和其它数据类型连接时,会将这些非字符串类型直接转换为字符串类型。
package String1;
import java.io.*;
public class Link {
public static void main(String args[])
{
int sleeptime=8;
float studytime=4.0f;
System.out.println("我每天睡"+sleeptime+"小时"+",花费"+studytime+"小时学习Java");
}
}
三 获取字符串信息
1 获取字符串长度
使用String类中的length()方法来获取生成的字符串对象的长度。
语法如下
str.length();
实例如下
String s1="I can become strong";
int size=str.length(s1);
2字符串查找
String 类提供了两种查找字符串的方法,即 indexOf()与lastIndexOf()方法,
前者返回首次位置,后者返回最后一次出现的位置。
1 indexOf(String s)
该方法用于返回参数字符串s在指定字符串中首次出现的索引位置。如果没有检索到,
则返回值为-1.
语法如下:
str.indexOf(substr);
str : 指定的字符串对象
substr : 要搜索的字符串
实例如下:
String str="I am coming ";
int size=str.indexOf("a");//变量size的值是2
2 lastIndexOf(String s)
该方法用于返回字符串最后一次出现的索引位置,该方法会从右往左反向查找字符串。
如果没有查找到,会返回-1.
语法如下:
str.lastIndexOf(substr);
注意:如果s 是空字符串,即什么都没有。则会返回字符串的长度。
示例如下:
package String1;
import java.io.*;
public class Text {
public static void main(String args[]) {
String s1=new String("I want have a girf become my girffriend and "
+ "I must make a pet of her and protected her");
int slength=s1.length();
int fsize=s1.indexOf("h");
int lsize=s1.lastIndexOf("h");
int size=s1.lastIndexOf("");
System.out.println(slength);
System.out.println(fsize);//h首次出现的位置
System.out.println(lsize);//最后一次出现的位置
System.out.println(size);//我们发现size的值和slength的值是相等的
}
}
3 获取指定索引位置的字符
用于查找某个位置的字符
语法如下:
str.charAt(int index)
str:任意字符串
index: 整型值,你想查找的位置
实例如下:
package String1;
import java.io.*;
public class Ref {
public static void main(String args[]) {
char a[]= {'a','b','c','d','e','f','g','h','k','m','n','x'};
String s1=new String(a,2,8);
char f=s1.charAt(5);
System.out.println(f);
}
}
四 字符串操作
String 类中有很多方法,运行“程序猿”对字符串进行操作来满足实际编程的需求。
1 获取子字符串
使用substring方法,substring方法被重载,有两种使用形式
第一种 substring(int beginIndex)
其中beginIndex指定从某一索引处开始截取字符串,即子字符串的开始位置。
实例如下:
String s1="Hello World";//定义字符串str
String substr=str.substring(3);//获取字符串,这时substr的值为lo World
第二种substring(int beginIndex,int endIndex)
beginIndex是开始截取的位置,endIndex是结束截取的位置
示例如下:
package String1;
import java.io.*;
public class Subs {
public static void main(String args[])
{
String s1="hello world";
String substr1=s1.substring(4);//这时substr1的值为o world
String substr2=s1.substring(2, 4);//这时substr2的值为ll
System.out.println(substr1);
System.out.println(substr2);
}
}
2去除空格
trim()方法 用于出去首尾的空格
package String1;
import java.io.*;
public class Blak {
public static void main(String args[]) {
String str=" java study ";//str的值为“ java study ”
String str1=str.trim();//str1的值为java study
System.out.println(str);
System.out.println(str1);
}
}
3字符串替换
replace()方法实现
语法如下:
str.replace(char oldChar,char newChar);
oldChar: 被替换的字符串(被替换的字符串必须和str中必须完全对应,大小写也需要一致)
newChar: 用于替换原来内容的字符串
示例如下:
package String1;
import java.io.*;
public class ReplaceText {
public static void main(String args[]) {
String str="address";
String newstr=str.replace("a", "A");//这时newstr的值为Address
System.out.println(newstr);
}
}
4 判断字符串的开始和结尾
starts With()方法与ends With()方法分别用于判断字符串是否以指定的内容开始
或结束,返回值都是boolean类型
1 starts With()方法
该方法用于判断当前字符串对象的前缀是否为参数指定的字符串
语法如下:
str.startsWith(String prefix);
prefix为需要判断的前缀字符串
2 endsWith()
该方法用于判断当前字符串对象的前缀是否为参数指定的字符串
语法如下:
str.endsWith(String suffix);
suffix为需要判断的后缀字符串
示例如下:
package String1;
import java.io.*;
public class StartOrEnd {
public static void main(String args[]) {
String s1="1243433544354";
String s2="45545475454743";
System.out.println("s1是否以43开头"+" :"+s1.startsWith("43"));//false
System.out.println("s1是否以54结尾"+" :"+s1.endsWith("54"));//true
System.out.println("s2是否以45开头"+" :"+s2.startsWith("45"));//true
System.out.println("s2是否以43结尾"+" :"+s2.endsWith("43"));//true
}
}
5判断字符串是否相等
判断字符串是否相等不能使用"==",因为比较运算符比较的两个字符串的地址是否
相同,显然,地址不同并不意味着内容不同
在Java种比较两个字符串是否相等使用equals()方法和equalsIgnoreCase方法
1 equals()方法(注意区分大小写)
语法如下:
str.equals(String otherstr);//返回值是boolean类型
str 和otherstr是要比较的两个字符串
2 equalsIgnoreCase()方法(注意不区分大小写)
语法如下:
str.equalsIgnoreCase(String otherstr);
6 按照字典顺序比较两个字符串
使用compareTo()方法基于字符的Unicode值比较。比较首个字符。若String 对象
位于参数字符串之前则返回一个负整数,若在之后则返回一个正整数,
如果相等则返回0
语法如下:
str.compareTo(String otherstr);
7 字母大小写转换
toLowerCase()方法转换为小写
语法如下:
str.toLowerCase();
toUpperCase()方法转换为大写
语法如下:
str.toUpperCase();
注意数字和非字符不受影响
8字符串分割
使用split()方法实现对字符串的分割
有两种形式
第一种 split(String sign)
该方法根据给定的分割符对字符串进行拆分
语法如下:
str.split(String sign)
sign为分割字符串的分割符,也可以使用正则表达式。
说明:没有统一的对字符进行分割的符号,如果想定义多个分割符,可使用符号|。例如,“,|=”表示分割符为“,”和“=”
第二种形式 split(String sign,int limit)
该方法根据给定的分割符对字符串进行拆分,并限定拆分的次数。
语法如下:
str.split(String sign,int limit);
sign:分割字符串的分割符,也可以使用正则表达式。
limit:模式匹配次数,如果值设置为n,那么将根据正则表达式分配n-1次,得到的数组长度不会大于n,数组的最后一项是最后匹配的分割符以后的所有内容。
实例如下:
package String1;
import java.io.*;
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+"]");//输出原来的值
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();
}
}
结果显示:
[192.168.0.1]
全部分割的结果:[192][168][0][1]
分割变更成的结果是:[192][168.0.1]
五 字符串格式化
采用String类的静态format()方法用于创建格式化的字符。有两种重载形式。
第一种 format(String format,Object…args)
语法如下:
str.format(String format,Object...args)
format 格式化字符串
args:格式字符串中由格式说明符引用的参数
第二种format(Local l,String format,Object…args)
l:格式化过程中要应用的语言环境
format:格式化字符串
args:格式字符串中由格式说明符引用的参数
1 日期和时间字符串格式化
常用的日期格式化转换符
注意:使用 “%T” 替换下面的 “%t” 可以将输出结果变成大写形式。
标识 | 注释 |
---|---|
%tA | 星期几的全名,例如 “Sunday“, “Monday“。 |
%ta | 星期几的缩写,例如 “Sun“, “Mon“。 |
%tB | 月份的全名,例如 “January“, “February“。 |
%tb | 月份的缩写,例如 “Jan“, “Feb“。 |
%tC | 年的世纪部分的格式为两位数,从 “00“到“99”。 |
%tc | 日期和时间的格式为 “%ta %tb %td %tT %tZ %tY” 如 “Fri Feb 17 07:45:42 PST 2017“。 |
%tD | 格式为 “%tm/%td/%ty“ 的日期。 |
%td | 两位的日期格式,从 “01”到 “31“。 |
%te | 没有前导0的日期,从 “1” 到 “31”。 |
%tF | 使用 “%tY-%tm-%td“ 格式的 ISO 8601 日期。 |
%tH | 24小时制的小时,从 “00” 到 “23“。 |
%th | 同 %tb。 |
%tI | 12小时制的小时,从 “01” 到 “12“。 |
%tj | 带前导0的年中的日期,从 “001” 到“366“。 |
%tk | 没有前导0的24小时制,从 “0” 到 “23“。 |
%tl | 没有前导0的12小时制,从 “1” 到“12“。 |
%tM | 带前导0的分钟,从 “00” 到“59“。 |
%tm | 带前导0的月份,从 “01” 到 “12“。 |
%tN | 带前导0的9位纳秒数,从 “000000000” to “999999999”. |
%tp | 和区域相关的 “am” or “pm” 标记。 |
%tQ | 1970年1月1日00:00:00 UTC 以来的毫秒。 |
%tR | 24小时制的时间,如:“%tH:%tM“。 |
%tr | 12小时制的时间,如:“%tI:%tM:%tS %Tp“。 |
%tS | 2位数字格式的秒,从 “00” 到 “60”。 “60” 需要支持闰秒。 |
%ts | 1970年1月1日00:00:00 UTC以后的秒数。 |
%tT | 24小时制的时分秒,如: “%tH:%tM:%tS“。 |
%tY | 4位的年份格式,从 “0000” 到 “9999“。 |
%ty | 2位的年份格式,从 “00” 到 “99“。 |
%tZ | 时区缩写,如:“UTC“, “PST“。 |
%tz | 与GMT的时区偏移量,如 -0800。 |
3 常规类型格式化
说明符 | 适用于 | 输出 |
---|---|---|
%a | 浮点数 (除了BigDecimal) | 浮点数的十六进制输出 |
%b | 任何类型 | 如果为非空则为“true”,为空则为“false” |
%c | 字符 | Unicode字符 |
%d | 证书(包括byte, short, int, long, bigint) | 十进制整数 |
%e | 浮点数 | 科学计数的十进制数 |
%f | 浮点数 | 十进制数 |
%g | 浮点数 | 十进制数,根据值和精度可能以科学计数法显示 |
%h | 任何类型 | 通过hashCode()方法输出的16进制数 |
%n | 无 | 平台相关的换行符 |
%o | 整数(包括byte, short, int, long, bigint) | 八进制数 |
%s | 任何类型 | 字符串 |
%t | 日期/时间 (包含long, Calendar, Date 和TemporalAccessor) %t是日期/时间转换的前缀。后面还需要跟其他的标识,请参考下面的日期/时间转换。 | |
%x | 整数(包含byte, short, int, long, bigint) | 十六进制字符串 |
距离如下:
例一:
package String1;
import java.io.*;
import java.util.Date;
public class Eval {
public static void main(String ars[]) {
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+"日");//日
}
}
例二:
package String1;
import java.io.*;
import java.util.Date;
public class GetDate {
public static void main(String args[]) {
Date date=new Date();
String hour=String.format("%tH", date);
String minue=String.format("%tM", date);
String second=String.format("%tS", date);
System.out.println("现在是:"+hour+"时"+minue+"分"+second+"秒");
}
}
例三:
package String1;
import java.io.*;
import java.util.Date;
public class DateAndTime {
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);
}
}
[012345] | 匹配数字0到5中的任意一个。 |
---|---|
[0-5] | 匹配数字0到5中的任意一个。 |
<H[123456]> | 匹配HTML标签中的H1到H6。 |
[Jj]ack | 匹配字符串Jack或jack。 |
[a-z] | 匹配任何小写字母 |
[A-Z] | 匹配任意大写字母。 |
[-a] | 匹配-或者a。如果要在字符类中包含连字符,则必须包含在第一位 |
[^abc] | 匹配除了abc以外的任意字符 |
[^-] | 匹配除了连字符以外的任意字符 |
a[^b] | 匹配a之后不是b的字符串。 |
常用字符类 | |
---|---|
\w | 匹配单词字符(包括字母、数字、下划线和汉字) |
\W | 匹配任意的非单词字符(包括字母、数字、下划线和汉字) |
\s | 匹配任意的空白字符,如空格、制表符、换行符、中文全角空格等 |
\S | 匹配任意的非空白字符 |
\d | 匹配任意数字 |
\D | 匹配任意的非数字字符 |
\B | 匹配不是单词开头或结束的位置 |
[abc] | 匹配字符集中的任何字符 |
[^abc] | 匹配除了字符集中包含字符的任意字符 |
[0-9a-z_A-Z_] | 匹配任何数字、字母、下划线。等同于\w |
\p{name} | 匹配{name}指定的命名字符类中的任何字符 |
\P{name} | 匹配除了{name}指定的命名字符类中之外的任何字符 |
. | 匹配除了换行符号之外的任意字符 |
[^0-9a-zA-Z_] | 等同于\W |
限定修饰符 | |
---|---|
* | 匹配前面的子表达式零次或多次。 |
+ | 匹配前面的子表达式一次或多次。 |
? | 匹配前面的子表达式零次或一次。 |
{n} | n是一个非负整数。匹配确定的 n 次。 |
{n,} | n 是一个非负整数。至少匹配n 次。 |
{n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。 |
*? | 尽可能少的使用重复的第一个匹配 |
+? | 尽可能少的使用重复但至少使用一次 |
?? | 如果有可能使用零次重复或一次重复。 |
{n}? | 等同于{n} |
{n,}? | 尽可能少的使用重复但至少重复n次 |
{n,m}? | 介于n次和m次之间,尽可能少的使用重复。 |
示例如下:
package String1;
import java.io.*;
public class Judge {
public static void main(String args[]) {//定义匹配E-mail地址的正则表达式
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地址格式");
}
}
}
结果为
1111@111ffyu.dfg.com是一个合法的E-mail地址格式
六 字符串生成器
创建成功的字符串对象,其长度是固定的,内容不能被改变和编译。使用+虽然可以达到附加新字符
串或字符串的目的,但是+会产生一个新的String实例,后来新增的的String-Builder类可以进行
字符串的修改,解决了这个问题
StringBuild 类
1 append()方法
向字符串追加内容
语法如下:
append(contend);
contend 是要新加的内容
2 insert(int offset arg)方法
该方法用于向字符串生成器中指定位置加入数据内容
语法如下:
insert(int offset arg);
offset:字符串生成器的位置必须大于0 且要小于等于该字符串长度
arg:要插入的内容
示例如下:
StringBuild bf=newStringBuilder("hello");
bf.insert(5,"world");
System.out.println(bf.toString());
3 delete(int start,int end)方法
移除此序列的一部分子序列
语法如下:
delete(int start,int end);
start:将要删除的字符串的起点
end:将要删除的字符串的终点
示例如下:
StringBuild bf=new StringBuild("StringBuild");
bf.delete(5,10);
System.out.println(bf.toString());