字符串是日常编码过程中,使用频率相当高的对象。
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() 在堆中创建对象) |
本次分享至此结束,希望本文对你有所帮助,若能点亮下方的点赞按钮,在下感激不尽,谢谢您的【精神支持】。
若有任何疑问,也欢迎与我交流,若存在不足之处,也欢迎各位指正!