如果觉得Cliff_Ford写得不错,点赞鼓励下吧!章节内容会不断的变化,持续更新完善
数组结构的特点
- 一段连续的内存空间,空间内每个元素的类型相同
- 可根据数组下标快速访问
- 如果需要多次调整数组的大小,则需要多次重新分配内存和大量的赋值操作,扩展性一般
数组的操作原理
基于连续内存空间的前提,在起始地址处进行字节运算,得出目标索引的真正物理地址,直接访问读取
本文通过链表的形式来模拟数组的增删查改操作
- 定义以下形式的链表节点
public class Node {
Integer index = null;
Integer val = null;
Node next = null;
}
index表示数组的下标,val表示该下标对应的值
- 通过构造函数模拟虚拟机为语句 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("请输入正确的数组范围");
}
}
- 模拟虚拟机计算真正物理地址的过程
/*获取指定下标的节点*/
public Node getNodeByIndex(int index){
Node p = this.head;
int i = 0;
while(i != index){
p = p.next;
i++;
}
return p;
}
- 模拟数组的增删查改操作
/*增、改*/
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();
}
- 测试代码如下
@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));
}
- 欢迎访问https://github.com/Cliff-Ford/Cliff_Ford-Algorithm获取完整代码
才学浅疏,敬请批评指正
创作不易,转载说明出处