如何在Java中获取数组,集合或String的大小?

时间:2014-05-19 05:11:51

标签: java arrays string collections

有什么不同的方法可以访问数组的长度,集合(ListSet等)和String对象?为什么会有所不同?

3 个答案:

答案 0 :(得分:31)

删节:

对于数组:使用 .length

对于Collection(或Map):使用 .size()

对于CharSequence(包括CharBufferSegmentStringStringBufferStringBuilder):使用 { {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。数组长度的不同字节码指令对应于其长度的语法。