Cliff_Ford-数组

如果觉得Cliff_Ford写得不错,点赞鼓励下吧!章节内容会不断的变化,持续更新完善

数组结构的特点
  • 一段连续的内存空间,空间内每个元素的类型相同
  • 可根据数组下标快速访问
  • 如果需要多次调整数组的大小,则需要多次重新分配内存和大量的赋值操作,扩展性一般
数组的操作原理

基于连续内存空间的前提,在起始地址处进行字节运算,得出目标索引的真正物理地址,直接访问读取

本文通过链表的形式来模拟数组的增删查改操作
  1. 定义以下形式的链表节点
public class Node {
    Integer index = null;
    Integer val = null;
    Node next = null;
}

index表示数组的下标,val表示该下标对应的值

  1. 通过构造函数模拟虚拟机为语句 int[] a = new int[5] 分配内存的操作
public Arrays(int size){
        try{
            if(size >= 1){
                this.head = new Node();
                this.size = size;
                Node q = head;
                q.index = 0;
                Node p = head;
                for(int i = 1; i < size; i++){
                    q = new Node();
                    q.index = i;
                    p.next = q;
                    p = p.next;
                }
            }else{
                throw new Exception();
            }
        }catch (Exception e){
            System.out.println("请输入正确的数组范围");
        }
    }
  1. 模拟虚拟机计算真正物理地址的过程
/*获取指定下标的节点*/
    public Node getNodeByIndex(int index){
        Node p = this.head;
        int i = 0;
        while(i != index){
            p = p.next;
            i++;
        }
        return p;
    }
  1. 模拟数组的增删查改操作
    /*增、改*/
    public void add(int index, int val){
        if(!isOutOfSize(index)){
            Node t = getNodeByIndex(index);
            t.val = val;
        }else{
            System.out.println("数组访问越界");
        }
    }
    /*删*/
    public void delete(int index){
        if(!isOutOfSize(index)){
            Node t = getNodeByIndex(index);
            t.val = null;
        }else{
            System.out.println("数组访问越界");
        }
    }
    /*查*/
    public Integer get(int index){
        if(!isOutOfSize(index)){
            Node t = getNodeByIndex(index);
            return t.val;
        }else{
            System.out.println("数组访问越界");
        }
        return null;
    }
    /*遍历*/
    public void check(){
        Node h = this.head;
        while (h != null){
            System.out.print(h.index + " " + h.val + " ");
            h = h.next;
        }
        System.out.println();
    }
  1. 测试代码如下
    @Test
    public void Test(){
        Arrays arrays = new Arrays(5);
        arrays.check();
        arrays.add(0,0);
        arrays.add(1,1);
        arrays.add(2,2);
        arrays.add(3,3);
        arrays.add(4,4);
        arrays.check();
        arrays.add(2,4);
        arrays.check();
        arrays.delete(2);
        arrays.check();
        System.out.println(arrays.get(2));
    }
  1. 欢迎访问https://github.com/Cliff-Ford/Cliff_Ford-Algorithm获取完整代码

才学浅疏,敬请批评指正
创作不易,转载说明出处

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 什么是数组? 数组简单来说就是将所有的数据排成一排存放在系统分配的一个内存块上,通过使用特定元素的索引作为数组的下...
    启明_b56f阅读 950评论 0 0
  • 在一个方法内部定义的变量都存储在栈中,当这个函数运行结束后,其对应的栈就会被回收,此时,在其方法体中定义的变量将不...
    Y了个J阅读 4,444评论 1 14
  • 1. 基础知识 1.1、 基本概念、 功能 冯诺伊曼体系结构1、计算机处理的数据和指令一律用二进制数表示2、顺序执...
    yunpiao阅读 5,425评论 1 22
  • 1. 王阳明如何在《大学》中找到秘密彩蛋? 他在梦中明白了“格物致和”的道理。 2. 王阳明在《大学》这部书中发现...
    随心2018729阅读 189评论 0 0
  • 传播这件事情上,真真假假,多少会扰乱你的视听,多一点智慧,很重要。 周末接到一通电话,一个客户打来的,他说他28天...
    神经丝阅读 365评论 2 4