理解数组的length和String的length()
OK,那么问题来了,数组的length和string的length哪个是方法,哪个是属性?为什么?
初步理解:
首先我们可以确定的是String是一个类,那么理论上String是可以同时提供length属性和方法的。java数组又是什么?没有明确的定义或者我们找不到相应的类源码来证明它是一个类,初步认定为它应该只有length属性。
进阶理解:
我们在String的实现里可以看到,String实现了CharSequence接口,里面有length方法,并不是自定义的方法,然后我们也看到一个内部私有的count,有类似于length的属性,但是我们再看length方法,它的实现却是native的,并不是直接返回count。
public final class String implements Serializable, Comparable<String>, CharSequence {... private final int count; /** * Returns the size of this string. * * @return the number of characters in this string. */ public native int length();
然后,java数组到底是什么?
int[] v_int = null; v_int.clone();
可以看到,数组对象可以使用Object的方法,去Object找下答案
//Object注释第一句: * The root class of the Java class hierarchy. All non-primitive types * (including arrays) inherit either directly or indirectly from this class.
所有非基本类型(包括数组)直接或者间接继承这个类。但是我们找不到这个类文件,非常特殊...
Class clazz = MyClass[].class; System.out.println(clazz.getConstructors().length); //打印出来的结果是0;证明数组类确实没有构造方法。 //再看看数组类的“庐山真面目”: System.out.println(clazz); //输出是: [Larraytest.MyClass
对Java Class文件结构稍有了结就知道,这个字符串的意思就是一个元素类型为arraytest.MyClass的一维数组。也就是说,数组类型和普通类不一样,以一个全限定路径名+类名来作为自己的唯一标示的,而是以[+一个或者多个L+数组元素类全限定路径+类来最为唯一标示的。这个()也是数组和普通类的区别。而这个区别似乎在某种程度上说明数组和普通java类在实现上有很大区别。因为java虚拟机(java指令集)在处理数组类和普通类的时候,肯定会做出区分。我猜想,可能会有专门的java虚拟机指令来处理数组。
猜测:java对数组对象化的操作的支持是指令级的,也就是说java虚拟机有专门针对数组的指令。数组的Class类实例是java虚拟机动态创建动态加载的,其结构与普通java类的Class实例有一些不同。(待研究完虚拟机进一步确认)
+:研究结果如下,数组信息有自己独特的属性,包括length,在.class的信息里就有保存。
总结:
length属性主要是给数组使用,
length方法主要是给字符串使用,
size方法主要是给泛型数组使用(如实现Collection<E>、Map<K,V>等接口)。