ArrayList的说明及实现
说明
对于ArrayList他的底层是结构其实是数组,那它与数组的区别在哪呢?
它多了一个变量usedSize即有效长度,数组的长度并不代表的它的有效长度,我们从ArrayList的源码可以看到
它并没有为它的底层结构分配内存,那数据是如何分配的?
其实它的内存大小的初始值是在执行它的add()函数时才有的:
注意事项
**删除某一位置元素:**在删除某一位置的元素时,我们采用将后一个元素依次前移将其覆盖的方式,当数组下标移动到usedSize-1时,即最后一个元素,不能再采用elem[i]=elem[i+1],应为elem[i+1]已经超过了有效范围,此时会报错,我们只需要将usedSize-1即可,后面再进行相关操作时将其覆盖即可。同时注意在此之前判断数组是否为空。
**在某位置插入元素:**与删除某一位置的元素不同的地方是,删除时是将元素从删除位置的后一个逐渐前移,达到覆盖的效果,而插入时是从最后一个元素开始逐渐向后移动,当然在进行新增元素时,要先判度数组是否已满,若已满,则要进行扩容操作即:
**与位置相关的:**只要涉及到位置,我们就要先判断位置是否合法;在位置不合法时自定义异常,然后抛出异常,在主函数中有可能发生异常的代码块用try…catch包裹起来即:
完整代码
import java.util.Arrays;
class myArrayList{
private int[] elem;
private int usedSize;
public myArrayList(int[] elem, int usedSize) {
this.elem = elem;
this.usedSize = usedSize;
}
// 打印顺序表
public void mytoString() {
for (int i=0;i<usedSize;i++){
System.out.print(elem[i]+" ");
}
}
public boolean isFull(){
if(elem.length==usedSize){
return true;
}
return false;
}
// 新增元素,默认在数组最后新增
public void add(int data) {
if(isFull()){
this.elem= Arrays.copyOf(this.elem,2*this.elem.length);
}
elem [usedSize]=data;
usedSize++;
}
// 在 pos 位置新增元素
public void add(int pos, int data) {
if(pos<0||pos>usedSize){
System.out.println("位置输入错误!");
throw new RuntimeException("位置输入错误");
}
if (isFull()){
this.elem=Arrays.copyOf(this.elem,2*this.elem.length);
}
for(int i=usedSize-1;i>=pos;i--){
elem[i+1]=elem[i];
}
elem[pos]=data;
usedSize++;
}
// 判定是否包含某个元素
public boolean contains(int toFind) {
for (int i=0;i<usedSize;i++){
if(elem[i]==toFind){
return true;
}
}
return false;
}
// 查找某个元素对应的位置
public int indexOf(int toFind) {
for (int i = 0; i < usedSize; i++) {
if (elem[i] == toFind) {
return i;
}
}
return -1;
}
// 获取 pos 位置的元素
public int get(int pos) {
if(pos<0||pos>usedSize){
System.out.println("位置输入错误!");
throw new RuntimeException("位置输入错误");
}
return elem[pos];
}
// 给 pos 位置的元素设为 value
public void set(int pos, int value) {
if(pos<0||pos>usedSize){
System.out.println("位置输入错误!");
throw new RuntimeException("位置输入错误");
}
elem[pos]=value;
}
public boolean isEmpty(){
if(usedSize==0){
return true;
}
return false;
}
//删除第一次出现的关键字key
public void remove(int toRemove) {
if(isEmpty()){
return;
}
int index=indexOf(toRemove);
for (int i=index;i<usedSize-1;i++){
elem[i]=elem[i+1];
}
usedSize--;
}
// 获取顺序表长度
public int size() {
return usedSize;
}
// 清空顺序表
public void clear() {
usedSize=0;
}
}
public class TestArrayList {
public static void main(String[] args) {
int[] array=new int[10];
myArrayList myarraylist=new myArrayList(array,0);
myarraylist.add(1);
myarraylist.add(2);
myarraylist.add(3);
myarraylist.add(4);
System.out.println("输出全部元素");
myarraylist.mytoString();
System.out.println();
System.out.println("向固定位置添加元素");
myarraylist.add(2,5);
myarraylist.mytoString();
System.out.println();
System.out.println("设置某位置元素");
try {
myarraylist.set(4, 7);
System.out.println("获取某位置的元素");
System.out.println(myarraylist.get(4));
}catch(RuntimeException e){
e.printStackTrace();
}
myarraylist.mytoString();
System.out.println();
System.out.println("判度是否包含");
System.out.println(myarraylist.contains(6));
System.out.println("删除");
myarraylist.remove(3);
myarraylist.mytoString();
System.out.println();
System.out.println("顺序表长度");
System.out.println(myarraylist.size());
System.out.println("清空");
myarraylist.clear();
myarraylist.mytoString();
}
}