String反汇编的疑问?

liu15073458538 2017-07-29 10:11:39
public class Test03 {
public static void main(String[] args) {
String str2 = new String("str") + new String("01");
str2.intern();
String str1 = "str01";

System.out.println(str2 == str1); // true
}
}



.source Test03.java
.class public super com/atguigu/string/Test03
.super java/lang/Object


.method public <init> ()V
.limit stack 1
.limit locals 1
.var 0 is this Lcom/atguigu/string/Test03; from l0 to l5
.line 3
l0: aload_0
l1: invokespecial java/lang/Object/<init> ()V
l4: return

.end method

.method public static main ([Ljava/lang/String;)V
.limit stack 5
.limit locals 3
.var 0 is args [Ljava/lang/String; from l0 to l60
.var 1 is str2 Ljava/lang/String; from l35 to l60
.var 2 is str1 Ljava/lang/String; from l43 to l60
.line 5
l0: new java/lang/StringBuilder
l3: dup
l4: new java/lang/String
l7: dup
l8: ldc "str"
l10: invokespecial java/lang/String/<init> (Ljava/lang/String;)V
l13: invokestatic java/lang/String/valueOf (Ljava/lang/Object;)Ljava/lang/String;
l16: invokespecial java/lang/StringBuilder/<init> (Ljava/lang/String;)V
l19: new java/lang/String
l22: dup
l23: ldc "01"
l25: invokespecial java/lang/String/<init> (Ljava/lang/String;)V
l28: invokevirtual java/lang/StringBuilder/append (Ljava/lang/String;)Ljava/lang/StringBuilder;
l31: invokevirtual java/lang/StringBuilder/toString ()Ljava/lang/String;
l34: astore_1
.line 6
l35: aload_1
l36: invokevirtual java/lang/String/intern ()Ljava/lang/String;
l39: pop
.line 7
l40: ldc "str01"
l42: astore_2
.line 9
l43: getstatic java/lang/System/out Ljava/io/PrintStream;
l46: aload_1
l47: aload_2
l48: if_acmpne l55
l51: iconst_1
l52: goto l56
l55: iconst_0
l56: invokevirtual java/io/PrintStream/println (Z)V
.line 10
l59: return

.end method


10: new java/lang/StringBuilder
13: dup
14: new java/lang/String
17: dup
18: ldc "str"
110: invokespecial java/lang/String/<init> (Ljava/lang/String;)V
l13: invokestatic java/lang/String/valueOf (Ljava/lang/Object;)Ljava/lang/String;
116: invokespecial java/lang/StringBuilder/<init> (Ljava/lang/String;)V
119: new java/lang/String
122: dup
123: ldc "01"
125: invokespecial java/lang/String/<init> (Ljava/lang/String;)V
128: invokevirtual java/lang/StringBuilder/append (Ljava/lang/String;)Ljava/lang/StringBuilder;
131: invokevirtual java/lang/StringBuilder/toString ()Ljava/lang/String;
134: astore_1


我想知道为什么这里需要valueof?
String str2 = new String("str") + new String("01");等同什么?

String str = "str";
String str03 = str + "01";
等同于String str03 = new StringBuilder(String.valueOf(str)).append("01").toString();
这里我能理解"str1"是字符串常量,通过valueOf将"str1"转换为String对象
...全文
176 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
liu15073458538 2017-07-29
  • 打赏
  • 举报
回复
引用 6 楼 shansongjia 的回复:
string的相加其实最后会调用stringbuilder的append方法,然后看这句 invokestatic java/lang/String/valueOf (Ljava/lang/Object;)Ljava/lang/String; 这里传进来的是object,而stringbuilder的源码是这样写的:

 public StringBuilder append(Object obj) {  
115     return append(String.valueOf(obj));  
116     }  
117    
118     public StringBuilder append(String str) {  
119     super.append(str);  
120         return this;  
121     }  
当传进来的是object时,会先调用valueOf转成string
最后应该是这个样子
public class Test03 {
	public static void main(String[] args) {
		String str2 = new String("str") + new String("01");
		str2.intern();
		String str1 = "str01";
		
		System.out.println(str2 == str1);    // true
	}
}

// String var1 = new String("str");
// StringBuilder sb = new StringBuilder(String.valueOf(var1));
// String var2 = new String("01");
// String str2 = sb.append(var2).toString();
liu15073458538 2017-07-29
  • 打赏
  • 举报
回复
引用 6 楼 shansongjia 的回复:
string的相加其实最后会调用stringbuilder的append方法,然后看这句 invokestatic java/lang/String/valueOf (Ljava/lang/Object;)Ljava/lang/String; 这里传进来的是object,而stringbuilder的源码是这样写的:

 public StringBuilder append(Object obj) {  
115     return append(String.valueOf(obj));  
116     }  
117    
118     public StringBuilder append(String str) {  
119     super.append(str);  
120         return this;  
121     }  
当传进来的是object时,会先调用valueOf转成string
thanks
zhailiangjava 2017-07-29
  • 打赏
  • 举报
回复
Buguanjia-Ssj 2017-07-29
  • 打赏
  • 举报
回复
string的相加其实最后会调用stringbuilder的append方法,然后看这句 invokestatic java/lang/String/valueOf (Ljava/lang/Object;)Ljava/lang/String; 这里传进来的是object,而stringbuilder的源码是这样写的:

 public StringBuilder append(Object obj) {  
115     return append(String.valueOf(obj));  
116     }  
117    
118     public StringBuilder append(String str) {  
119     super.append(str);  
120         return this;  
121     }  
当传进来的是object时,会先调用valueOf转成string
liu15073458538 2017-07-29
  • 打赏
  • 举报
回复
引用 4 楼 shansongjia 的回复:
你可以将后面两个new String看成 String str01 = new String("str"); String str02 = new String("01"); String str2 = str01 + str02;
public class Test05 {
	public static void main(String[] args) {
		String str1 = new String("Hello ");
		String str2 = new String(" World");
		String str3 = str1 + str2;
	}
}
.line 5
l0:    new java/lang/String
l3:    dup
l4:    ldc "Hello "
l6:    invokespecial java/lang/String/<init> (Ljava/lang/String;)V
l9:    astore_1
.line 6
l10:    new java/lang/String
l13:    dup
l14:    ldc " World"
l16:    invokespecial java/lang/String/<init> (Ljava/lang/String;)V
l19:    astore_2
.line 7
l20:    new java/lang/StringBuilder
l23:    dup
l24:    aload_1
l25:    invokestatic java/lang/String/valueOf (Ljava/lang/Object;)Ljava/lang/String;
l28:    invokespecial java/lang/StringBuilder/<init> (Ljava/lang/String;)V
l31:    aload_2
l32:    invokevirtual java/lang/StringBuilder/append (Ljava/lang/String;)Ljava/lang/StringBuilder;
l35:    invokevirtual java/lang/StringBuilder/toString ()Ljava/lang/String;
l38:    astore_3
的确用到了valueOf 现在又回到你的第一个回答
引用
“判断两个字符串应该用的是equals,比较两者的值是否相同以及引用的对象是否是同一个,无论用==还是equals都要比较值是否相等,所以用valueOf“
为什么会提到判断字符串相等?它们和valueOf的相关处在哪里?初学java,很多不懂。所以从解释到结论感觉很突兀。
Buguanjia-Ssj 2017-07-29
  • 打赏
  • 举报
回复
你可以将后面两个new String看成 String str01 = new String("str"); String str02 = new String("01"); String str2 = str01 + str02;
liu15073458538 2017-07-29
  • 打赏
  • 举报
回复
引用 2 楼 shansongjia 的回复:
判断两个字符串应该用的是equals,比较两者的值是否相同以及引用的对象是否是同一个,无论用==还是equals都要比较值是否相等,所以用valueOf
抱歉 我还是领会不了你表达的意思 10: new java/lang/StringBuilder 13: dup 14: new java/lang/String 17: dup 18: ldc "str" 110: invokespecial java/lang/String/<init> (Ljava/lang/String;)V 113: invokestatic java/lang/String/valueOf (Ljava/lang/Object;)Ljava/lang/String; 116: invokespecial java/lang/StringBuilder/<init> (Ljava/lang/String;)V 119: new java/lang/String 122: dup 123: ldc "01" 125: invokespecial java/lang/String/<init> (Ljava/lang/String;)V 128: invokevirtual java/lang/StringBuilder/append (Ljava/lang/String;)Ljava/lang/StringBuilder; 131: invokevirtual java/lang/StringBuilder/toString ()Ljava/lang/String; 134: astore_1 你能解释这一段的意思吗?就是String str2 = new String("str") + new String("01");等同什么? 谢谢!
Buguanjia-Ssj 2017-07-29
  • 打赏
  • 举报
回复
判断两个字符串应该用的是equals,比较两者的值是否相同以及引用的对象是否是同一个,无论用==还是equals都要比较值是否相等,所以用valueOf
liu15073458538 2017-07-29
  • 打赏
  • 举报
回复

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧