文章目录

  • 一、问题
  • 二、初探
  • 三、深入

一、问题

打印 String[]

String[] strs = new String[]{"a", "b", "c"};
System.out.println(strs);

输出

[Ljava.lang.String;@6d6f6e28

java.lang.String;、@6d6f6e28 我都能理解,[L 是什么意思呢?

二、初探

看一下 System.out.println(strs) 的过程:

// PrintStream.java
public void println(Object x) {String s = String.valueOf(x);synchronized (this) {print(s);newLine();}
}// String.java
public static String valueOf(Object obj) {return (obj == null) ? "null" : obj.toString();
}

可以看出,[Ljava.lang.String;@6d6f6e28 就是 strs.toString() 返回的值。

strs 的类型是 String[],是一个数组类型,数组类型没有重写 toString 方法,所以看下 Object 的 toString 方法:

public String toString() {return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

@ 之后是 hashCode 的值,所以 [Ljava.lang.String; 就是 getClass().getName() 返回的值。即 strs.getClass().getName() == "[Ljava.lang.String;"

三、深入

再看下 Class 的 getName() 方法:

public String getName() {String name = this.name;if (name == null)this.name = name = getNameNative();return name;
}

最终实现交给了 getNameNative() 方法,这是一个 native 方法,看不到源码,但 getName() 方法前的文档注释已经很清楚了。(太长,下面会有文档链接)

在看 getName() 方法的文档前,还要先看一下 class 文件中的 java 类型表示:

在 class 文件中,会通过类型描述符(即字段描述符)来代表 java 中的数据类型。

对于非数组类型:

类型 类型描述符
boolean Z
byte B
char C
double D
float F
int I
long J
short S
class or interface Lclassname;

引用类型 class 的 classname,指的是它的 class 文件二进制名(即全限定名,更多见二进制名与全限定名),如 java/lang/Thread

对于数组类型:

类型 类型描述符
boolean[] [Z
boolean[][] [[Z
byte[] [B
byte[][] [[B
char[] [C
char[][] [[C
class or interface[] [Lclassname;
class or interface[][] [[Lclassname;

[ + 自己元素类型的类型描述符[ 的个数取决于数组的维度。

现在再来看 getName() 方法的文档,翻译总结如下:

  • 对于原始数据类型,返回其 java 关键字
  • 对于非数组引用类型,返回其 Java 标准二进制名
  • 对于数组引用类型,返回它类型描述符,并将其中的 \ 改为 .

再回到最初的 strs.getClass().getName(),strs 是一个数组类型,返回它的类型描述符,即 [ + 自己元素类型的类型描述符,它的元素类型是 String,String 类型的描述符是 Ljava/lang/String;,将其中的 / 改为 .,得到 Ljava.lang.String;。所以strs.getClass().getName() == "[Ljava.lang.String;"

参考链接:
https://stackoverflow.com/questions/5085889/l-array-notation-where-does-it-come-from

[Ljava.lang.String;@6d6f6e28 是什么意思相关推荐

  1. 在拦截器中获取请求参数,[Ljava.lang.String; cannot be cast to java.lang.String报错

    Map<String,Object> parametersmap=invocation.getInvocationContext().getParameters();//获取请求参数    ...

  2. [Ljava.lang.String和java.lang.String区别

    [Ljava.lang.String和java.lang.String区别 注:[Ljava.lang.String@1b634e7  --     "[" 表示一维数组      ...

  3. 文件上传错误:Error setting expression 'uploadImage' with value '[Ljava.lang.String;@5ff8a691'...

    警告: Error setting expression 'uploadImage' with value '[Ljava.lang.String;@5ff8a691' ognl.MethodFail ...

  4. JNI字段描述符[Ljava/lang/String

    http://blog.csdn.net/jintiaozhuang/article/details/9016889 JNI字段描述符"([Ljava/lang/String;)V" ...

  5. java写spark碰到输出为[Ljava.lang.String;@889a8a8的情况

    原始代码如下: import com.sun.rowset.internal.Row; import org.apache.spark.api.java.JavaPairRDD; import org ...

  6. cxf javax.xml.parsers.DocumentBuilderFactory.setFeature(Ljava/lang/String;Z)

    文章目录 1. 现象 2. 解决方案1 3. 解决方案2 1. 现象 CXF 在和xercesImpl.jar冲突的时候,抱错javax.xml.parsers.DocumentBuilderFact ...

  7. 【registry】registry AbstractMethodError javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String;)Ljavax/ws

    1.概述 在 [registries]registrie rest-service idea 无法引入的背景下,以及 [registry]NoSuchFieldError: INCLUDE_ALL 以 ...

  8. Spark读取Hbase报错NoSuchMethodError: org.apache.hadoop.conf.Configuration.getPassword(Ljava/lang/String;

    NoSuchMethodError一般报错都是包冲突导致的. java.lang.NoSuchMethodError: org.apache.hadoop.conf.Configuration.get ...

  9. cn.cw.gps.domain.VisitReport.setVisitID([Ljava.lang.String;)]

    今天编程时遇到一个问题,后台总是报cn.cw.gps.domain.VisitReport.setVisitID([Ljava.lang.String;)]错误,经过故障排查,发现是在jsp页面的 & ...

最新文章

  1. Discrete Fourier Transform离散傅里叶变换算法
  2. 小熊派4G cat1模块体验测试报告,AT命令发送短信拨号无脑教程,cat1移动网速测试...
  3. 操作系统 第二章【进程管理】【MOOC答案】
  4. Direct3D 11.1新特性曝光
  5. 【Java 排序】重写Compare方法,实现自己定义排序
  6. ERP text object hard code
  7. Hive分析窗口函数(五) GROUPING SETS,GROUPING__ID,CUBE,ROLLUP
  8. MongoDB的存储结构及对空间使用率的影响
  9. 求平均值 Avg.java
  10. 乐玩模块脚本实战教程辅助脚本制作开发视频
  11. 图文并茂!60页PPT《快速入门python学习路线》学不会你找我
  12. PackageInstaller 5.0源码分析静默安装与静默卸载
  13. 今年这形势,程序员被裁员如何申请N+1,本文教科书 式 案例 供参考
  14. python爬虫qq付费音乐_Python爬虫实战之爬取QQ音乐数据!QQ音乐限制太多了
  15. 风险模型—CreditMetrics模型1
  16. 选手投票html,选手投票网页制作
  17. 《tkinter实用教程二》tkinter的子模块ttk
  18. 使用Math.max和Math.min求数组的最大值和最小值
  19. win10 桌面颜色变成灰色
  20. 深入讲解Android!最全的BAT大厂面试题整理,威力加强版

热门文章

  1. 软件测试现在想拿到20k的高薪offer,到底是不是痴人说梦?
  2. 毫米波与视觉融合及车道线检测视频分享
  3. “最差银幕情侣”出炉 娜塔莉和海登获选最不般配
  4. Flink Standalone 集群部署
  5. threejs动画(Animation system)
  6. 微信小程序之云菜谱的设计
  7. [山东科技大学OJ]1060 Problem G: 求最大值和最小值
  8. 贝叶斯算法及实例python实现
  9. IP地址、子网掩码、默认网关、DNS服务器详解
  10. Warning: (3719, 'utf8' is currently an alias for the character set UTF8MB3, but will be an alias fo