目录
一、String类
1、基本介绍:
- ·String s5=new String(byte[] b);
String类具有以下特性:
不可变性(Immutable): String对象一旦创建,其内容就不能被修改。任何对String对象的操作都会创建一个新的String对象,原始对象保持不变。这样的设计使得String在多线程环境下更加安全,因为它们不可变,不会被其他线程修改。
字符串池(String Pool): Java中的字符串池是一种特殊的内存区域,用于存储字符串常量。当创建一个新的字符串常量时,JVM会首先检查字符串池,如果池中已存在相同内容的字符串,则返回池中的引用,否则会在池中创建一个新的字符串并返回引用。这可以节省内存空间,提高性能。
性能优化: 由于String的不可变性,一些常用的字符串操作(如拼接、截取、替换等)会通过创建新的String对象来实现,这可能会导致内存和性能方面的开销。为了优化性能,Java提供了StringBuilder和StringBuffer等可变的字符串类,用于频繁修改字符串内容。
重载了"+"操作符: String类重载了"+"操作符,使得字符串可以通过"+"连接起来,形成新的字符串。
支持正则表达式: String类提供了丰富的正则表达式支持,可以进行模式匹配、查找和替换等操作。
Unicode支持: String类支持Unicode字符集,可以表示世界上几乎所有的字符。
equals()方法重写: String类重写了equals()方法,用于比较两个字符串的内容是否相等。
hashCode()方法重写: String类重写了hashCode()方法,用于计算字符串的哈希码,可以用于哈希表等数据结构中。
2、String类的常见方法:
package String_;
public class String01 {
public static void main(String[] args) {
String str1="hello";
String str2="Hello";
System.out.println(str1.equals(str2));//f, equals方法比较内容是否相同,区分大小写
System.out.println(str1.equalsIgnoreCase(str2));//t, equalsIgnoreCase方法比较内容是否相同,不区分大小写
System.out.println(str1.indexOf('e'));//输出:1,该字符第一次出现的地址
System.out.println(str1.lastIndexOf('e'));//输出:1,该字符最后一次出现的地址
System.out.println(str1.indexOf("el"));//输出:1,也可以是查找字符串第一个字母的地址
System.out.println(str1.lastIndexOf("el"));//输出:1,查找字符串第一个字母最后一次出现的地址
System.out.println(str1.substring(2));//输出:llo,截取索引2后面所有的字符
System.out.println(str1.substring(0,2));//输出:he,截取索引为0到索引为2的所有字符
}
}
package String_;
public class String01 {
public static void main(String[] args) {
String s="hello";
System.out.println(s.toUpperCase());//HELLO
System.out.println(s.toLowerCase());//hello
s=s.concat(" cheer ").concat(" up ").concat("TV");
System.out.println(s);//hello cheer up TV
System.out.println(s.replace("cheer","CHEER"));//hello CHEER up TV
//注意:s.replace()方法执行后对原来的s没有任何影响
String poem="锄禾日当午,汗滴禾下土,谁知盘中餐,粒粒皆辛苦";
String[] split=poem.split(",");//以逗号为标准对poem进行分割,返回一个数组
for(int i=0;i<split.length;i++){
System.out.println(split[i]);
}
//输出:
//锄禾日当午
//汗滴禾下土
//谁知盘中餐
//粒粒皆辛苦
//注意:在对字符串进行分割时,如果有特殊字符,需要加入转义字符\
//如要以"\\"为标准分割,那应该是String[] split=poem.split("\\\\");
//因为一个\对应一个\,两个\\加起来就一共是\\\\个了
char[] ch=s.toCharArray();//把字符串转换成字符数组
for(int i=0;i<ch.length;i++){
System.out.println(ch[i]);
}
String s1="hello";
String s2="hi";
System.out.println(s1.compareTo(s2));//输出:-4 //因为e-i=-4
//前>后,返回正数;后>前,返回负数,前=后,返回0
String s3="hello";
String s4="h";
System.out.println(s3.compareTo(s4));//输出:4 //因为s3.length-s4.length=4
//如果前面部分都相同,如hello和he比较,则是则返回的是字符串长度的差
}
}
package String_;
public class String01 {
public static void main(String[] args) {
String name="tom";
int age=10;
double score=98.8;
char gender='男';
String s="姓名:%s,年龄:%d,成绩:%.2f,性别:%c";//占位符,由后面的变量来替换
System.out.println(String.format(s,name,age,score,gender));
//输出:姓名:tom,年龄:10,成绩:98.80,性别:男
}
}
二、StringBuffer类
1、基础知识
- 1)java.lang.StringBuffer代表可变的字符序列,可以对字符串内容进行增删
- 2)很多方法与String相同,但StringBuffer是可变长度的
- 3)StringBuffer是一个容器
- 4)StringBuffer的直接父类是AbstractStringBuilder
- 5)StringBuffer实现了Serializable, 说明StringBuffer可以串行化,即可以网络传输
- 6)父类AbstractStringBuilder有属性char[] value,不是final,该value数组存放字符串内容,引出的是存放在堆中的(不再是常量池)
- 7)StringBuffer是一个final类,不能被继承
2、构造方法
StringBuffer stringBuffer=new StringBuffer();
StringBuffer stringBuffer1=new StringBuffer(100);
StringBuffer stringBuffer2=new StringBuffer("hello");
3、常见方法
package String_;
public class String01 {
public static void main(String[] args) {
StringBuffer s=new StringBuffer("hello");
s.append(" h");
s.append("i").append(" 100").append(true).append(10.5);//追加
System.out.println(s);//hello hi 100true10.5
s.delete(2,3);//删除
System.out.println(s);//helo hi 100true10.5
s.replace(0,5,"cheer");//替换
System.out.println(s);//cheerhi 100true10.5
s.indexOf("c");//查找
System.out.println(s);//输出:0
s.insert(5," up! ");//增加
System.out.println(s);//输出:cheer up! hi 100true10.5
}
}
4、String 和StringBuffer的区别
三、StringBuilder类
- 1)是一个可变的字符序列,此类提供一个与StringBuffer兼容的API,但不保证同步(StringBuilder不是线程安全),该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用时,如果可能,建议优先采用该类,因为在大多数实现中,它比StringBuffer要快
- 2)在StringBuilder上的主要操作是append和insert方法,可重载这些方法,以接受任意类型的数据
- 3)StringBuilder和StringBuffer均代表可变的字符序列,方法是一样的,所以使用和StringBuffer一样
- 4)StringBuilder是final
- 5)继承了AbstractStringBuilder,属性char[] value,内容存到value,因此字符序列是在堆中
- 6)实现了Serializable接口,StringBuilder对象可以串行化,即可以网络传输,可以保存到文件。序列化(所谓序列化即可以保存类型和数据本身)
- 7)StringBuilder的方法,没有做互斥处理,即没有synchronized关键字,因此在单线程的情况下使用