1.String常用方法
1.1三种常用构造方法
1. String s1="hello";
2. String s2=new String("world");
3. char []str={'h','e','l','l','o',' ','w','o','r','l','d'};
String s3=new String(str);
1.2String对象的比较
==比较
对于内置类型来说,“==”比较的是两端变量存储的值是否相同
对于引用类型来说,“==”比较的是两端变量指向的地址值是否相同
对于内置类型来说,存储的内容在栈区
对于引用类型来说,存储的内容在堆区,而栈区存储的是堆区对象的地址
这样一来“==”就是比较的是栈区的内容
equals比较
在String类当中,重写了Object类中的equals方法,Object类中的equals方法默认是使用==进行比较的,返回值为boolean类型
equals方法的使用格式:
对象1.equals(对象2)
String类中equals方法的比较规则:
1.判断对象1和对象2是否为同一对象,是就返回true
2.判断对象2是否为String类型的对象,是就继续比较,不是就返回false
3.获取对象1和对象2的长度,相同就继续比较,否则返回false
4.按字典序进行比较,从前往后挨个比较
compareTo比较
与equals不同的是,compareTo的返回值是int类型
对象1.compareTo(对象2)
String类中compareTo的比较规则:
从前往后依次比较,遇见不同返回对象1与对象2对应字符的差值,如果对象1比较完了,返回两个字符串相差的字符数,如果对象2比较完了,则返回两者字符串相差的字符数的相反数
compareToIgnoreCase比较
与compareTo的比较方式相同,但是忽略了大小写
1.3字符串查找
char charAt(int index)
index为需要查找的字符串的下标,返回该下标的字符,如果越界访问,则抛出IndexOutOfBoundsException异常
indexOf
indexOf提供了多种重载方法
indexOf是查找某个字符或字符串从0下标或从指定下标开始,返回第一次出现位置的下标
lastIndexOf
lastIndex与index的重载参数列表和返回值完全相同
lastIndexOf是从后往前查,返回目标值第一次出现的下标
1.4转化
1.4.1各种数据类型转换为字符串
valueOf
字符串转数字(parse和valueOf)
int a=Integer.valueOf("10");
System.out.println(a);
int a1=Integer.parseInt("100");
System.out.println(a1);
double b=Double.valueOf("11.21");
System.out.println(b);
double b1=Double.parseDouble("112.12");
System.out.println(b1);
1.4.2大小写转换
转小写:toLowerCase
转大写:toUpperCase
String str1="Hello";
String str2="World";
System.out.println(str1.toLowerCase());//大写转小写
System.out.println(str2.toUpperCase());//小写转大写
1.4.3字符串转数组
toCharArray
String str1="Hello";
char []str0= str1.toCharArray();
1.5格式化
format
System.out.println(String.format("%d年%d月%d日",2024,5,30));
1.6字符串的替换
替换所有:replaceAll
替换首个:replacFirst
String str6="hhhhashaadhahhasshhh";
String str7="AAAAAAAAAAAdasadsdd";
str6.replaceAll("h","H");//将str6中的所有“h”替换为“H”
str7.replaceFirst("AA","EE");//将str7中的首个“AA”替换为“EE”
1.7字符串分割
分割:split
String str8="HHH0AAA0SSS0DDD0FFF";
String[]ss1=str8.split("0");
for (int i = 0; i < ss1.length ; i++) {
System.out.println(ss1[i]);
}
部分分割:split的第二个参数为分割几段
String str8="HHH0AAA0SSS0DDD0FFF";
String[]ss1=str8.split("0",2);
for (int i = 0; i < ss1.length ; i++) {
System.out.println(ss1[i]);
}
注意事项:
1. 字符"|","*","+"都得加上转义字符,前面加上 "\\" .
2. 而如果是 "\" ,那么就得写成 "\\\\" .
3. 如果一个字符串中有多个分隔符,可以用"|"作为连字符
String str8="HHH0AAA0SSKS0DDKD0FFF"; String[]ss1=str8.split("0|K"); for (int i = 0; i < ss1.length ; i++) { System.out.println(i+ss1[i]); }
1.8字符串的截取
字符串截取:substring
String str9="hello world";
System.out.println(str9.substring(4));//截取从4下标开始后的字符串
System.out.println(str9.substring(3,5));//截取从3下标开始,5下标结束的字符串,左闭右开
1.9去除字符串左右两端的空格
String str10=" weq weq eda eqew ";
System.out.println(str10.trim());
2.字符串的修改
注意:要尽量避免对String类型的对象进行修改,因为String类型的对象时不能修改的,所有Sting类型对象修改的结果都是需要创建新的String对象,这样效率是非常低下的
public static void main(String[] args) {
long start = System.currentTimeMillis();//获取当前时间戳,单位(毫秒)
String s = "";
for(int i = 0; i < 10000; ++i){
s += i;
}
long end = System.currentTimeMillis();
System.out.println(end - start);//运行的时间差
start = System.currentTimeMillis();
StringBuffer sbf = new StringBuffer("");
for(int i = 0; i < 10000; ++i){
sbf.append(i);
}
end = System.currentTimeMillis();
System.out.println(end - start);
start = System.currentTimeMillis();
StringBuilder sbd = new StringBuilder();
for(int i = 0; i < 10000; ++i){
sbd.append(i);
}
end = System.currentTimeMillis();
System.out.println(end - start);
}
如果要频繁修改字符串的值,建议调用StringBuilder中的append方法,这个方法在使用时不会创建新的String类型对象
补充:字符串的不可变性
因为String类型的对象是不可被修改的,什么原因呢?
String类是被final修饰的
在String类里字符串是被byte类型的数组存储的
这个数组被final和private修饰
public final class String{ private final byte[] value; }
final修饰的类是不可被继承的
final修饰的数组表示value这个变量指向的地址不能被修改,而地址指向的字符元素是可被修改的
字符串不可变性的真正原因是被private修饰,被private修饰的变量只能在本类中使用,而String里没有getter和setter方法,所以外界就不能对其修改