【发布时间】:2011-12-30 02:41:57
【问题描述】:
我注意到,在计算数组长度时,您会写如下内容:
arrayone.length;
但是,对于数组列表或字符串之类的东西,你要在末尾写一个括号,例如String的长度如下:
stringone.length();
造成这种情况的主要原因是什么?你怎么知道什么时候放括号还是现在放括号?
【问题讨论】:
我注意到,在计算数组长度时,您会写如下内容:
arrayone.length;
但是,对于数组列表或字符串之类的东西,你要在末尾写一个括号,例如String的长度如下:
stringone.length();
造成这种情况的主要原因是什么?你怎么知道什么时候放括号还是现在放括号?
【问题讨论】:
.length;
直接访问字段成员。
.length();
调用方法(即访问器)来访问字段成员。
对于String,这是意料之中的,因为它是不可变的。
【讨论】:
Arrays 的处理方式不同于 Strings 或 ArrayLists 或其他任何可以在 Java 中计算的内容。 Array 几乎是一个原生类型,它的长度在初始化后永远不会改变,所以不需要封装。长度变量可以直接暴露,没有副作用。
String 使用方法而不是变量的原因是因为它在内部使用了不想公开暴露的char[](为了不变性/封装),所以它将长度变量包装在 @ 987654327@ 方法。这与ArrayList 具有size() 方法而不是length 变量的原因相同。
您将使用变量而不是方法的唯一一次是使用数组。其他一切都是方法。也就是说,除了数组之外,您将对所有内容都使用方括号。
【讨论】:
知道何时使用哪一个的唯一真正方法是经验。虽然具有自动完成功能的 IDE 通常会在您不记得时帮助您。
在大多数情况下(并非总是)array.length、System.out 和 System.err 是最常见的 3 个,它们实际上是成员访问而不是方法调用。
【讨论】:
int[] myArray = new int[10];
String myString = "hello world!";
List<int> myList = new ArrayList<int>();
myArray.length //gives the length of the array
myString.length() //gives the length of the string
myList.size() //gives the length of the list
字符串和数组很可能是在不同的时间设计的,因此最终使用了不同的约定。一个理由是,由于字符串在内部使用数组,因此使用方法 length() 来避免重复相同的信息。最终,这只是一种不一致的演变,如果从头开始重新设计语言,肯定会解决这个问题。 :D
【讨论】:
size
主要区别在于,在 A) 第一种情况下,它的数组类型,例如 int[]、Object[]、double[] 等,它有一个名为 lenght 的公共字段,而 B) 第二种情况是 Object具有称为length() 的函数的字符串,该函数可以称为getLength() 或其他名称。数组类型的公共字段长度可能是 C++ 做事方式的遗留物。
数组类型有以下几种:
【讨论】:
.length() 是 String 类的一个方法,它返回字符串中的字符数。
.length 将给出存储在数组中的元素数。
public class length
{
public static void main(String args[])
{
String x="test";
int a[]={1,2,3,4};
System.out.println(x.length());
System.out.println(a.length);
}
}
// output
4
4
【讨论】:
length 是一个伪数据成员引用,仅适用于 (small-a) 数组(忽略您可能定义的实现该成员的类)。
其他一切都是类的对象,所有具有此概念的 JDK 类都定义了 length() 或 size() 实例方法。 (我真希望他们能始终如一地选择其中一个,但那是桥上的水。)
【讨论】:
Array.length 是 Array 的属性,类似于变量引用。
ArrayList.size() 是对数组列表对象的实际方法调用。
【讨论】: