字符串是日常编码过程中,使用频率相当高的对象。
String 对象其实不可变的,每次修改字符串,实际是创建了一个新的 String 对象。
public class Immutable {
public static String upCase(String str) {
return str.toUpperCase();
}
public static void main(String[] args) {
String a = "howdy";
String b = upCase(a);
System.out.println("a====="+a);
System.out.println("b====="+b);
}
}
a=====howdy
b=====HOWDY
上述例子中,当字符串 a 传递至 upCase() 方法时,实际传递的是一份 a 的拷贝,即使引用 a 的值被改变,也不会影响 a 的原始值。
当我们使用 + 号拼接对象时,实际上会生成多次字符串对象。
String str = "god " + " is " + " a " + " girl ";
上述例子拼接了3次字符串,故会生成3个不同的 String 对象:"god is " 、"god is a " 、 "god is a girl "。
当你需要多次拼接字符串的时候,更推荐使用 StringBuilder 来拼接字符串。
StringBuilder builder = new StringBuilder();
builder.append("god ");
builder.append(" is ");
builder.append(" a ");
builder.append(" girl ");
System.out.println(builder);
god is a girl
使用 + 号拼接字符串时,编译器底层也是使用的 StringBuilder 对象来拼接字符串,但每次使用 + 号,都是额外生成一个 StringBuilder 对象。
当使用 StringBuilder 来拼接字符串时,无论使用 append() 方法拼接了多少次字符串,最终都只会生成一个 StringBuilder 对象,故此类方法更加高效。
不过,若你有线程安全的需求,则需要使用 StringBuffer 来拼接字符串,使用方式和 StringBuilder 类似。
StringBuffer 内所有方法都有 synchronized 关键字修饰,故其是线程安全的,但其效率不如 StringBuilder。
StringBuffer buffer = new StringBuffer();
buffer.append("god ");
buffer.append(" is ");
buffer.append(" a ");
buffer.append(" girl ");
System.out.println(buffer);
god is a girl
最后一起来看看String对象具备的基本方法:
| 方法 | 用途 |
|---|---|
| length() | 获取字符个数 |
| charAt() | 返回该字符索引位置,不存在则返回 -1 |
| getChars(),getBytes() | 将指定区间的每个字符转成 char 或 byte 数组 |
| toCharArray() | 将字符串中的每个字符整合成 char 数组 |
| equals() | 判断两个字符串内容是否相同,相同返回 true,否则返回 false |
| compareTo() | 根据 ASCII 码顺序依次比较两个字符串中的每个字符,字符串相等则返回0,大于返回正数,小于返回负数 |
| contains() | 判断字符串是否包含某个字符串片段,包含返回 true ,反之为 false |
| contentEquals() | 判断两个对象是否相等,不仅可以判断 String 对象,还可以用于 StringBuffer、StringBuilder 与 String 对象值的判断,equals() 只能判断 String 对象是否相等 |
| equalsIgnoreCase() | 判断两个字符串是否相等,忽略大小写 |
| regionMatcher() | 判断某个区间内的字符串是否相等,相等返回 true,反之为 false |
| startsWith() | 字符串以指定字符开始则返回 true ,否则为 false |
| endsWith() | 字符串以指定字符结尾则返回 true ,否则为 false |
| indexOf(),lastIndexOf() | 从头部或者尾部开始检索指定字符串,找到则返回下标,否则返回 -1 |
| subString()(subSequence()) | 从指定位置返回新的字符串,返回的字符串不包含终点处下标的字符 |
| concat() | 连接两个字符串 |
| replace() | 替换 String 对象内的指定字符 |
| toLowerCase(),toUpperCase() | 返回一个新的全大写或全小写字符串 |
| trim() | 去除字符串前后两端的空格 |
| valueOf() | 将 Object 、char 数组、int、double、long、float、boolean 类型的对象转换成 String 对象 |
| intern() | 判断字符串是否在常量池,存在则返回字符串在常量池中的引用,不存在则先将字符串添加至常量池再返回引用(String a = “abc” 为在常量池中创建对象,new String()、new StringBuilder()、new StringBuffer() 在堆中创建对象) |
本次分享至此结束,希望本文对你有所帮助,若能点亮下方的点赞按钮,在下感激不尽,谢谢您的【精神支持】。
若有任何疑问,也欢迎与我交流,若存在不足之处,也欢迎各位指正!
本文探讨了Java中String对象的不可变性,说明了使用`+`拼接字符串会导致多次对象创建,推荐使用StringBuilder或StringBuffer进行高效拼接。同时,列举了String对象常用的方法如length()、indexOf()等,并提醒在多线程环境下选择StringBuffer以确保线程安全。了解这些细节对于优化代码性能至关重要。

被折叠的 条评论
为什么被折叠?



