JAVA进阶学习-java String类,
JAVA进阶学习-java String类,
注:以下内容来源http://www.w3cschool.cc/java
Java String类
不可变String
String对象是不可变的。查看JDK文档你就会发现,String类每一个看起来会修改String值的方法,实际上都是创建了一个全新的String对象,以包含修改的字符串内容,而最初的String对象则丝毫未动。
看下面的代码:
public class Immutable{
public static String upcase(String s){
return s.toUpperCase();
}
public static void main(String args[]){
String q="howdy";
System.out.println(q);
String qq=upcase(q);
System.out.println(qq);
System.out.println(q);
}
}
输出结果:
howdy
HOWDY
howdy
当把q传给upcase()方法时,实际传递的是引用的一个拷贝。其实,每当把String对象作为方法的参数时,都会复制一份引用,而该引用所指的对象其实一直待在单一的物理位置上,从未动过。
重载“+”与StringBuilder
在java中仅有两个重载操作符为String的“+”与“+=”。
public class Test{
public static void main(String args[]){
String mango="mango";
String s="abc"+mango+"def"+47;
System.out.println(s);
}
}
输出结果:
abcmangodef47
想了解以上代码时如何工作的,可以用JDK自带的工具javap来反编译以上代码,命令:javap -c Test
只显示main部分字节码:
public static void main(java.lang.String[]);
Code:
0: ldc #2 // String mango
2: astore_1
3: new #3 // class java/lang/StringBuilder
6: dup
7: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V
10: ldc #5 // String abc
12: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
15: aload_1
16: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
19: ldc #7 // String def
21: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
24: bipush 47
26: invokevirtual #8 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
29: invokevirtual #9 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
32: astore_2
33: getstatic #10 // Field java/lang/System.out:Ljava/io/PrintStream;
36: aload_2
37: invokevirtual #11 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
40: return
在这个例子中,编译器创建了一个StringBuilder对象,用以构造最终的String,并为每个字符串调用一次StringBuilder的append()方法,总计四次。最后调用toString()生成结果,并存为s。
相关文章
- 暂无相关文章
用户点评