目录
String的构造
//常用的就是以下三种
//方法一:使用常量串构造
String s = "Hello"
//方法二:直接newString对象
String s = new String("Hello");
//方法三:使用字符数组构造
char[] str = {'H','e','l','l','o'};
String s = new String(str);
常用方法
对于一些常用的方法,我们需要记住。下图提到的方法都只是String类的一小部分,详细的可以查阅帮助手册
字符串比较
对于引用类型而言,==只可以比较引用的地址是否相同,是否为同一个对象。如果比较字符串的内容,String提供了一些方法
- boolean equals(Object anObject) 方法
String重写了Object类的equals方法,这个方法比较的是字符串的内容。是如何进行比较的呢?首先先判断两者地址是否相同,如果相同表示引用对象一样,内容肯定一样。如果不同,再判断equals()括号中传过来的类型是否为String类型,如果不是,返回false(类型都不一样还判断啥呢),如果是再判断两个字符串的长度是否相同,如果不同返回false,相同再按照字典序,从前往后逐个字符依次比较。 - int compareTo(String s) 方法: 按照字典序进行比较
这个方法与equals不同之处在于返回值,这个方法返回整数,比较方法如下:按照字典序逐个比较,如果遇到不同的,返回两个字符的差值,如果前k个相同则返回字符串长度的差值。 - int compareToIgnoreCase(String str) 方法:与compareTo方式相同,但是忽略大小写比较。
字符串查找
其他类型与字符串的相互转换
//其他类型转为字符串用String.valueOf方法
String s = String.valueOf(123);
//字符串转为其他类型需要用到其他类型的包装类
int num = Integer.parseInt("123");
double num1 = Double.parseDouble("12.3");
大小写转换
String s = "hello";
String s1 = s.toUpperCase();//全部变大写
System.out.println(s1);
String s2 = s1.toLowerCase();//全部变小写
System.out.println(s2);
字符串与数组的相互转换
char[] str = {'h','e','l','l','o'};
//数组转为字符串
String s = new String(str);
//字符串转为数组
char[] str1 = s.toCharArray();
字符串格式化
String s = String.format("%d年%d月%d日",2024,8,1);
System.out.println(s);
字符串替换
指定新的字符串替换掉已有的字符串,注意,替换并不是在原有基础上操作的,而是创建了一个新对象
字符串拆分
可以按照指定的字符对字符串进行拆分
- 如果划分字符是“|”,“.”,“*”,“+”,前面需要加上“\”
- 如果划分字符是“\”,需要写为“\\”
- 如果想根据多个字符进行分隔,中间可以用"|"进行分隔
字符串截取
从一个完整的字符串中截取部分内容
- 索引从0开始
- 区间为前闭后开形式[0,5)
String trim()
去掉字符串的左右两边空格,留下中间的空格
字符串常量池与不同方法创建String的区别
为了节省存储空间和运行效率,提供了字符串常量池。字符串常量池在JVM中是StringTable类,实际是一个固定大小的HashTable(一种高效用来进行查找的数据结构)
对于创建String,最开始提到了使用常量池来创建,那么有什么区别呢?请看下面图解
1.对于直接赋值String s = "hello"时,创建对象s时,会先去常量池中查找是否有相同对象,如果有相同的对象,则直接返回该对象在常量池中的引用,如果没有则会在常量池中创建一个对象并存进去,再反对一个对象的引用。
2.对于new String(“hello”)这种,首先也会去常量池检查是否存在这个对象,如果存在,会在堆中创建一个对象,如果不存在会先在常量池中创建一个对象再在堆中创建一个对象。但不管是否存在返回的都是堆内存中的引用。
intern()方法
这个方法是用来手动将String放到常量池
字符串的不可变性
上面我们也提到,对于字符串的修改并不是在原字符串上修改,而是又创建了一个新对象。那么究竟为啥不可以修改呢?
很多人认为和final有关,但是这是错的!!!
final写在类上表示这个类不可被继承,写在引用变量上指的是指向不可以改变,但指向的内容可以变。
那么究竟为啥不可变呢?原因就是前面的private,这个变量被设置为了私有,并且这个类没有设置set,get方法,我们拿不住到值怎么去修改呢!
字符串修改
上面我们说了字符串不可变,变化会创建新对象,所以我们应该避免对字符串进行修改。那么我们如何修改字符串呢?
StringBuilder和StringBuffer类
StringBuilder和StringBuffer功能类似,而且和String的最大区别在于String不可修改,而这两个类可以进行修改。
StringBuffer采用了同步处理,(我进行的时候别的线程不允许操作,我进行完了以后,别的线程才允许操作)而StringBuilder么有采用同步处理。
1.String变为StringBuilder: 利用StringBuilder的构造方法或append()方法
2.StringBuilder变为String: 调用toString()方法。