zoukankan      html  css  js  c++  java
  • Java 手动实现SxtArrayList

    本实例基于学习ArrayList的实现原理,实例代码毫无使用价值,供学习使用

    具体详情参考如下代码:

    package com.yanxun.MyArraylist;
    
    public class SxtArrayList<E> {
        private Object[] elementData;
        private int size;
        public static final int DEFALT_CAPACITY = 10;
        public SxtArrayList() {
            elementData = new Object[DEFALT_CAPACITY];
        }
        //构造传参构造大小
        public SxtArrayList(int capacity) {
            if(capacity < 0)
                throw new RuntimeException("这个容器的容量不能为负数");
            else if(capacity == 0)
                elementData = new Object[DEFALT_CAPACITY];
            else
                elementData = new Object[capacity];
        }
        //想容器末尾添加元素
        public void add(E element) {
            //扩容操作
            if(size == elementData.length) {
                //申请一个新的大的数组
                Object[] newArray = new Object[elementData.length + (elementData.length >> 1)];
                //将原数组拷贝到新数组中,并将索引应用到新数组,好像java会自动回收0引用的对象,所以不用释放之前的申请的内存
                System.arraycopy(elementData, 0, newArray, 0, elementData.length);
                elementData = newArray;
            }
            elementData[size++] = element;
        }
        //获取对应的索引的值
        public E get(int index) {
            checkRange(index);
            return (E)elementData[index];
        }
        //修改对应位置的索引值
        public void set(E element, int index) {
            checkRange(index);
            elementData[index] = element;
        }
    
        //返回当前容器元素个数
        public int size() {
            return size;
        }
        //判断当前容器是否为空
        public boolean isEmpty() {
            return size == 0? true : false;
        }
        //检查数组下标是否合法,索引下标是否越界
        public void checkRange(int index) {
            if(index < 0 || index > size - 1) {
                //不合法
                throw new RuntimeException("索引值不合法" + index);//手动抛出异常
            }
        }
        //移除容器中对应的元素
        public void remove(E element) {
            //element,将它和所有元素比较,
            for(int i = 0; i < size; ++ i){
                if(element == elementData[i]) {
                    //将该元素移除容器
                    remove(i);
                }
            }
        }
        //移除容器中对应索引的元素
        public  void remove(int index) {
            int numMoved = elementData.length - index - 1;
            if(numMoved>0)
                System.arraycopy(elementData, index + 1, elementData, index, numMoved);
            elementData[-- size] = null;
        }
        //将容器转化成字符串输出,在输出容器时自动调用
        public String toString() {
            StringBuilder sb = new StringBuilder();//申请一个动态字符串
            sb.append('[');
            for(int i = 0; i < size; ++ i){//将数组中的对象添加到里面
                sb.append(elementData[i] + ",");
            }
            sb.setCharAt(sb.length()-1,']');//修改最后一个逗号
    
            return sb.toString();//返回字符串
        }
    
    
    
        public static void main(String[] args) {
            SxtArrayList<String> s1 = new SxtArrayList(20);
            for(int i = 0; i < 40; ++ i) {
                s1.add("gao" + i);
            }
            System.out.println(s1.get(39));
            s1.set("dfs", 10);
            s1.remove(3);
            System.out.println(s1);
    
        }
    }
    
    追求吾之所爱
  • 相关阅读:
    linux中mysql,mongodb,redis,hbase数据库操作
    hbase数据库操作
    hdfs基本操作
    linux及hadoop基本操作
    创建有关hbase数据库的项目时所遇到的问题
    数据科学与大数据
    《TCP/IP详解卷1:协议》——第2章:链路层(转载)
    《TCP/IP详解卷1:协议》——第1章:概述(转载)
    深入理解计算机操作系统——第9章:缓存,存储器管理
    深入理解计算机操作系统——第9章:物理和虚拟寻址,地址空间
  • 原文地址:https://www.cnblogs.com/rstz/p/14390991.html
Copyright © 2011-2022 走看看