一、String类
在Java语言中将字符串作为对象来处理,可以通过java.lang包中的String类来创建字符串对象。
1. 声明字符串
Java中字符串必须包含在一对双引号(“”)之内。因此,无论什么形式,只要在双引号中就是字符串。
String str = [null];
String:指定变量为字符串类型
str:任意有效的标识符,表示字符串变量的名称
null:省略null,表示str变量是未初始化的状态,否则表示声明的字符串的值等于null
2. 创建字符串
创建String对象,要使用类的构造方法。String类的构造方法如下:
- String(char a[])方法:用哪一个字符数组a创建String对象。
char a[] = {'g', 'o', 'o', 'd'};
String s = new String(a);
String s1 = new String("good");
注意:例子中的这两种形式是等价的。
- 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");
- 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"
str2 = "We are students"
二、连接字符串
1. 连接多个字符串
使用“+”运算符可实现连接多个字符串的功能。注意Java中一句相连的字符串不能分开在两行中写。
public class Join {
public static void main(String[] args) {
String s1 = new String("hello");
String s2 = new String("word");
String s = s1 + s2;
System.out.println(s);
}
}
helloword
2. 连接其他数据类型
如果将字符串同这些数据类型数据进行连接,会将这些数据直接转换成字符串。
public class Link {
public static void main(String[] args) {
int booktime = 4;
float practice = 2.5f;
System.out.println("我每天花费" + booktime + "小时看书;" + practice + "小时上机练习");
System.out.println("我每天花费" + booktime + "小时看书;" + (practice+booktime) + "小时上机练习");
}
}
我每天花费4小时看书;2.5小时上机练习
我每天花费4小时看书;6.5小时上机练习
运算符是有优先级的,圆括号的优先级最高,所以先被执行,然后在将结果与字符串相连。
三、获取字符串信息
1. 获取字符串长度
使用String类的length()方法可获取声明的字符串对象的长度。
public class Length {
public static void main(String[] args) {
String s = "We are students";
int size = s.length();
System.out.println(size);
}
}
15
2. 字符串查找
String类提供了两种查找字符串的方法,即indexOf()与lastIndexOf()方法。
(1)indexOf(String s):返回参数字符串s在指定字符串中首次出现的索引位置。调用方法时会从头开始搜索,如果没有搜索到字符串s,该方法的返回值为-1.
语法:
str.indexOf(substr)
- str:任意字符串对象
- substr:要搜索的字符串
public class Search {
public static void main(String[] args) {
String str = "We are students";
int size = str.indexOf("a"); // 返回子字符串a的位置
System.out.println(size);
}
}
3
(2)lastIndexOf(String str):返回指定字符串最后一次出现的索引位置。调用该方法时,依然从头开始搜索str,并将最后一次出现的索引位置返回,如果没有检索到则返回-1.
语法:
str.lastIndexOf(substr):
- str:任意字符串对象
- substr:要搜索的字符串
public class Text {
public static void main(String[] args) {
String str = new String("We are students");
int location = str.lastIndexOf("s"); // 搜索s的最后一个位置
int size = str.lastIndexOf(""); // 空,返回的时字符串长度
System.out.println(location);
System.out.println(size);
}
}
14
15
从例子中可以看到,如果lastIndexOf()方法中的参数是空字符串“”(注意没有空格),则返回的结果与调用该字符串length()方法的返回结果相同。
3. 获取指定索引位置的字符
使用charAt()方法可将指定索引处的字符返回
语法:
str.charAt(int index)
- str:任意字符串
- index:整型值,用于指定要返回字符的下标
public class Ref {
public static void main(String[] args) {
String str = "hello world";
char mychar = str.charAt(6);
System.out.println("字符串str中索引位置是6的字符为:" + mychar);
}
}
字符串str中索引位置是6的字符为:w
四、字符串操作
1. 获取子字符串
通过String类的substring()方法可对字符串进行截取。利用字符串的下标进行截取。注意字符串下标是从0开始的。
(1)substring(int beginIndex):从指定的索引位置开始截取直到该字符串结尾的子串
public class Sub {
public static void main(String[] args) {
String str = "Hello World";
String substr = str.substring(3);
System.out.println(substr);
}
}
lo World
(2)substring(int beginIndex, int endIndex):返回的是从字符串某一索引位置开始截取至某一索引位置结束的子串。
public class Subs {
public static void main(String[] args) {
String str = "Hello world";
String substr = str.substring(0, 3);
System.out.println(substr);
}
}
Hel
2. 去除空格
trim()方法返回字符串的副本,忽略前导空格和尾部空格。
public class Blak {
public static void main(String[] args) {
String str = " Java class ";
System.out.println("字符串原来的长度:" + str.length());
System.out.println("去掉空格后的字符串:" + str.trim());
System.out.println("去掉空格后的字符串:" + str.trim().length());
}
}
将字符变量原来的长度与去掉前导和尾部空格后的长度输出。
3. 字符串替换
replace()方法可实现将指定的字符或字符串替换成新的字符或字符串
语法:
str.replace(char oldChar, char newChar)
- oldChar:要替换的字符或字符串
- newChar:用于替换原来字符串的内容
返回的是一个新的字符串,如果字符串oldChar没有出现在该对象表达式中的字符串序列中,则将原字符串返回。
如果要替换的字符串oldChar在字符串中出现多次,则全部进行替换,并且oldChar中字符串的大小写要与原字符串的大小写保持一致。
public class NewStr {
public static void main(String[] args) {
String str = "address";
String newstr = str.replace("a", "A");
System.out.println(newstr);
}
}
Address
4. 判断字符串的开始于结尾
startsWith()方法和endsWith()方法分别用于判断字符串是否以指定的内容开始或结束。返回值都是boolean类型
(1)startsWith():判断当前字符串对象的前缀是否是参数指定的字符串
语法:
str.startsWith(String prefix)
prefix指作为前缀的字符。
(2)endsWith():用于判断当前字符是否是以给定的子字符串结束
语法:
str.endsWith(String suffix)
suffix是指作为后缀的字符串
public class StartOrEnd {
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);
}
}
num1是否以22开头:true
num2是否以78结尾:true
5. 判断字符串是否相等
对字符串对象进行比较不能简单的使用比较运算符“==”,比较运算符比较的是两个字符串的地址是否相同,及时两个字符串的内容是相同的,但是地址是不同的。因此,比较两个字符串内容是否相等,应使用equals()方法和equalsIgnoreCase()方法。
(1)equals()方法:如果两个字符串具有相同的字符和长度,则使用equals()方法进行比较,返回true
语法:
str.equals(String otherstr)
str、otherstr是参加比较的两个字符串对象
(2)equalsIgnoreCase()方法
equals()方法对字符串进行比较是区分大小写的,而equalsIgnoreCase()方法时忽略了大小写的情况下比较两个字符串是否相等,返回结果仍然是Boolean类型。
语法:
str.equalsIgnoreCase(String others)
str、otherstr是参加比较的两个字符串对象
public class Opinion {
public static void main(String[] args) {
String s1 = new String("abc");
String s2 = new String("ABC");
String s3 = new String("abc");
boolean b = s1.equals(s2);
boolean b2 = s1.equalsIgnoreCase(s2);
boolean b3 = s1 == s3;
System.out.println(b);
System.out.println(b2);
System.out.println(b3);
}
}
false
true
false
6. 按字典顺序比较两个字符串
compareTo()方法为按字典顺序比较两个字符串,该比较基于字符串中各个字符的Unicode值,如果按字典顺序此String对象位于参数字符串之前,则比较结果为一个负整数;如果按字典顺序此String对象位于参数字符串之后,则比较结果为一个正整数;如果两个字符串相等,则结果为0.
语法:
str.compareTo(String otherstr)
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));
System.out.println(str + "compareTo" + str3 + ":" + str.compareTo(str3));
}
}
bcompareToa:1
bcompareToc:-1
7. 字母大小写转换
(1)toLowerCase()方法
将字符串中的所有字符从大写字母改为小写字母,如果没有转换的就返回原字符串
语法:
str.toLowerCase():str为要转换的字符
(2)toUpperCase()方法
将字符串中的小写字母改为大写字母,如果没有需要转换的字母,就返回原字符串。
语法:
str.toUpperCase():str为要转换的字符串
注意:使用这两种方法转换时,数字或非字符不受影响。
public class UpAndLower {
public static void main(String[] args) {
String str = new String("abc DEF");
String newstr = str.toLowerCase();
String newstr1 = str.toUpperCase();
System.out.println(newstr);
System.out.println(newstr1);
}
}
abc def
ABC DEF
8. 字符串分割
使用split()方法可以是字符串按指定的分割字符或字符串对内容进行分割,并将分割后的结果存放在字符数组中。
(1)split(String sign):根据给定的分割符进行拆分。
语法:
str.split(String sign)
sign为分割字符串的分隔符,也可以使用正则表达式。
(2)split(String sign, int limit):根据给定的分隔符对字符串进行拆分,并限定拆分的次数
str.split(String sign, int limit)
sign:分割字符串的分割符,也可以使用正则表达式。
limit:限制的分割次数
public class Division {
public static void main(String[] args) {
String str = new String("abc, def, ghi, gkl");
String[] newstr = str.split(",");
for (int i = 0; i < newstr.length; i++){
System.out.println(newstr[i]);
}
// 限定拆分次数的分割
String[] newstr2 = str.split(",", 2);
for (int j = 0; j < newstr2.length; j++){
System.out.println(newstr[j]);
}
}
}
abc
def
ghi
gkl
abc
def
五、格式化字符串
String类的静态format()方法用于创建格式化的字符串,format()方法有两种重载形式。
(1)format(String format, Object ···args)
用指定的格式字符串和参数返回一个格式化字符串,格式化后的新字符串使用本地默认的语言环境。
语法:
str.format(String format, Object···args)
- format:格式字符串
- args:格式字符串中由格式说明符引用的参数。如果还有格式说明符以外的参数,则忽略这些额外的参数。此参数的数目是可变的
(2)format(Local l, String format, Object···args)
l:格式化过程中要应用的语言环境,如果l为null,则不进行本地化
format:格式化字符串
args:格式字符串中由格式说明符引用的参数,如果还有格式说明符以外的参数,则忽略这些额外的参数,参数的数目是可变的。
1.日期和时间字符串格式化
(1)日期格式化
转换符 | 说明 | 示例 |
%te | 一月中的某一天 | 2 |
%tb | 指定语言环境的月份简称 | Feb、二月 |
%tB | 指定语言环境的月份全称 | February |
%tA | 指定环境中星期几的全称 | Monday、星期一 |
%ta | 指定环境中星期几的简称 | Mon、星期一 |
%tc | 包括全部日期和时间信息 | |
%tY | 4位年份 | 2008 |
%tj | 一年中的第几天 | 085 |
%tm | 月份 | 03 |
%td | 一个月中的第几天 | 02 |
%ty | 2位年份 | 08 |
import java.util.Date;
public class Eval {
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 + "日");
}
}
今年是:2018年
现在是:十二月
今年是:18日
(2)时间格式化
时间格式化转换符
import java.util.Date;
public class GetDate {
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 + "秒");
}
}
现在是:17时25分51秒
(3)格式化常见的日期组合
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);
}
}
全部的时间信息是:星期二 十二月 18 17:29:01 CST 2018
年-月-日格式:2018-12-18
2.常规类型格式化
public class General {
public static void main(String[] args) {
String str = String.format("%d", 400 / 2);
String str2 = String.format("%b", 3 > 6);
String str3 = String.format("%x", 200);
System.out.println("400的一半是:" + str);
System.out.println("3>5正确吗?" + str2);
System.out.println("200的十六进制数是:?" + str3);
}
}
400的一半是:200
3>5正确吗?false
200的十六进制数是:?c8
六、使用正则表达式
正则表达式通常被用于判断语句中,用来检查某一字符串是否满足某一格式。正则表达式是含有一些具有特殊意义字符的字符串,这些特殊字符称为正则表达式的元字符。
在正则表达式中“.”代表任何一个字符,因此在正则表达式中如果想使用普通意义的点字符“.”,必须使用转义字符“\”。
在正则表达式中可以使用方括号括起若干个字符来表示一个元字符。
[^456]:代表4、5、6之外的任何字符
[a-r]:代表a~r中的任何一个字母
[a-o&&[def]]:代表字母d、e、f(交运算)
在正则表达式中允许使用限定修饰符来限定元字符出现的次数。“A*”代表A可在字符串中出现0次或多次。
public class Judge {
public static void main(String[] args) {
// 定义要匹配email地址的正则表达式
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类,提高频繁增加字符串的效率。
public class Jerque {
public static void main(String[] args) {
String str = "";
long starTime = System.currentTimeMillis();
for (int i = 0; i < 10000; i++){
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 j = 0; j < 10000; j++){
builder.append(j);
}
endTime = System.currentTimeMillis();
time = endTime - starTime;
System.out.println("StringBuilder 消耗时间:" + time);
}
}
String 消耗时间:385
StringBuilder 消耗时间:1
可以看书StringBuilder耗费的时间很少。利用String中的方法可动态的执行添加、删除和插入等字符串的编辑操作。
(1)append()方法
该方法用于向字符串生成器中追加内容
语法:
append(content):content是要追加的内容,并且content可以是任意类型的数据或者其他对象。
(2)insert()方法
该方法用于向字符串生成器中的指定位置插入数据内容。
语法:
insert(int offset arg)
- offset:字符串生成器的对象
- arg:将插入至字符串生成器的位置。该参数可以是任何的数据类型或其他对象
(3)delete()方法
delete(int start, int end)
start:将要删除的字符串的起点位置
end:将要删除的字符串的重点位置