如何将新元素添加到数组中

时间:2011-10-07 12:36:01

标签: java android arrays

我需要将代码从黑莓移植到android并遇到小问题: 示例:bb代码为:

public class MyClass{
   private MyObject[] _myObject;

   public void addElement(MyObject o){
      if (_myObject == null){
        _myObject = new MyObject[0];
      }
      Arrays.add(_myObject, o);
   }
}

遗憾的是,Android没有Arrays.add() net.rim.device.api.util.Arraysstatic void add(Object[] array, Object object)

的一部分

是否有替代android以动态扩展并附加到简单数组中,因此我不会更改其余的代码。

我尝试编写自己的实用程序,但它不起作用:

public class Arrays {
  public static void add(Object[] array, Object object){
    ArrayList<Object> lst = new ArrayList<Object>();
    for (Object o : array){
      lst.add(o);
    }
    lst.add(object);
    array = lst.toArray();
  }
}

..拨打电话后

public void addElement(MyObject o){
      if (_myObject == null){
        _myObject = new MyObject[0];
      }
      Arrays.add(_myObject, o);
   }

_myObject仍包含0个元素。

2 个答案:

答案 0 :(得分:4)

是的,因为_myObject引用是按值传递的。您需要使用:

public static Object[] add(Object[] array, Object object){
  ArrayList<Object> lst = new ArrayList<Object>();
  for (Object o : array){
    lst.add(o);
  }
  lst.add(object);
  return lst.toArray();
}

...

_myObject = Arrays.add(_myObject, o);

但是,最好只使用ArrayList<E>开始......

这里有两件重要的事情要理解:

Java 始终使用按值传递

传递的值是引用(获取对象的方式,或null)或原始值。这意味着如果您更改参数的值,则调用者无法看到该值。如果你更改参数值引用的对象中的某个的值,那就是另一个问题:

void doSomething(Person person) {
  person.setName("New name"); // This will be visible to the caller
  person = new Person(); // This won't
}

数组在Java中是固定大小的

您无法向数组“添加”值。一旦你创建它,大小是固定的。如果您想要一个可变大小的集合(这是一个非常常见的要求),您应该使用List<E>的实现,例如ArrayList<E>

答案 1 :(得分:2)

以下是ObjectArrays.concat(object, array)的代码:

public static <T> T[] concat(@Nullable T element, T[] array) {
    T[] result = newArray(array, array.length + 1);
    result[0] = element;
    System.arraycopy(array, 0, result, 1, array.length);
    return result;
  }

apache-commons代码有点长。