JAVA uri对象为啥后面直接可以字符串连接?

9527-abc 发布于 2018/01/10 16:04
阅读 740
收藏 0

【开源中国 APP 全新上线】“动弹” 回归、集成大模型对话、畅读技术报告”

URI uri = instance.getUri();
String urlHbase = uri + "/data_tribe/fansHDataReset/gzqxgzyh";

请问各位大神,这个uri后面为啥可以直接字符串连接呢?自动toString了吗?

加载中
0
9527-abc
9527-abc

终于找到为啥啦。哈哈哈。感谢各位支持。我将上面那个类代码弄成class,在执行javap找到了字节码,在字节码里找到了“+”实际用StringBuilder的append实现的。至于对象连接,调用的是StringBuilder的append(Object)函数。具体看下面代码

D:\>javac TestUri.java

D:\>java TestUri
https://www.baidu.comasdasda?searchword=111

D:\>javap -c TestUri
Compiled from "TestUri.java"
public class TestUri {
  public TestUri();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: new           #2                  // class TestUri$TestObj
       3: dup
       4: new           #3                  // class TestUri
       7: dup
       8: invokespecial #4                  // Method "<init>":()V
      11: dup
      12: invokevirtual #5                  // Method java/lang/Object.getClass:()Ljava/lang/Class;
      15: pop
      16: ldc           #6                  // String https://www.baidu.com
      18: invokespecial #7                  // Method TestUri$TestObj."<init>":(LTestUri;Ljava/lang/String;)V
      21: astore_1
      22: new           #8                  // class java/lang/StringBuilder
      25: dup
      26: invokespecial #9                  // Method java/lang/StringBuilder."<init>":()V
      29: aload_1
      30: invokevirtual #10                 // Method java/lang/StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder;
      33: ldc           #11                 // String ?searchword=111
      35: invokevirtual #12                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      38: invokevirtual #13                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      41: astore_2
      42: getstatic     #14                 // Field java/lang/System.out:Ljava/io/PrintStream;
      45: aload_2
      46: invokevirtual #15                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      49: return
}

D:\>

上面是执行javap命令查看字节码,重点是30行注释Method java/lang/StringBuilder.append:(Ljava/lang/Object;然后查看StringBuilder源码,执行对象连接时用的是String.valueOf()方法

   
    /**这个是StringBuilder的append方法*/
    @Override
    public StringBuilder append(Object obj) {
        return append(String.valueOf(obj));
    }
  //-------------------------------------------------- 
    /**这个是String的valueOf方法*/
    
    /**
     * Returns the string representation of the {@code Object} argument.
     *
     * @param   obj   an {@code Object}.
     * @return  if the argument is {@code null}, then a string equal to
     *          {@code "null"}; otherwise, the value of
     *          {@code obj.toString()} is returned.
     * @see     java.lang.Object#toString()
     */
    public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
    }

最后的String.valueOf方法实际调用对象的toString()

 

1
chro008
chro008

写了一个测试类

import java.net.URISyntaxException;

public class TestUri {

    public static void main(String[] args) throws URISyntaxException {
        TestObj obj =  new TestUri().new TestObj("https://www.baidu.com");
        String urlStr = obj + "?searchword=111";
        System.out.println(urlStr);
    }

    class TestObj {
        private String str;

        public TestObj(String str) {
            this.str = str;
        }

        @Override
        public String toString(){
            return this.str + "asdasda";
        }

    }
}
//打印结果 
D:\NewProject\java_8_131\bin\java "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2017.3\lib\idea_rt.jar=64354:D:\Program Files\JetBrains\IntelliJ IDEA 2017.3\bin" -Dfile.encoding=UTF-8 -classpath D:\NewProject\java_8_131\jre\lib\charsets.jar;D:\NewProject\java_8_131\jre\lib\deploy.jar;D:\NewProject\java_8_131\jre\lib\ext\access-bridge-64.jar;D:\NewProject\java_8_131\jre\lib\ext\cldrdata.jar;D:\NewProject\java_8_131\jre\lib\ext\dnsns.jar;D:\NewProject\java_8_131\jre\lib\ext\jaccess.jar;D:\NewProject\java_8_131\jre\lib\ext\jfxrt.jar;D:\NewProject\java_8_131\jre\lib\ext\localedata.jar;D:\NewProject\java_8_131\jre\lib\ext\nashorn.jar;D:\NewProject\java_8_131\jre\lib\ext\sunec.jar;D:\NewProject\java_8_131\jre\lib\ext\sunjce_provider.jar;D:\NewProject\java_8_131\jre\lib\ext\sunmscapi.jar;D:\NewProject\java_8_131\jre\lib\ext\sunpkcs11.jar;D:\NewProject\java_8_131\jre\lib\ext\zipfs.jar;D:\NewProject\java_8_131\jre\lib\javaws.jar;D:\NewProject\java_8_131\jre\lib\jce.jar;D:\NewProject\java_8_131\jre\lib\jfr.jar;D:\NewProject\java_8_131\jre\lib\jfxswt.jar;D:\NewProject\java_8_131\jre\lib\jsse.jar;D:\NewProject\java_8_131\jre\lib\management-agent.jar;D:\NewProject\java_8_131\jre\lib\plugin.jar;D:\NewProject\java_8_131\jre\lib\resources.jar;D:\NewProject\java_8_131\jre\lib\rt.jar;D:\Workspaces\IntelliJ\99click-sf\sz-chart\target\test-classes;D:\Workspaces\IntelliJ\99click-sf\sz-chart\target\classes;D:\NewProject\apache-maven-3.5.0\repo\jfree\jfreechart\1.0.4\jfreechart-1.0.4.jar;D:\NewProject\apache-maven-3.5.0\repo\jfree\jcommon\1.0.8\jcommon-1.0.8.jar;D:\NewProject\apache-maven-3.5.0\repo\org\apache\poi\poi\3.13\poi-3.13.jar;D:\NewProject\apache-maven-3.5.0\repo\commons-codec\commons-codec\1.9\commons-codec-1.9.jar;D:\NewProject\apache-maven-3.5.0\repo\net\sourceforge\jexcelapi\jxl\2.6.12\jxl-2.6.12.jar;D:\NewProject\apache-maven-3.5.0\repo\log4j\log4j\1.2.14\log4j-1.2.14.jar;D:\NewProject\apache-maven-3.5.0\repo\com\alibaba\fastjson\1.2.3\fastjson-1.2.3.jar;D:\NewProject\apache-maven-3.5.0\repo\org\slf4j\slf4j-api\1.7.9\slf4j-api-1.7.9.jar;D:\NewProject\apache-maven-3.5.0\repo\org\slf4j\slf4j-log4j12\1.7.9\slf4j-log4j12-1.7.9.jar;D:\NewProject\apache-maven-3.5.0\repo\com\shangzhu\sz-commons\0.0.9-20170906\sz-commons-0.0.9-20170906.jar;D:\NewProject\apache-maven-3.5.0\repo\joda-time\joda-time\2.6\joda-time-2.6.jar;D:\NewProject\apache-maven-3.5.0\repo\javax\mail\mail\1.4.7\mail-1.4.7.jar;D:\NewProject\apache-maven-3.5.0\repo\javax\activation\activation\1.1\activation-1.1.jar;D:\Workspaces\IntelliJ\99click-sf\sz-sysenv\target\classes;D:\NewProject\apache-maven-3.5.0\repo\com\alibaba\druid\1.0.31\druid-1.0.31.jar;D:\NewProject\apache-maven-3.5.0\repo\com\mysql\mysql-jdbc\5.1.42\mysql-jdbc-5.1.42.jar TestUri
https://www.baidu.comasdasda?searchword=111

Process finished with exit code 0
chro008
chro008
猜测 对象 + 字符串 会自动调用对象的toString()方法
0
开源中国首席聊天玩家
开源中国首席聊天玩家

调用了对象的toString方法

0
大賢者
大賢者

String 的+ 操作

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部