在写代码的时候,如果没有IDE代码自动补全的功能,很容易搞不清楚 length属性、length()方法和 size()方法 在什么情况下使用,今天就从他们出现的原因上搞清楚。
首先说明一下什么时候使用:
1. java中获取数组长度的时候使用 length 属性;
2. java中获取String的长度的时候使用 length()方法;
3. java中获取针对泛型集合的长度的时候使用size()方法。
下面讲一下原因:
1、为什么数组有length 属性?
首先,数组是一个容器对象(参考文章:Java中数组的特性),其中包含固定数量的同一类型的值。一旦数组被创建,它的长度就是固定的。数组的长度可以作为final实例变量的长度。因此,长度可以被视为一个数组的属性。
2、为什么 String有 length() 方法?
String背后的数据结构是一个char数组,所以没有必要来定义一个不必要的属性(因为该属性在char数值中已经提供了)。和C不同的是,Java中char的数组并不等于字符串,虽然String的内部机制是char数组实现的。(注:C语言中,并没有String类,定义字符串通常使用char string[6] = “hollis”;的形式)
/** The value is used for character storage. */
private final char value[];
.....
/**
* Returns the length of this string.
* The length is equal to the number of <a href="Character.html#unicode">Unicode
* code units</a> in the string.
*
* @return the length of the sequence of characters represented by this
* object.
*/
public int length() {
return value.length;
}
3、为什么集合中有 size()方法?
Collection接口是数据集合的接口,位于数据接口API的最上层,构成Collection的单位被称为元素。接口提供了添加、删除、查看、修改等数据管理功能。Collection接口可以分为三类,分别是map接口、set接口、list接口。
ArrayList:用数组的形式存放数据;
Vector:用数组的形式存放数据;
LinkedList:用双向链表的形式存放;
HashSet:
HashMap:用散列(数组+单向链表)的形式存放;
HashSet:用散列的形式存放;
LinkedHashMap:用散列,双向列表的方式存储;
集合有很多的存储形式,参考文章:Java集合的数据结构,所以都实现了一个统一的方法 size() 方法,但是实现上大不相同。
参考文章:
java 集合的数据结构:http://www.tuicool.com/articles/Uvem2y
Java中数组的特性:http://blog.youkuaiyun.com/zhangjg_blog/article/details/16116613#t1