Java中的字符串及常用方法

Java中的字符串是由双引号括起来的多个字符。
Java中的字符采用Unicode编码,所以Java字符串可以包含中文。

"Hello World"
"你好!"
""
注意:""表示空字符串,双引号中没有任何内容,空字符串不是null,空字符串是分配内存空间的,而null是没有分配内存空间的。

1 字符串

字符串可以分为可变字符串不可变字符串
String是不可变字符串
StringBufferStringBuilder是可变字符串.

1.1 String
// 创建字符串对象
String s1 = new String();
String s2 = new String("Hello World");
String s3 = new String("\u0048\u0065\u006c\u006c\u006f\u0020\u0057\System.out.println("s2 = " + s2);

System.out.println("s3 = " + s3);
char chars[] = { 'a', 'b', 'c', 'd', 'e' };
// 通过字符数组创建字符串对象
String s4 = new String(chars);
// 通过子字符数组创建字符串对象
String s5 = new String(chars, 1, 4);
System.out.println("s4 = " + s4);
System.out.println("s5 = " + s5);
byte bytes[] = { 97, 98, 99 };
// 通过byte数组创建字符串对象
String s6 = new String(bytes);
System.out.println("s6 = " + s6);
System.out.println("s6字符串长度 = " + s6.length());

输出结果:
s2 = Hello World
s3 = Hello World
s4 = abcde
s5 = bcde
s6 = abc
s6字符串长度 = 3
1.1.1 字符串池
String s7 = new String("Hello"); //使用new关键字创建 ①
String s8 = new String("Hello"); // ②
String s9 = "Hello"; //字符串常量 ③ 
String s10 = "Hello"; //④
System.out.printf("s7 == s8 : %b%n", s7 == s8);
System.out.printf("s9 == s10: %b%n", s9 == s10);
System.out.printf("s7 == s9 : %b%n", s7 == s9);
System.out.printf("s8 == s9 : %b%n", s8 == s9);

输出结果为:
s7 == s8 : false
s9 == s10: true
s7 == s9 : false
s8 == s9 : false

在这里插入图片描述

提示:
==运算符比较的是两个引用是否指向相同的对象,s7和s8指的是不同对象,s9和s10指向的是相同对象。

1.1.2 字符串拼接

两种方式:
+运算符 :可以连接任何类型数据拼接成为字符串。
concat(String str):只能拼接String类型字符串

String s1 = "Hello";
// 使用+运算符连接
String s2 = s1 + " "; 
String s3 = s2 + "World"; 
System.out.println(s3);
//共产生了三个对象

结果为:
Hello World
String s4 = "Hello";
// 使用+运算符连接,支持+=赋值运算符
s4 += " "; 
s4 += "World"; 
System.out.println(s4);

结果为:
Hello World
String s5 = "Hello";
// 使用concat方法连接
s5 = s5.concat(" ").concat("World"); 
System.out.println(s5);

结果为:
Hello World
int age = 8;
String s6= "她的年龄是" + age + "岁。"; 
System.out.println(s6);
char score = 'A';
String s7= "她的英语成绩是" + score; 
System.out.println(s7);

结果为:
她的年龄是8岁。
她的英语成绩是A
java.util.Date now = new java.util.Date(); 
//对象拼接自动调用toString()方法
String s8= "今天是:" + now; 
System.out.println(s8);

结果为:
今天是:Thu July 20 13:30:40 CST 2020

提示: Java中所有对象都有一个toString()方法,该方法可以将对象转换为字符串,拼接过程会调用该对象的toString()方法,将该对象转换为字符串后再进行拼接。

1.1.3 字符串查找

在String类中提供了indexOf和lastIndexOf方法用于查找字符或字符串,返回值是查找的字符或字符串所在的位置,-1表示没有找到。

方法返回值
int indexOf(int ch)从前往后搜索字符ch,返回第一次找到字符ch所在处的索引
int indexOf(int ch, int fromIndex)从指定的索引开始从前往后搜索字符ch,返回第一次找到字符ch所在处的索引。
int indexOf(String str)从前往后搜索字符串str,返回第一次找到字符串所在处的索引
int indexOf(String str, int fromIndex)从指定的索引开始从前往后搜索字符串str,返回第一次找到字符串所在处的索引
int lastIndexOf(int ch)从后往前搜索字符ch,返回第一次找到字符ch所在处的索引
int lastIndexOf(int ch, int fromIndex)从指定的索引开始从后往前搜索字符ch,返回第一次找到字符ch所在处的索引。
int lastIndexOf(String str)从后往前搜索字符串str,返回第一次找到字符串所在处的索引
int lastIndexOf(String str, int fromIndex)从指定的索引开始从后往前搜索字符串str,返回第一次找到字符串所在处的索引。
charAt(int index)返回索引index所在位置的字符

代码演示

String str = "Hello World,Nice to meet you!";
//获得字符串长度
int len = str.length();     // 29
//获得索引位置8的字符
char ch = str.charAt(8);  // r
//查找字符和字符串
int firstChar1 = str.indexOf('W');  // 6
int lastChat1 = str.lastIndexOf('W');
int firstStr1 = str.indexOf("ld");
int lastStr1 = str.lastIndexOf("ld");
1.1.4 字符串比较

字符串比较包括 比较相等,比较大小、比较前缀、比较后缀
1)比较相等

String s1 = new String("Hello");
String s2 = new String("Hello");
//比较字符串是否是相同的引用
System.out.println("s1==s2:"+(s1==s2)); //false

//比较字符串内容是否相等
System.out.println("s1.equals(s2) : " + (s1.equals(s2)));  //true

String s3 = "HELlo";
// 忽略大小写比较字符串内容是否相等
System.out.println("s1.equalsIgnoreCase(s3) : " + (s1.equalsIgnoreCase(s3));
 // true

// 比较大小
String s4 = "java";
String s5 = "Swift";
// 比较字符串大小 s4 > s5
System.out.println("s4.compareTo(s5) : " + (s4.compareTo(s5)));
 // 忽略大小写, 23
 比较字符串大小 s4 < s5
System.out.println("s4.compareToIgnoreCase(s5) : " (s4.compareToIgnoreCase(s5)); //-9

提示:
s4.compareTo(s5)表达式返回结果大于0,说明s4大于s5,字符在字典中顺序事实上就它的Unicode编码,先比较两个字符串的第一个字符j和S,j的Unicode编码是106,S的Unicode编码是83,所以可以得出结论s4 > s5。

1.1.5 字符串截取
方法返回值
String substring(int beginIndex)从指定索引beginIndex开始截取一直到字符串结束的子字符串。
String substring(int beginIndex, int endIndex)从指定索引beginIndex开始截取直到索引endIndex -1处的字符,注意包括索引为beginIndex处的字符,但不包括索引为endIndex处的字符
String sourceStr = "There is a string accessing example.";
// 截取example.子字符串
String subStr1 = sourceStr.substring(28); ①
// 截取string子字符串
String subStr2 = sourceStr.substring(11, 17); ②
System.out.printf("subStr1 = %s%n", subStr1);
System.out.printf("subStr2 = %s%n",subStr2);
// 使用split方法分割字符串
System.out.println("-----使用split方法-----");
String[] array = sourceStr.split(" "); ③
for (String str : array) {
	System.out.println(str);
}

输出结果:
subStr1 = example.
subStr2 = string
-----使用split方法-----
There
is
a string
accessing
example.

1.2 可变字符串

可变字符串在追加、删除、修改、插入和拼接等操作不会产生新的对象。Java提供了两个可变字符串类StringBuffer和StringBuilder,中文翻译为“字符串缓冲区”。

StringBuffer和StringBuilder具有完全相同的API,即构造方法和普通方法等内容一样。StringBuilder的中构造方法有4个:
同样适合于StringBuffer类

构造方法描述
StringBuilder()创建字符串内容是空的.StringBuilder对象,初始容量默认为16个字符。
StringBuilder(CharSequence seq)指定CharSequence字符串创建StringBuilder对象。CharSequence接口类型,它的实现类有:String、StringBuffer和StringBuilder等,所以参数seq可以是String、StringBuffer和StringBuilder等类型。
StringBuilder(int capacity)创建字符串内容是空的StringBuilder对象,初始容量由参数capacity指定的。
StringBuilder(String str)指定String字符串创建StringBuilder对象。

提示:
字符串长度和字符串缓冲区容量区别。字符串长度是指在字符串缓冲区中目前所包含字符串长度,通过length()获得;字符串缓冲区容量是缓冲区中所能容纳的最大字符数,通过capacity()获得。当所容纳的字符超过这个长度时,字符串缓冲区自动扩充容量,但这是以牺牲性能为代价的扩容。

字符串追加——append
//添加字符串、字符
StringBuilder sbuilder1 = new StringBuilder("Hello"); 
sbuilder1.append(" ").append("World"); 
sbuilder1.append('.'); 
System.out.println(sbuilder1); //Hello World.
StringBuilder sbuilder2 = new StringBuilder();
Object obj = null;
//添加布尔值、转义符和空对象
sbuilder2.append(false).append('\t').append(obj); 
System.out.println(sbuilder2); // false null
//添加数值
StringBuilder sbuilder3 = new StringBuilder();
for (int i = 0; i < 10; i++) {
	sbuilder3.append(i);
} 
System.out.println(sbuilder3);  //0123456789
字符串插入、删除、替换
方法描述
StringBuilder insert(int offset, String str)在字符串缓冲区中索引为offset的字符位置之前插入str,insert有很多重载方法,可以插入任何类型数据。
StringBuffer delete(int start, int end)在字符串缓冲区中删除子字符串,要删除的子字符串从指定索引start开始直到索引end - 1处的字符。start和end两个参数与substring(int beginIndex, intendIndex)方法中的两个参数含义一样。
StringBuffer replace(int start, int end, String str)字符串缓冲区中用str替换子字符串,子字符串从指定索引start开始直到索引end - 1处的字符。start和end同delete(int start, int end)方法。
// 原始不可变字符串
String str1 = "Java C";
// 从不可变的字符创建可变字符串对象
StringBuilder mstr = new StringBuilder(str1);
// 插入字符串
mstr.insert(4, " C++"); 
System.out.println(mstr); // Jave C++ C

// 具有追加效果的插入字符串
mstr.insert(mstr.length(), " Objective-C"); 
System.out.println(mstr); //Java C++ C Objective-C

// 追加字符串
mstr.append(" and Swift");
System.out.println(mstr);//Java C++ C Objective-C and Swift

// 删除字符串
mstr.delete(11, 23); 
System.out.println(mstr); //Java C++ C and Swift
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小曾同学.com

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值