一、String为不可变对象测试
这里的切割是创建了一个新的对象储存切割的内容
String s1 = new String("abcdef");
String s2 = s1.substring(2, 4);
//打印:ab199863
System.out.println(Integer.toHexString(s1.hashCode()));
// 打印:c61, 显然s1和s2不是同一个对象
System.out.println(Integer.toHexString(s2.hashCode()));
二、字符串常量拼接
1、编译器做了优化,直接在编译的时候将字符串进行拼接
String str1="hello" + " java";
String str2 = "hello java";
System.out.println(str1==str2);
2、编译的时候不知道变量中存储的是什么,所以没办法在编译的时候优化
String str1="hello" + " java";
String str5 = str3+str4;
System.out.println(str5==str1); //不知道变量里面存储的是什么,为false
System.out.println(str5.equals(str1)); //判断里面内容相同通过equals
三、StringBuffer/StringBuilder基本用法
1、增
- 增加在字符串末尾
StringBuilder sb = new StringBuilder();
for(int i=0;i<26;i++) {
char temp = (char)('a'+i);
sb.append(temp);
}
- 插入
sb.insert(5,'月'); //插入一个
sb.insert(1, '喔').insert(4,'年').insert(10,'里'); //连续插入多个
2、删
- 删除单个字符
sb.deleteCharAt(0)//删除某个字符
sb.deleteCharAt(1).deleteCharAt(10).deleteCharAt(15); //删除多个字符
- 删除子字符串
sb.delete(1, 10); //删除子字符串
3、改
sb.setCharAt(3, '哈');
4、本身逆序
sb.reverse();
5、查
sb.charAt(0)
四、注意
1. String:不可变字符序列。
2. StringBuffer:可变字符序列,并且线程安全,但是效率低。
3. StringBuilder:可变字符序列,线程不安全,但是效率高(一般用它)。
4.在循环中不去用str8+=i,又创建很多个对象浪费空间还花时间较长
str8 = str8 +i; 实际上原来字符串对象已经丢弃了,现在又产生了另一个字符串。 如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率
for (int i = 0; i < 5000; i++) {
str8 = str8 + i;//相当于产生了10000个对象
}