我有以下代码
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1, 555);
}
并使用10个元素初始化,但我得到了异常
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 0
at java.util.ArrayList.rangeCheckForAdd(ArrayList.java:612)
at java.util.ArrayList.add(ArrayList.java:426)
at ListTest.main(ListTest.java:9)
虽然代码工作正常
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(0, 555);
}
为什么有人可以解释我?以及如何解决问题我想在我的代码中将项目放在第1,第2或第5位?
答案 0 :(得分:9)
用10个元素初始化
不,不是。它的初始化内部缓冲区大小为10,但这主要是一个实现细节。列表的大小仍为0,因为您可以在list.size()
来电之前打印出add
来确认。
区分&#34;缓冲区中的空间量准备好接受更多元素而不复制&#34;和&#34;列表的大小&#34;。来自add
documentation:
抛出:
IndexOutOfBoundsException
- 如果index
超出范围(index < 0 || index > size()
)
此处size()
为0,1 > 0
,因此例外。
在假设它是错误的框架(或编译器)之前,您应该始终检查文档。
如何解决问题我想在我的代码中将项目放在第1,第2或第5位?
你要么需要先添加足够的元素,例如
for (int i = 0; i < 10; i++) {
list.add(null);
}
list.set(1, 555);
list.set(2, 500);
list.set(5, 200);
请注意,这些是设置操作,而不是添加 - 它不清楚您是否真的要插入或修改。
或您应该使用数组。例如:
int[] array = new int[10];
array[1] = 555;
array[2] = 500;
array[5] = 200;
在这两种情况下,理解索引是从0开始非常重要 - 因此list.set(1, 555)
会更改列表的第二个元素。您希望list.set(0, 555)
更改第一个元素。这同样适用于数组。
答案 1 :(得分:3)
这是你的答案:
public void add(int index, E element) {
if (index > size || index < 0)
throw new IndexOutOfBoundsException(
"Index: "+index+", Size: "+size);
基本上,当您执行new ArrayList()
时,列表的大小将为0
。由于您的索引 更多而不是size
,因此您获得了IndexOutOfBoundsException
答案 2 :(得分:1)
您必须逐渐向列表中添加元素,列表将自动扩展。
如果您想在特定位置添加某个元素,并且您知道所需项目数量的长度;您可以使用Integer数组并在之后将其转换为列表,例如
public static void main(String []args){
Integer []fixedLengthArray = new Integer[5];
fixedLengthArray[1] = 3;
List<Integer> intList = Arrays.asList(fixedLengthArray);
for(int i= 0;i<intList.size();i++)System.out.println("Value of index "+i+":"+intList.get(i));
}
输出将是:
索引0的值:null 指数1:3的价值 索引2的值:null 索引3的值:null 索引4的值:null
答案 3 :(得分:0)
虽然该方法被称为add
,但它实际上是一个插入操作。你基本上是在告诉Java,把它放在列表中的第一个项目后面。并且Java正在回复&#39;列表中没有第一项&#39;。
答案 4 :(得分:0)
所有它的拳头将在
上产生编译错误List<Integer> list = new ArrayList<>();
代表ArrayList<Integer>()
and it is initialize with 10 elements
你这样做了。?
我们看到,它没有用10个元素进行初始化,实际上它是空的,为什么当你尝试在索引1
上添加一些内容时,它会在线上给出IndexOutOfBound
list.add(0, 555);
答案 5 :(得分:0)
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(1);
list.add(0, 555);
}
此代码将有所帮助。如果索引位置中有数据,则可以调用带索引的add方法。
答案 6 :(得分:0)
因为,在第二个代码片段,零是第一个索引。但是在第一个代码片段中,一个不是第一个索引,并且没有为您的索引分配任何内存。
你必须这样做;
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(0, 555); //Correct
list.add(1, 55); //Correct
list.add(2, 525); //Correct
list.add(5, 55235); // Not-correct !
}
或强>
创建列表并使用默认值分配所有索引。然后使用您想要的索引。
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
for(int i=0; i<10; i++)
{
list.add(null);//or default value like -99
}
list.add(0, 555); //Correct
list.add(1, 55); //Correct
list.add(2, 525); //Correct
list.add(5, 55235); //correct !
}
或强>
就这样做
int[] array = new int[10];
答案 7 :(得分:0)
这是因为你不会从树中获得水果,直到你植物树这么简单。
初始化列表时,它是一个空列表,可由list.size()
验证,它将返回0
,现在列表中有0个元素,并且您正在尝试访问1 index,所以它给你例外
来自Java Docs
void add(int index,
E element)
将指定元素插入此列表中的指定位置(可选操作)。将当前位置元素 (如果有的话)和任何后续元素移动到右侧(将其添加到索引中)。
和Throws:
IndexOutOfBoundsException - 如果索引超出范围(索引&lt; 0 || index&gt; size())
答案 8 :(得分:0)
您的“列表”仍然是一个ArrayList 所以你不能改变它的索引(通常,arraylist的索引必须从0开始)。因此,当你输入“list.add(1,555)”时,它会抛出一个错误。
简单list.add(555)
您可以使用Map,SortedMap,HashMap,TreeMap代替ArrayList。这些将值存储为Key - Value。
Hashtable<Integer,Integer> list = new Hashtable<>();
list.put(1, 555);
HashMap<Integer,Integer> list2 = new HashMap<Integer,Integer>();
list2.put(3, 555);
希望这有帮助!