• Java基础——数组队列的原理和实现


    1.数组

    1.1 数组基本概念

    数组是一个容器,可以存储同一数据类型的N个数据;

    数组是一个数据结构,是数据结构中访问速度最快的;

    数组是直接通过下标进行定位;

    数组是属于引用数据类型(数组名中存储的是内存首地址);

    数组本身只有有length属性(获取数组能存储的数据个数),但是有从Objuect父类继承的属性和方法。

    1.2数组在内存中的存储:

    数组在内存中是一个连续的存储空间;

    一维数组、二维数组....

    1.3数组排序:

    堆排序

    2.数组队列

    利用数组这个数据结构,来实现多个数据的类。

    数组在定义的时候要定义类型和大小,定义完后不能修改(不能动态改变大小和数据类型)。

    存储数据的个数是会根据实际情况进行变化,但是数组大小无法改变。

    不确定要存储的个数:

            数组定义大了,数据小了,浪费空间;

            数组定义小了,数据多了,越界、存储不下。

            要满足上述两种要求,利用数组名中存储的是数组对象在堆内存中的首地址。

    存储数据类型,在单独某一个程序使用中是不会存在太大问题。

            数组队列是否能够通用,数据类型。

            Object是所有类的父类:Java中所有基本数据类型都由对应一个类,其父类为Object。

            如果要求数组中只能存储某一种数据类型;

            如果要求数组中可以存储任何数据类型。

            要满足上述两种要求,只能使用Java泛型。

            泛型不是数据类型,是一种特殊的符号,用于泛指Java中任意一种引用类型。

            在编写数组队列(提供的插件类),不确定之后要存储的数据类型,则只能使用泛型的表示。

            泛型在此处只是一个占位符,之后在使用中。

     

    3.源码

    3.1 myArrayList<E>

    package com.java8.arraylist;
    
    /**
     * 自定义数组队列类
     *
     * @param <E>
     */
    public class myArrayList<E> {
    
        // 声明数组名称:Object数组类型,使用时可以适配所有类型
        // 不要忘记Object[],后面要加[]
        private Object[] array;
        //初始化数组序号index
        private int index = 0;
        //初始化数组的长度length
        private int length = 1;
    
        /**
         * 无参构造函数
         * 构造array对象,初始化大小为length = 1
         */
        public myArrayList() {
            array = new Object[length];
        }
    
        /***
         * 添加元素与数组队列
         * @param e
         */
        public void add(E e) {
            //1.若放入的第index个元素,比数组长度小,则直接放入
            if (index < length) {
                array[index] = e;
                index++;
            }
            //2.若放入的第index个元素,比数组长度大,则:扩充数组长度
            else {
                //2.1 新建一个2倍length的数组tempArray:数据类型Object[]
                Object[] tempArray = new Object[2 * length];
                //2.2 复制array的全部值(index=length个)至tempArray
                for (int i = 0; i < index; i++) {
                    tempArray[i] = array[i];
                }
                //2.3 将最新的元素,放入tempArray
                tempArray[index] = e;
                //2.4 更新array为tempArray【千万不要忘记!!!】
                array = tempArray;
                //2.5 更新长度length
                length = tempArray.length;
                //2.6 更新序号index
                index++;
            }
        }
    
        /**
         * 数组大小
         * @return:int 数组大小
         */
        public int size(){
            //序号往往是最好一个,数组队列的size也就是序号值
            return index;
        }
    
        /**
         * 第index个元素
         * @param index:int,第几个
         * @return 返回数组队列中的第index个元素,E类型
         */
        public E get(int index){
            if(index<0||index>length){
                return null;
            }else{
                //(E):表示将Object类的元素,强制转换为E类型的元素
                return (E) array[index];
            }
        }
    }
    

    3.2 测试代码myManage

    package com.java8.arraylist;
    
    import java.util.Random;
    
    public class MyManage {
        public static void main(String arg[]) {
    
            //创建数组队列对象
            myArrayList<Integer> listInt = new myArrayList<Integer>();
            //随机获取size的大小,长度不定
            int size = new Random().nextInt(20) + 1;
    
            //放置元素于数组队列:add(i)
            for (int i = 0; i < size; i++) {
                listInt.add(i);
            }
    
            //输出数组队列所有元素:size()和get(i)
            for (int i = 0; i < listInt.size(); i++) {
                System.out.println("第index个元素为:" + listInt.get(i));
            }
        }
    
    }
    
    
  • 相关阅读:
    Atcoder Tenka1 Programmer Contest 2019 D Three Colors
    Codeforces 1146E Hot is Cold
    ZOJ 3820 Building Fire Stations
    ZOJ 3822 Domination
    ZOJ 3949 Edge to the Root
    Codeforces 1144G Two Merged Sequences
    PTA 团体程序设计天梯赛 L3-020 至多删三个字符
    BZOJ 5102: [POI2018]Prawnicy
    BZOJ 1045: [HAOI2008] 糖果传递
    2017-2018 ACM-ICPC, Asia Tsukuba Regional Contest
  • 原文地址:https://www.cnblogs.com/iriswang/p/11084637.html
Copyright © 2020-2023  润新知