Java 其中是数组';是否定义了s长度属性?
我们可以使用Java 其中是数组';是否定义了s长度属性?,java,arrays,Java,Arrays,我们可以使用数组列表的公共方法size()来确定其长度,如 ArrayList<Integer> arr = new ArrayList(10); int size = arr.size(); 虽然ArrayList的size()方法是在ArrayList类中定义的,但是Array的length属性在哪里定义的?数组是java中的特殊对象,它们有一个名为length的简单属性,它是final 数组没有“类定义”(在任何.class文件中都找不到),它们是语言本身的一部分 10.7.
数组列表的公共方法size()
来确定其长度,如
ArrayList<Integer> arr = new ArrayList(10);
int size = arr.size();
虽然ArrayList
的size()
方法是在ArrayList
类中定义的,但是Array
的length
属性在哪里定义的?数组是java中的特殊对象,它们有一个名为length
的简单属性,它是final
数组没有“类定义”(在任何.class文件中都找不到),它们是语言本身的一部分
10.7. 数组成员
数组类型的成员包括以下所有成员:
public
final
字段length
,其中包含阵列的组件数<代码>长度
可以是正或零
public
方法clone
,它覆盖类对象中同名的方法,并且不抛出任何选中的异常。数组类型T[]
的clone
方法的返回类型为T[]
多维数组的克隆是浅层的,也就是说它只创建一个新数组。子阵列是共享的
对象继承的所有成员
;对象
唯一没有继承的方法是它的克隆
方法资源:
字段public final
,其中包含数组的组件数<代码>长度可以是正或零length
arraylength
。因此,这种方法:
public static void main(String[] args) {
int x = args.length;
}
被编译成字节码,如下所示:
public static void main(java.lang.String[]);
Code:
0: aload_0
1: arraylength
2: istore_1
3: return
所以它不能像正常字段一样被访问。事实上,如果你试着把它当作一个正规场,像这样,它失败了:
// Fails...
Field field = args.getClass().getField("length");
System.out.println(field.get(args));
因此,不幸的是,JLS对具有公共最终字段
长度的每种数组类型的描述有些误导:(它是公共最终字段,包含数组的组件数(长度可以是正的或零)
因此,数组具有与以下类相同的公共字段和方法:
class A implements Cloneable, java.io.Serializable {
public final int length = X;
public Object clone() {
try {
return super.clone();
} catch (CloneNotSupportedException e) {
throw new InternalError(e.getMessage());
}
}
}
更多信息请访问
10.7阵列成员
尽管这不是对问题的直接回答,但它是对.length
vs.size()
参数的补充。我正在研究与此问题相关的内容,因此当我遇到它时,我注意到此处提供的定义
公共最终字段长度,包含数组的组件数
不“完全”正确
字段长度包含放置组件的可用位置数,而不是数组中存在的组件数。因此,它表示分配给该数组的总可用内存,而不是该内存的填充量
例如:
static class StuffClass {
int stuff;
StuffClass(int stuff) {
this.stuff = stuff;
}
}
public static void main(String[] args) {
int[] test = new int[5];
test[0] = 2;
test[1] = 33;
System.out.println("Length of int[]:\t" + test.length);
String[] test2 = new String[5];
test2[0] = "2";
test2[1] = "33";
System.out.println("Length of String[]:\t" + test2.length);
StuffClass[] test3 = new StuffClass[5];
test3[0] = new StuffClass(2);
test3[1] = new StuffClass(33);
System.out.println("Length of StuffClass[]:\t" + test3.length);
}
输出:
Length of int[]: 5
Length of String[]: 5
Length of StuffClass[]: 5
List size: 0
List size: 1
List size: 2
但是,ArrayList
的.size()
属性确实给出了列表中的元素数:
ArrayList<Integer> intsList = new ArrayList<Integer>();
System.out.println("List size:\t" + intsList.size());
intsList.add(2);
System.out.println("List size:\t" + intsList.size());
intsList.add(33);
System.out.println("List size:\t" + intsList.size());
关键字length的作用类似于定义的数据字段。在数组中使用时,我们可以使用它来访问数组中的元素数。对于String[],我们可以调用String类中定义的length()方法。对于ArrayList,我们可以使用ArrayList中定义的size()方法。请注意,使用ArrayList(容量)创建数组列表时,此数组列表的初始大小()为零,因为没有元素。要按原样回答,数组的此长度属性定义在哪里?在特殊的对象标头中
易于通过
此输出的其中一行是:
OFFSET SIZE TYPE DESCRIPTION
16 4 (object header) 17 00 00 00 (00010111 00000000 00000000 00000000) (23)
通常,对象有两个头(mark和klass),数组还有一个头总是占据4字节的长度,因为size
是int
注意ArrayList.size()
提供数组中实际存储的对象数量,而myArray.length
([]
)提供“容量”。也就是说,如果formyArray=newint[10];
,返回10。这不是你在数组中放入的对象数。@Colin数组对象为何如此特殊,我的意思是为什么设计人员需要使其特殊,为什么不提供数组的类文件?@VikasVerma为什么数组与对象不同?因为历史。当设计Java时,大多数语言创新尝试都失败了,因为在语法和风格上,C++和Objul-C和java是不太相似的语言之一。java有意识地设计了包括卷发支架和普通阵列的程序,使他们对当天的主流程序员来说是熟悉的。见詹姆斯·高斯林和其他太阳人的采访。有些人坚持使用CYL。java java java语言必须在纯的OOP上进行,避免使用简单的数组。@ VikasVC++,在某个时候,Java必须建立在较低级别的技术上。如果Java不存在,就不能用Java来构建它。C++必须使用C++(或者其他的东西,但是C++)为Java的其余部分构建一些原始编译,以便使其自身存在上下文。在没有任何最终的类的情况下,在C++中对其进行编码。如果不能使用<代码>列表<代码>,那么在java中如何使用java?照原样回答,我记不清阿尔伯特·爱因斯坦的一句名言了,但上面说的是“人民理解我们”
int [] ints = new int[23];
System.out.println(ClassLayout.parseInstance(ints).toPrintable());
OFFSET SIZE TYPE DESCRIPTION
16 4 (object header) 17 00 00 00 (00010111 00000000 00000000 00000000) (23)