Java字符串的不可变性
String s1 = "我爱你";
String s2 = "我爱你";
String s3 = new String("我爱你");
String s4 = new String("我爱你");
String s5 = s1 + "么么哒";
String s6 = s1 + "么么哒";
//多次出现的字符串常量,java编译器只创建一个,所以返回true(String源码中可以看出String是final类型)
System.out.println("s1和s2内存地址相同吗?" + (s1 == s2));
//比较字符串s1和s3,两者不是同一对象,所以返回false
System.out.println("s1和s3内存地址相同吗?" + (s1 == s3));
//比较字符串s3和s4,两者不是同一对象,所以返回false
System.out.println("s3和s4内存地址相同吗?" + (s4 == s3));
//比较字符串s5和s6,s5和s6的值被修改,其实实质是创建了新的字符串对象
System.out.println("s5和s6内存地址相同吗?" + (s5== s6));
//比较字符串s5和s6的值是否相同
System.out.println("s5和s6的值相同吗?" + (s5.equals(s6)));
注意:
① 一旦一个字符串在内存中创建,则这个字符串将不可改变。如果需要一个可以改变的字符串,我们可以使用StringBuffer或者StringBuilder
②每次 new 一个字符串就是产生一个新的对象,即便两个字符串的内容相同,使用 ”==” 比较时也为 ”false” ,如果只需比较内容是否相同,应使用 ”equals()” 方法
java中String常用方法
//定义一个字符串
String str="我爱 我的 国家";
//打印字符串长度
System.out.println("字符串的长度:"+str.length());
//查找字符‘国’的位置
System.out.println("字符‘国’的位置:"+str.indexOf('国'));
//查找字符串'我爱我'的位置,没有默认返回-1
System.out.println("查找字符串'我爱我'的位置:"+str.indexOf("我爱我"));
//按空格将字符串拆分成一个数组
String[] arr = str.split(" ");
System.out.println("按空格拆分成数组:"+ Arrays.toString(arr));
System.out.println();
//获取索引[3,5)的位置
System.out.println("获取位置[3,5)之间的字符串:"+str.substring(3,5));
//将字符串转换为小写
System.out.println("将字符串转换为小写:"+str.toLowerCase());
//获取索引的位置为1的字符
System.out.println("索引的位置为1的字符:"+str.charAt(1));
//将字符串转换为byte[],并打印输出
byte[] bytes = str.getBytes();
for(byte b:bytes){
System.out.print(b+",");
}
System.out.println();
Java 中的 StringBuilder 类
在Java中,除了可以使用 String 类来存储字符串,还可以使用 StringBuilder 类或 StringBuffer 类存储字符串
String str = "我爱你";
System.out.println(str + "我的China");
System.out.println(str);
//StringBuilder
StringBuilder stringBuilder = new StringBuilder("我爱你");
System.out.println(stringBuilder.append("我得China"));
System.out.println(stringBuilder);
//插入
stringBuilder.insert(3, "啊");
System.out.println(stringBuilder);
打印结果:
我爱你我的China
我爱你
我爱你我得China
我爱你我得China
我爱你啊我得China
从运行结果中我们可以看到,程序运行时会额外创建一个对象,保存 “我爱你”。当频繁操作字符串时,就会额外产生很多临时变量。使用 StringBuilder 或 StringBuffer 就可以避免这个问题。至于 StringBuilder 和StringBuffer ,它们基本相似,不同之处,StringBuffer 是线程安全的,而 StringBuilder 则没有实现线程安全功能,所以性能略高。因此一般情况下,如果需要创建一个内容可变的字符串对象,应优先考虑使用 StringBuilder 类。