有什么不同的方法可以访问数组的长度,集合(List
,Set
等)和String
对象?为什么会有所不同?
答案 0 :(得分:31)
对于数组:使用 .length
。
对于Collection
(或Map
):使用 .size()
。
对于CharSequence
(包括CharBuffer
,Segment
,String
,StringBuffer
和StringBuilder
):使用 { {1}} 强>
可以使用数组上的 .length()
属性来访问它。尽管数组是动态创建的.length
,但Object
属性的任务由Java Language Specification, §10.3定义:
数组由数组创建表达式(§15.10)或 数组初始值设定项(§10.6)。
数组创建表达式指定元素类型,数量 嵌套数组的级别,以及至少一个数组的长度 嵌套的水平。 数组的长度可用作最终版本 实例变量
length
。数组初始值设定项创建一个数组并为其提供初始值 所有组件。
由于在没有创建新数组实例的情况下数组的长度无法更改,因此length
的重复访问不会更改值,无论对数组实例执行了什么操作(除非它的引用被替换为不同大小的数组)。
例如,要获得声明的一维数组的长度,可以写下:
.length
要在 n - 维数组中获取长度,需要记住他们一次只能访问数组的一个维度。
以下是二维数组的示例。
double[] testScores = new double[] {100.0, 97.3, 88.3, 79.9};
System.out.println(testScores.length); // prints 4
这一点很重要,特别是在jagged arrays的情况下;列或行可能并不总是排队。
int[][] matrix
= new int[][] {
{1, 2, 3, 4},
{-1, 2, -3, 4},
{1, -2, 3, -4}
};
System.out.println(matrix.length); // prints 3 (row length or the length of the array that holds the other arrays)
System.out.println(matrix[0].length); // prints 4 (column length or the length of the array at the index 0)
,Set
等)对于实现List
界面的每个对象,他们将使用名为size()
的方法来访问集合的整体大小。
与数组不同,集合不是固定长度,并且可以随时添加或删除元素。当且仅当列表本身添加了任何内容时,对Collection
的调用才会产生非零结果。
示例:
size()
某些集合可能会拒绝添加元素,因为它是List<String> shoppingList = new ArrayList<>();
shoppingList.add("Eggs");
System.out.println(shoppingList.size()); // prints 1
,或者它是重复的(在null
的情况下)。在这种情况下,对集合的重复添加不会导致大小增加。
示例:
Set
以类似于锯齿状数组的方式访问Set<String> uniqueShoppingList = new HashSet<>();
uniqueShoppingList.add("Milk");
System.out.println(uniqueShoppingList.size()); // prints 1
uniqueShoppingList.add("Milk");
System.out.println(uniqueShoppingList.size()); // prints 1
*的大小:
List<List<Object>>
*:List<List<Integer>> oddCollection = new ArrayList<>();
List<Integer> numbers = new ArrayList<Integer>() {{
add(1);
add(2);
add(3);
}};
oddCollection.add(numbers);
System.out.println(oddCollection.size()); // prints 1
System.out.println(oddCollection.get(0).size()); // prints 3
没有在其界面中定义Collection
方法。
另外,get
不是Map
,但它也定义了size()
方法。这只会返回Collection
中包含的键值对的数量。
Map
String
定义了方法length()
。它的作用是打印String
的实例中存在的字符数。
示例:
String
答案 1 :(得分:3)
不要忘记commons library中的CollectionUtils.size()
,它的空保险箱,因此您不必事先进行空检查。
答案 2 :(得分:0)
为什么不同?
我将尝试回答这一部分,因为其他答案似乎未涵盖该部分。
CharSequence
(包括String
)上的方法称为.length()
,因为序列具有长度。 “长度”是一个有意义的词,用于序列,因为它有一个开始和一个结束,您可以测量它们之间的距离。就像您可以测量棒的两端之间的距离来获得棒的“长度”一样。
Collection
上的方法称为.size()
,因为并非每个集合都是一个具有开始和结束的序列。想象一下有两千种不同的stamps的集合;您会说集合的“大小”是2,000,但您不会说集合的“长度”是2,000。对于没有从头到尾进行度量的事物,“大小”一词更为自然。碰巧有些集合,例如ArrayList
do 表示一个序列,在其中讨论它们的长度是有意义的,但是该方法仍被命名为.size()
,因为该方法名称是从Collection
接口;为连续的集合添加名为.length()
的另一个方法,这与继承的.size()
一样,是很奇怪的。
数组是序列,因此它们具有长度。但是,数组是该语言的底层功能。它们不是可以声明.length()
方法的“数组”类的实例,因此.length
不是方法。从语法上看,它看起来像访问一个字段,但它不是一个字段;将获取数组长度的表达式编译为bytecode instruction arraylength
。数组长度的不同字节码指令对应于其长度的语法。