首先,三种语言的数组容量都是不可变的,这也是静态数组的特点,空间一旦开辟,就固定了;其次,对于元素的类型,Objective-C 是只要是对象即可,因此对元素类型的限制较小,而其他两种语言要求元素必须为指定的类型;最后,Swift 的数组使用值类型,而另外两种采用引用类型,这也使得 Swift 数组创建后,元素就无法做更改了。
/** * 在数组开头插入一个元素。 * 时间复杂度 O(n),因为需要向后挪动 n 个元素,数组中所有内容都要向后挪动。 * * @param e 插入的元素。 */ publicvoidaddFirst(E e) { add(0, e); }
/** * 获取某个元素。 * 时间复杂度 O(1)。 * * @param index 索引。 */ public E get(int index) { if (index < 0 || index >= size) { thrownewIllegalArgumentException("Get failed. Index is illegal."); }
return data[index]; }
/** * 获取数组最后一个元素。 */ public E getLast() { return get(size - 1); }
/** * 获取数组第一个元素。 */ public E getFirst() { return get(0); }
/** * 修改 index 索引位置的元素为 e。 * 时间复杂度 O(1)。这也是数组最大的优势,支持随机访问,知道索引的情况下改元素超快。 * * @param index 索引。 * @param e 新设置的元素。 */ publicvoidset(int index, E e) { if (index < 0 || index >= size) { thrownewIllegalArgumentException("Set failed. Index is illegal."); }
data[index] = e; }
/** * 查找数组中是否包含某个元素。 * 时间复杂度 O(n)。 */ publicbooleancontains(E e) { for (inti=0; i < size; i++) { if (data[i].equals(e)) { returntrue; } } returnfalse; }
/** * 查找元素 e 所在的第一个索引,如果不存在该元素,则返回 -1。 * 时间复杂度 O(n)。 */ publicintfind(E e) { for (inti=0; i < size; i++) { if (data[i].equals(e)) { return i; } } return -1; }
/** * 从数组中删除指定索引的元素,并将其返回。 * 时间复杂度 O(n) */ public E remove(int index) { if (index < 0 || index >= size) { thrownewIllegalArgumentException("Remove failed. Index is Illegal."); }
Eret= data[index];
for (inti= index + 1; i < size; i++) { data[i - 1] = data[i]; } size--; data[size] = null; // 可写可不写,写的话可以优化一点点内存。loitering objects != memory leak
/** * 交换数组中指定两个索引的元素 */ publicvoidswap(int i, int j) { if (i < 0 || i >= size || j < 0 || j >= size) { thrownewIllegalArgumentException("Index is illegal."); }