关于.length和.length()
关于.length和.length()
曾一度以为是简单的问题,只知道老师说记住就行,但并不知道其中的原理,只知道String底层使用的是char数组,但并不知道String的length()方法的.length从何而来
public int length() {return value.length;
}
观察一下代码
char a[]={'1','2','3'};
Class class1=a.getClass();
System.out.println(class1.getName());int b[]=new int[1];
Class class2=b.getClass();
System.out.println(class2.getName());
其结果是:
[C
[I
这是利用反射查看char数组和int数组的类,真是一个奇怪的类名
简单的说,数组的类名由若干个’[‘和数组元素类型的内部名称组成,’['的数目代表了数组的维度。
观察一下代码
int b[]=new int[1];
Class class2=b.getClass();
System.out.println(class2.getName());
System.out.println(class2.getDeclaredFields().length);//所有字段组成的Field数组
System.out.println(class2.getDeclaredMethods().length);//所有方法组成的Method数组
System.out.println(class2.getDeclaredConstructors().length);//所有构造方法组成的Constructor数组
System.out.println(class2.getDeclaredAnnotations().length);//所有注解
System.out.println(class2.getDeclaredClasses().length);
//返回 Class 对象的一个数组,这些对象反映声明为此 Class 对象所表示的类的成员的所有类和接口。
System.out.println(class2.getSuperclass());//返回父类
其结果是:
[I
0
0
0
0
0
class java.lang.Object
由此可见,数组的类的内容为空,且父类是Object
那么数组的类在哪里呢?
答案是在JVM中自动创建,并且类中并没有length成员变量,由代码反编译(字节码文件.class)可以知道
JVM的知识还没有学到,以下内容转载自记忆犹新的博客
public class Main { public static void main(String[] args) { int a[] = new int[2]; int i = a.length; }
}
编译上述代码,并使用jclasslib打开Main.class文件,得到main方法的字节码:
0 iconst_2 //将int型常量2压入操作数栈
1 newarray 10 (int) //将2弹出操作数栈,作为长度,创建一个元素类型为int, 维度为1的数组,并将数组的引用压入操作数栈
3 astore_1 //将数组的引用从操作数栈中弹出,保存在索引为1的局部变量(即a)中
4 aload_1 //将索引为1的局部变量(即a)压入操作数栈
5 arraylength //从操作数栈弹出数组引用(即a),并获取其长度(JVM负责实现如何获取),并将长度压入操作数栈
6 istore_2 //将数组长度从操作数栈弹出,保存在索引为2的局部变量(即i)中
7 return //main方法返回
有看见length这个成员变量,获取数组长度是由一条特定的指令arraylength实现。编译器对Array.length这样的语法做了特殊处理,直接编译成了arraylength指令。另外,JVM创建数组类,应该就是由newarray这条指令触发的了。
小结,.length是由JVM实现的…
关于.length和.length()相关推荐
- c++获取数组长度_灵魂拷问:Java如何获取数组和字符串的长度?length还是length()?...
限时 1 秒钟给出答案,来来来,听我口令:"Java 如何获取数组和字符串的长度?length 还是 length()?" 在逛 programcreek 的时候,我发现了上面这个 ...
- length与length()的区别
在写代码的时候,知道length与length()都是求长度,但是有的地方用length,有的地方用length():写反了eclipse就会报错 有必要记一下加以区分: length用于计算数组的长 ...
- length () 和 length 的区别
今天老师在 PTA 发布了第一个 JAVA 的题目集,做了之后发现还是有很多概念不清容易混淆的东西,还是做做笔记的好: length () 和 length 的区别: length () 确实是用于获 ...
- 关于length与length()
关于length与length()的区别,length是用来获取数组的长度,length()是用来获取字符串的长度.在java中可以定义String类型的字符串和String[]类型的数组,在获取字符 ...
- java中length和length()方法的区别
在Java中, length方法用于获取数组的长度. int[] arr = new int[10]; System.out.println(arr.length); 而length()用于获取Str ...
- size(),length和length()的区别(最详细版)
首先区分一下length和length(): length不是方法,是属性,数组的属性: public static void main(String[] args) {int[] intArray ...
- Java中length、length()、size()区别
记某一次刷题: 计算下字符串的长度,哦哦简单嘛,然后一写 int len=str.length; 咦?怎么报错了,那再加上**()括号**试试把 int len=str.length(); 编译通过了 ...
- Java中的.length与.length()
目录 一. .length 1. .length究竟有多长? 2. 为什么会有.length呢? 3. 二维数组的创建方法 4. 数组是对象 二. .length() 1. .length()怎么用呢 ...
- java创建byte数组_java.创建一个byte数组,long length = file.length(); byte[] bytes =
导航:网站首页 > java.创建一个byte数组,long length = file.length(); byte[] bytes = 时间:2017-12-17 java.创建一个byte ...
最新文章
- 这份深度学习课程笔记获吴恩达点赞
- linux生成ext4镜像,mkfs.ext4生成分区镜像自动把文件转成了sparse怎么破?
- sscanf操作字符串和整型的区别
- 如何把html转换成音频网址,怎么把视频转换成音频 视频转换成mp3
- Jenkins构建Spring+Nodejs项目
- 好的,每个接触Java字节码的人
- Linux 下压缩与解压.zip 和 .rar
- 计算机网络课程设计之网络代理服务器的设计与实现
- matlab求微分方程精确解,matlab求微分方程精确解及近似解.ppt
- 五步法建设你的数据中台
- 身份证号校验、身份证照片解析(百度API)
- oracle asm的安装和配置,ORACLE安装之ASM安装
- 游程编码用matlab实现代码_二值图像游程编码算法的Matlab实现 -
- svn异常:Aborting commit: 'xxx' remains in conflict
- 论文翻译:2021_TSCN:Decoupling magnitude and phase optimization with a two-stage deep network
- 2011年国外最受欢迎的15个电影网站
- 微信Web工具可以打开网页,用微信客户端就打不开了
- Restful 风格请求
- AD从原理图到PCB超详细教程
- IPv6的HappyEyeballs算法
热门文章
- IntelliJ IDEA 官方网站
- 关于Python常用的办公自动化技巧
- 软件著作权的转让问题
- 新一代科学计算与系统建模仿真平台MWORKS发布预告
- 曝新款苹果手机将采用低功耗微处理器,Find My定位在关机状态下也能使用
- 西南交大大学生营养早餐优化食谱
- Python手册(Machine Learning)--statsmodels(Regression)
- 单组学的多变量分析|1.PCA和PLS-DA
- 如何在网站上设置在线QQ客服
- Excel自动转曲线图的时PHP,Excel折线图随着数据的插入动态变化,掌握此技能的人不足1﹪!...