向Java数组的开头添加项的最简单方法是什么

向Java数组的开头添加项的最简单方法是什么,java,Java,我需要一种最简单的方法将项目添加到Java数组的前面。 我需要的是Java数组,而不是ArrayList。根据(我完全建议初学者使用) 数组是一个容器对象,它包含固定数量的单一类型的值。数组的长度是在创建数组时确定的。创建后,其长度是固定的 由于数组无法调整大小-可以覆盖第一个元素,但要执行插入,必须创建一个比上一个大1的新数组,将新元素放在第一个位置,并用现有元素填充数组的其余部分 当然,实际上不要这样做。而是使用适合您实际用例的集合。 因此,您的问题的实际答案是:向java数组前面添加项的最

我需要一种最简单的方法将项目添加到Java数组的前面。
我需要的是Java数组,而不是ArrayList。

根据(我完全建议初学者使用)

数组是一个容器对象,它包含固定数量的单一类型的值。数组的长度是在创建数组时确定的。创建后,其长度是固定的

由于数组无法调整大小-可以覆盖第一个元素,但要执行插入,必须创建一个比上一个大1的新数组,将新元素放在第一个位置,并用现有元素填充数组的其余部分

当然,实际上不要这样做。而是使用适合您实际用例的集合。

因此,您的问题的实际答案是:向java数组前面添加项的最简单方法是使用更好的集合类型,例如


在Java中,如果需要插入到前端,我想不出任何合理的理由不使用比原始数组更合适的集合

为什么不直接使用ArrayList

您可以使用数组将其转换为列表,如下所示:

List<Integer> myList = Arrays.asList(1,2,3); 
//Instead of 1,2,3 you could create an Integer array: Integer[] myArray = {1,2,3};

myList.add(0, 25);
List myList=Arrays.asList(1,2,3);
//您可以创建整数数组而不是1,2,3:Integer[]myArray={1,2,3};
添加(0,25);
如果您决定这样做,您可以检查以下问题的答案:

或者只需查看文档:


一旦创建阵列,就无法调整其大小。如果必须添加元素,则需要创建一个新数组。 如果您知道数组类型,那么它很简单,但是更好的解决方案可以使用
java.lang.reflect.array

示例代码:

public static Object addElementInFrontOfArray(Object array, Object element) {
     int newArraySize = Array.getLength(array)+1;
     Object newArray = Array.newInstance(element.getClass(), newArraySize);
     //Add first element
     Array.set(newArray, 0, element);
     for (int i=1 ; i<newArraySize; i++) {
         Array.set(newArray, i, Array.get(array, i-1));
     }
     return newArray;
}
公共静态对象addElementInFrontOfArray(对象数组,对象元素){
int newArraySize=Array.getLength(数组)+1;
Object newArray=Array.newInstance(element.getClass(),newArraySize);
//添加第一个元素
Array.set(newArray,0,element);

对于(int i=1;i有两种方法可以做到这一点。一种是使用
对象
,另一种是使用
泛型
。我建议您使用
泛型
,因为在这些示例中可以看到,它给了您更大的灵活性

在第一个实现中,函数
add2beginingofarray
使用
泛型

publicstatict[]add2beginingofarray(T[]elements,T element)
{
T[]newArray=Arrays.copyOf(elements,elements.length+1);
newArray[0]=元素;
System.arraycopy(元素,0,新数组,1,元素.长度);
返回新数组;
}
调用此函数非常简单。例如,如果您有一个类
Dot
,并且希望在
Dot
对象数组的开头添加一个元素,则只需执行以下操作:

int size=20;
点[]点=新点[尺寸];
对于(int i=0;i
您还可以实现一个函数,将函数参数声明为
Object
,如本例所示:

publicstaticobject[]add2beginingofarray(Object[]elements,Object element){
Object[]tempArr=新对象[elements.length+1];
tempArr[0]=元素;
System.arraycopy(元素,0,tempArr,1,元素。长度);
}
现在,问题是什么?这不是什么大问题,但现在需要将数组声明为
Object[]
,并使用这种声明来处理它

Object[]foo={“2”、“3”、“4”};
//向起始数组添加元素
Object[]number=add2beginingofarray(foo,“1”);
System.out.println(Arrays.toString(numbers));

对我来说,
generics
方法更干净、更具可扩展性,因此我真的建议使用它而不是
Object
方法。

Apache Commons Lang类“ArrayUtils”使这非常容易,如果这是您的选择:

char[] arrayA = {'b', 'c'};
char[] arrayB = ArrayUtils.add(arrayA, 0, 'a');
// arrayB: [a, b, c]

考虑到这一来源

通过执行以下操作,可以在数组的开头添加新元素:

    public static Object[] add(Object[] arr, Object... elements){
    Object[] tempArr = new Object[arr.length+elements.length];
    System.arraycopy(arr, 0, tempArr, elements.length, arr.length);

    for(int i=0; i < elements.length; i++)
        tempArr[i] = elements[i];
    return tempArr;

}
publicstaticobject[]add(Object[]arr,Object…元素){
Object[]tempArr=新对象[arr.length+elements.length];
系统阵列复制(arr,0,tempArr,elements.length,arr.length);
for(int i=0;i
以下是我能找到的最简单方法的具体示例:

    List<StackTraceElement> stack = new ArrayList<StackTraceElement> (Arrays.asList (e.getStackTrace()));
    stack.add (0, new StackTraceElement ("class", "method", "file", 25439));
    StackTraceElement[] newStack = new StackTraceElement[stack.size()];
    newStack = stack.toArray (newStack);  
    e.setStackTrace (newStack);
List stack=newarraylist(Arrays.asList(e.getStackTrace());
stack.add(0,新的StackTraceElement(“类”、“方法”、“文件”,25439));
StackTraceeElement[]newStack=新的StackTraceeElement[stack.size()];
newStack=stack.toArray(newStack);
e、 setStackTrace(newStack);
基本上,它使用
java.util.Arrays.asList()
将数组转换为
列表
,添加到列表中,然后使用
List.toArray()将列表转换回数组

正如大家所说,除非先将所有元素移位一,否则无法真正添加到数组的开头,或者在我的解决方案中,创建一个新数组。

Just.unshift()


这会在数组的开头添加一个元素。

只需创建一个新数组,该数组的大小为旧数组的+1,将新项放在第一个索引处,然后用旧数组填充剩余的部分。创建一个
StackArray
,它包装了一个
数组r数组,大小为:oldArray+elementsToInsert,这样您就可以在前面添加新元素,在末尾添加其他元素。您是否尝试过您的代码?Arrays::asList方法使用的ArrayList不会覆盖AbstractList::add(int,t)的默认实现,因此会自动抛出
    List<StackTraceElement> stack = new ArrayList<StackTraceElement> (Arrays.asList (e.getStackTrace()));
    stack.add (0, new StackTraceElement ("class", "method", "file", 25439));
    StackTraceElement[] newStack = new StackTraceElement[stack.size()];
    newStack = stack.toArray (newStack);  
    e.setStackTrace (newStack);