栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

动态数组学习,Java实现

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

动态数组学习,Java实现

文章目录

1. 动态数组需要实现的接口2. 需要注意的点3. 代码

1. 动态数组需要实现的接口
1. int size();//元素的数量
2. boolean isEmpty();//是否为空
3. boolean contains(E element);//是否包含某个元素
4. void add(E element);//添加元素到最后面
5. E get(int index);返回index位置对应的元素
6. E set(int index,E element);//设置index位置的元素
7. void add(int index,E element);//往index位置添加元素
8. int indexOf(E element);//查看元素的位置
9. void clear();//清除所有的元素
2. 需要注意的点

在下面代码中,new Object在堆空间中存放的是内存的地址,真实的对象还没有没创建,只有当引用指向内存地址时该对象才真正被创建。

elements = (E[]) new Object[capacity];

清除所有元素时,只需要将存地址的指针指向null,而不应该element指向null,这样会多次频繁申请空间

public void clear() {
    for (int i = 0; i < size; i++) {
        elements[i]=null;
    }
    
}
3. 代码
package com.fx.arrayList;


import java.util.Arrays;


@SuppressWarnings("unchecked")
public class ArrayList {
    private int size;//元素的数量
    private E[] elements;//所有的元素
    private static final int DEFAULT_CAPACITY = 10;//默认存放十个元素
    private static final int ELEMENT_NOT_FOUND = -1;//没有找到元素的返回值

    public ArrayList() {
        this(DEFAULT_CAPACITY);
    }

    //通过构造器传入元素的容量
    public ArrayList(int capacity) {
        capacity = (capacity < DEFAULT_CAPACITY) ? DEFAULT_CAPACITY : capacity;
        elements = (E[]) new Object[capacity];
    }

    
    public void add(int index, E element) {
        //注意这里的范围判断要变大一位,表示可以在末尾插入元素
        rangeCheckForAdd(index);
        ensureCapacity(size + 1);
        for (int i = size; i > index; i--) {
            elements[i] = elements[i - 1];
        }
        elements[index] = element;
        size++;
    }

    
    public void add(E element) {
        add(size, element);
    }

    
    public E remove(int index) {
        rangeCheck(index);
        E oldElement = elements[index];
        for (int i = index; i < size; i++) {
            elements[i] = elements[i + 1];
        }
        //存放对象的数组需要移除最后一个元素防止浪费空间
        elements[--size]=null;
        return oldElement;
    }


    
    public void clear() {
        for (int i = 0; i < size; i++) {
            elements[i]=null;
        }
        size=0;
    }

    public boolean contains(E element){
        return indexOf(element) >= 0;
    }

    
    public int indexOf(E element) {
        if(element==null){
            for (int i = 0; i < size; i++) {
                if (elements[i]==null) return i;
            }
        }else {
            for (int i = 0; i < size; i++) {
                //让使用者指定E的比较方法,如未指定,即比较内存地址
                if (element.equals(elements[i])) {
                    return i;
                }
            }
        }
        return ELEMENT_NOT_FOUND;
    }

    
    public E set(int index, E element) {
        rangeCheck(index);
        E oldElement = elements[index];
        elements[index] = element;
        return oldElement;
    }

    
    public E get(int index) {
        rangeCheck(index);
        return elements[index];
    }

    
    public boolean isEmpty() {
        return size == 0;
    }

    
    public int size() {
        return size;
    }

    @Override
    public String toString() {
        StringBuilder sbf = new StringBuilder();
        sbf.append("size=").append(size).append(",[");
        for (int i = 0; i < size; i++) {
            if (i != 0) {
                sbf.append(", ");
            }
            sbf.append(elements[i]);
        }
        sbf.append("]");
        return sbf.toString();
    }

    
    private void ensureCapacity(int capacity) {
        int oldCapacity = elements.length;
        if (capacity < oldCapacity) return;
        //扩容1.5倍
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        elements = Arrays.copyOf(elements, newCapacity);
    }

    
    private void rangeCheckForAdd(int index) {
        if (index < 0 || index > size) {
            outOfBound(index);
        }
    }

    
    private void rangeCheck(int index) {
        if (index < 0 || index > size - 1) {
            outOfBound(index);
        }
    }

    
    private void outOfBound(int index) {
        throw new IndexOutOfBoundsException("索引值不合法,index=" + index + ",实际大小size=" + size);
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/760393.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号