繁体   English   中英

Java中数组的索引可以是负数吗?

[英]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

简而言之,不,它们不能为负。

文档中 (以get为例)

ArrayIndexOutOfBoundsException-如果指定的索引参数为负,或者大于或等于指定数组的长度

在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM