[英]Can array's index be negative number in Java?
public static void main(String[] args) {
int[] a = new int[10];
a[1] =2;
a[-1] = -2;
a[0] = 0;
System.out.println(a[-1]);
}
让我们在这里查看Oracle的文档。 它是这样说的:
数组对象包含许多变量。 变量的数量可以为零,在这种情况下,数组被认为是空的。 数组中包含的变量没有名称。 而是由使用非负整数索引值的数组访问表达式引用它们。 这些变量称为数组的组件。 如果一个数组有n个分量,我们说n是数组的长度; 使用0到n-1(含)之间的整数索引来引用数组的组成部分。
也,
在运行时检查所有阵列访问; 尝试使用小于零或大于或等于数组长度的索引会引发ArrayIndexOutOfBoundsException。
要回答这个问题,不,索引不能为负。
Java中不支持负索引。 可以使用访问最后一个元素
array[array.length-1] = lastElement;
那么Java中的负数索引始终都是非法的吗?
是。
还是有一些特殊情况可以让数组的索引为负数?
您可以编写自己的类似数组的集合类型,其中负索引将是有效的。 它将是特定于域的类型,因为我无法想到任何常规应用程序。
一个简单的例子是
// define an anonymous class that overrides ArrayList's get behaviour
List<String> list = new ArrayList<String>() {
@Override
public String get(int index) {
return super.get(Math.abs(index));
}
};
list.add("a");
list.add("b");
System.out.println(list.get(-1)); // b
System.out.println(list.get(1)); // b
我不建议您这样做。 对于任何Java开发人员而言,这都是令人困惑且不寻常的。
简短答案:不可以。
简短的回答要少一些:数组索引的范围是0到数组的长度减去1。
例如:
int[] ints = new int[5];
ints[0] = 1; // fine
ints[4] = 1; // fine
ints[-1] = 1; // ArrayIndexOutOfBoundsException thrown
ints[5] = 1; // ArrayIndexOutOfBoundsException thrown
在Java中,不能使用负索引。 它是基于0的正索引。 如果使用负索引,则Java将抛出"ArrayIndexOutOfBoundsException"
异常。
Java中的数组不能使用负数建立索引,“问题”是直到现在在Java中都没有定义这样的无符号整数,因此只要ax是有效的数字索引,编写myArr [x]就可以编译
正如@Darshan Mehta 的回答所说,负数不允许作为数组索引。 但是,您始终可以编写自己的允许负索引的数组类。
这是我使用泛型的示例。
public class ModuloArray<E> {
int size;
E[] array;
public ModuloArray(int size) {
if (size <= 0)
throw new RuntimeException("not positive");
this.size = size;
array = (E[]) new Object[size];
}
public ModuloArray(E... elements) {
if (elements == null)
throw new RuntimeException("null");
this.size = elements.length;
array = elements;
}
public E get(int index) {
return array[Math.floorMod(index, size)];
}
public void set(int index, E element) {
array[Math.floorMod(index, size)] = element;
}
}
public class Main {
public static void main(String[] args) {
System.out.println("*** ModuloArray with first constructor ***");
ModuloArray<String> myArray = new ModuloArray<>(3);
myArray.set(-1, "apple");
myArray.set(-2, "orange");
myArray.set(-3, "banana");
System.out.println(myArray.get(-3));
System.out.println(myArray.get(-2));
System.out.println(myArray.get(-1));
System.out.println(myArray.get(0));
System.out.println(myArray.get(1));
System.out.println(myArray.get(2));
System.out.println();
System.out.println("*** ModuloArray with second constructor ***");
ModuloArray<String> myArray2 = new ModuloArray<>("glazed donut", "chicken burger", "apple soda");
System.out.println(myArray2.get(-2));
System.out.println(myArray2.get(3));
}
}
上面的示例输出:
*** ModuloArray with first constructor ***
banana
orange
apple
banana
orange
apple
*** ModuloArray with second constructor ***
chicken burger
glazed donut
Java 中的数组索引只有在0 <= index < array.length
为真时才有效。 但是,因为ModuloArray
使用Math.floorMod(int x, int y)
来访问数组元素,所以任何整数(包括负数)都可以用作有效索引。 此行为类似于索引在 Python 中对列表的工作方式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.