我需要将代码从黑莓移植到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.Arrays
(static 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个元素。
答案 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)
ArrayUtils.add(..)
ObjectArrays.concat(..)
。 以下是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代码有点长。