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。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值