理解数组的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>等接口)。

posted on 2014-11-14 13:47  asi24  阅读(1571)  评论(0编辑  收藏  举报