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获取完整代码

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

你可能感兴趣的:(Cliff_Ford-数组)