一、String
1.字符串不可变性,在Java里,一旦创建了String类,其类型是不可变的。
String str1 = "hello java ";
System.out.println(str1 + str1.hashCode());
str1 += "Hi java ";
System.out.println(str1 + str1.hashCode());
输出结果:
尽管成功打印出拼接的字符串,但是其哈希码不一样,也就是说两次的str1的地址并不一样,即这是两个不同的对象
其原因是Java 里对字符串进行 “+” 拼接时,实际是调用了concat()方法,其返回的是一个新的字符串实例。
str1 = str1.concat("Hi java ");
str1 += "Hi java";
这两句是一样的结果。
2.字符串池
在Java里,相容内容的字符串,其是相同的对象。如以下str1 和 str2 指向的是同一个对象。
String str1 = "hello java ";
String str2 = "hello java ";
System.out.println(str1 == str2); //这里不是判断两个字符串内容相等,而是判断是否指向同一个对象
//判断两个字符串是否相等用str1.equals
System.out.println(str1.hashCode());
System.out.println(str2.hashCode());
结果:
3.String类常用API
- 字符串比较
- boolean equals(Object other) - 若字符串与other 相等,返回 true
- boolean eaualsIgnoreCase(String other) - 忽略大小写的字符串比较
- boolean startsWith(String prefix)
- boolean endsWith(String suffix) - 如果字符串以。。。开头或结尾,返回true
- int compareTo(String other) - 字符串比较大小分别返回小于0,0,大于0的整数
- boolean contains(String str) - 判断str是否为字符串的子串,返回true(包含)
2. 获取子串的方法
- int indexOf(String str) - 返回字符串中出现的第一个字符串str下标,没有匹配返回-1
- int indexOf(String str, int fromIndex) - 返回字符串中fromIndex之后出现的第一个ch下标,没有匹配返回-1
- int indexOf(int cp) - 返回字符串中出现的第一个字符cp(ASCII码)的下标
- int indexOf(int cp, int fromIndex)
- int lastIndexOf(String str) - 返回字符串中出现最后一个字符串str的下标
- int lastIndexOf(String str int fromIndex)
- int lastIndexOf(int cp) - 返回字符串中出现最后一个字符cp(ASCII码)的下标
- int lastIndexOf(int cp, int fromIndex)
- String substring(int beginIndex) - 返回一个新的字符串,内容为该字符串从beginIndex到字符串的结尾
- String substring(int beginIndex, int endIndex) - 返回一个新的字符串,内容为该字符串从beginIndex到endIndex的内容
3. 其他方法
- int length() - 返回字符串的长度
- char charAt(int index) - 返回指定index的字符
- String toLowerCase()
- String toUpperCase() - 返回一个新的字符串,其为该字符串中原始字符为小写的改成大写
- String trim() - 返回一个新的字符串,这个字符串将删除原始字符串头部和尾部的空格
- String concat(String str) - 将此字符串拼接为一个新的字符串
- char[] toChatArray() - 将此字符串转换为一个新的字符数组
- byte[] getBytes() - 将此字符串转换为一个新的byte型数组
二、StringBuffer/StringBuilder
1.String类与StringBuffer/StringBuilder的区别
String类里的字符串是不可以更改的,而实际上我们会有很多字符串拼接的操作,而一旦进行String类的拼接即用“+=”或concat方法拼接字符串,是会产生新的字符串类型,这将会大大消耗系统资源,而StringBuffer/StringBuilder是可以直接修改对象,不会创建新的对象,这样就节省了系统资源的开销而StringBuffer与StringBuilder相比,StringBuffer是线程安全的,而StringBuilder是非线程安全的,相应的StringBuilder会比StringBuffer快一丢丢,所以这里就只学习了StringBuffer
下面对字符串进行拼接并打印出消耗时间感受两者的区别
final long CIRCLE = 100000;
String str1 = "";
long startTime = System.currentTimeMillis();
for(int i = 0; i < CIRCLE; i++) {
str1 += "+";
}
long endTime = System.currentTimeMillis();
System.out.println("String类:" + (endTime - startTime) + "ms");
StringBuffer str2 = new StringBuffer();
startTime = System.currentTimeMillis();
for(int i = 0; i < CIRCLE; i++) {
str2.append("+");
}
endTime = System.currentTimeMillis();
System.out.println("StringBuffer类:" + (endTime - startTime) + "ms");
结果如图:
2.StringBuffer的API
StringBuffer只负责字符串改长,一些字符串的比较要转换成String类进行操作
- StringBuffer - 构造方法,默认的buffer是十六个字节,可以自己指定buffer的大小。
- append() - StringBuffer的拼接方法,可拼接字符串、字符、ASCII码
- equals() - StringBuffer的equals方法是比较的地址,要比较StringBuffer的字符串需要转化成String类,如
StringBuffer str1 = new StringBuffer("StringBuffer");
StringBuffer str2 = new StringBuffer("StringBuffer");
System.out.println(str1.toString().equals(str2.toString()));
- reverse() - 反转字符串序列
- delete(int start, int end) - 移除此字符串中的字符
- insert(int offset, String str) - 将字符串str插入到字符序列中,有多个重载的方法
- replace(int start, int end, String str) - 使用给定的字符串str替换字符串序列中的字符
- setCharAt(int index, int char) - 在指定索引位置设定字符
- int capacity() - 返回StringBuffer当前的缓存容量
- setlength(int newLength) - 设置StringBuffer的新长度
- trimToSize() - 若缓冲区大于其当前的字符串,可调整大小,以节省空间