2.5 indexOf 方法
// 查找某个元素对应的位置 public int indexOf(int toFind) { //1.遍历数组 for (int i = 0; i < getSize(); i++) { if (this.elem[i] == toFind) { return i; //2.找到返回下标 } } //3.找不到返回-1 return -1; }
这个方法跟上面contains方法大同小异,无需多言!
2.6 get 方法
// 获取 pos 位置的元素 public int get(int pos) { //1.判断pos位置是否合法 if (pos > getSize() || pos < 0) { throw new IllegalPosException("获取pos位置不合法"); } //2.返回pos位置值 return this.elem[pos]; }
这个方法需要注意的点就是判断pos下标位置的合法性,注意这一点就ok了!
2.7 set 方法
// 给 pos 位置的元素设为 value public void set(int pos, int value) { //1.判断pos位置是否合法 if (pos > getSize() || pos < 0) { throw new IllegalPosException("pos位置不合法"); } //2.设置值 this.elem[pos] = value; }
好像跟上面的 get 方法没什么区别唉,多简单就不用我多说了吧!
2.8 remove 方法
//删除第一次出现的关键字key public void remove(int toRemove) { //1.获取第一次key出现的位置 int pos = indexOf(toRemove); if (pos == -1) { return; } //2.从pos位置的元素都往前覆盖 for (int i = pos + 1; i < getSize(); i++) { this.elem[i - 1] = this.elem[i]; } //3.有效数据减一(如果是引用类型需要置null) this.size--; }
这个方法我们就可以复用我们之前写的 indexOf 方法了,不用重新写查找逻辑了,接着把后面的元素覆盖掉 pos 下标的元素就可以了!记得别忘记有效数据减一哦!
2.9 getSize 和 clear 方法
// 获取顺序表长度 public int getSize() { return this.size; } // 清空顺序表 public void clear() { this.size = 0; }
这两个就简单了吧,但是要注意一点,如果你的顺序表放的是引用类型,需要置null,方法已经实现的差不多了,感兴趣的下来结合代码画图写一写吧!
3、ArrayList 的学习
3.1 ArrayList的成员属性
- ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问
- ArrayList实现了Cloneable接口,表明ArrayList是可以clone的
- ArrayList实现了Serializable接口,表明ArrayList是支持序列化的
这就是类定义的前部分,这里还是比较复杂的,会随着我们学习的深入,逐步学习到。
接下来我们来看ArrayList的几个成员变量:
3.2 ArrayList的构造方法
3.2.1 构造方法1
当前是一个带参数的构造方法,很好理解,根据传递的参数开辟大小,如果参数是等于0,就直接把 EMPTY_ELEMENTDATA 共享空数组赋值给存放数据的数组中, 如果是给定一个负数,显然是错误的,也即直接抛出异常!
3.2.2 构造方法2
奇怪,这个无参构造方法居然也是给了一个空数组,也就是没有分配数组内存,那到底是怎么把数据放进去的呢?别急,随着后面的讲解,你会解开这个谜题。
3.2.3 构造方法3
按照集合迭代器返回元素的顺序,构造一个包含指定集合元素的列表,如果是属于同类型,就直接放入到存放数据的数组中,如果不是同类型,则利用 copyOf 拷贝指定的集合,如果指定集合长度为0,则把 EMPTY_ELEMENTDATA 共享空数组赋值给存放数据的数组中。
这个地方如果你不是很理解,没关系,因为现在还没接触迭代器,随着学习的深入就会接触到。
3.3 ArrayList 的 add 方法
别小看这几行代码,跟我们自己模拟实现的还是有区别的,真正有内涵的代码其实在 ensureCapacityInternal 这个方法中,那么现在,我们就一步步去解开他的面纱:
有了上面的图解我们不难看出,真正的扩容是在 add 方法中实现的,所以在实例化 ArrayList 的时候,是不会默认给你开辟空间的。所以 ArrayList 默认容量是在 add 方法调用后,才会分配空间。而且在真正扩容之前会检测是否能扩容成功,防止太大导致扩容失败。
3.4 ArrayList的常用方法
还有其他方法需要使用的话,就可以去查阅Java的帮助文档,到了数据结构阶段,就要尝试着自己看源码,看文档了,培养自主学习的能力!