JAVA进阶学习-java String类

来源:互联网 发布:三菱plc模拟量编程 编辑:程序博客网 时间:2024/05/16 23:02

注:以下内容来源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。

 

0 0