看了《自己动手写Java虚拟机》这本书
然后用go语言写了一个Java虚拟机
来试试看它能执行哪些Java代码吧
编译器:jdk1.8 虚拟机:jvmgo
public class Main { // 手写双向循环链表 public static void main(String[] args) { DoubleCircularLinkedList L = new DoubleCircularLinkedList(); L.add(0,0); L.add(1,1); L.add(2,2); L.add(3); L.show(); L.delete(1); L.show(); L.set(2,19); L.show(); } static class DoubleCircularLinkedList { // 头节点只做标识作用,不存放数据 Node head; // 当前节点,用来更快地进行指定位置的插入删除操作 Node pointer; // 当前节点所在的下标 int pointerIndex; // 节点个数 public int size; public DoubleCircularLinkedList() { head = new Node(); head.setNext(head); head.setPrev(head); pointer = head; pointerIndex = -1; size = 0; } /** * 把pointer定位到index */ public int indexTo(int index) { if (index < -1 || index > size - 1) { throw new ArrayIndexOutOfBoundsException("越界"); } else { if (index == -1) { pointer = head; pointerIndex = -1; return -1; } else if (index == pointerIndex) { return pointerIndex; } else { // 为了更高的效率,根据原来的位置与现在要定位的位置来改变,而不是每次都从头开始 // 向后走效率更高 while (index - pointerIndex > pointerIndex - index) { pointer = pointer.getNext(); pointerIndex++; } while (index - pointerIndex < pointerIndex - index) { pointer = pointer.getPrev(); pointerIndex--; } return pointerIndex; } } } /** * 在指定位置添加元素 */ public void add(int index, int data) { // 先让当前指针指向前一个位置 indexTo(index - 1); Node target = new Node(data); target.setNext(pointer.getNext()); pointer.setNext(target); target.setPrev(pointer); target.getNext().setPrev(target); size++; } /** * 在末尾添加元素 */ public void add(int data) { pointer = head.getPrev(); pointerIndex = size - 1; Node node = new Node(data); pointer.getNext().setPrev(node); node.setNext(pointer.getNext()); node.setPrev(pointer); pointer.setNext(node); size++; } /** * 在指定位置删除元素 */ public void delete(int index) { indexTo(index - 1); pointer.getNext().getNext().setPrev(pointer); pointer.setNext(pointer.getNext().getNext()); size--; } /** * 在末尾删除元素 */ public void delete() { indexTo(size - 2); pointer.getNext().getNext().setPrev(pointer); pointer.setNext(pointer.getNext().getNext()); size--; } public void set(int index, int data) { indexTo(index); pointer.setData(data); } // 得到最后一个节点的数据 public int get() { pointer = head.getPrev(); pointerIndex = size - 1; return pointer.getData(); } //查看链表的全部元素 public void show() { if (size == 0) { System.out.println("链表是空的"); } else { int x = size; pointer = head; pointerIndex = -1; while (x-- != 0) { System.out.println(pointer.getNext().getData()); pointer = pointer.getNext(); pointerIndex++; } System.out.println("================"); } } } static class Node { private Node prev; private Node next; private int data; Node(){} Node(int data){ this.data = data; } Node(Node node){ this.setNext(node.getNext()); this.setPrev(node.getPrev()); this.setData(node.getData()); } public Node getPrev() { return prev; } public void setPrev(Node prev) { this.prev = prev; } public Node getNext() { return next; } public void setNext(Node next) { this.next = next; } public int getData() { return data; } public void setData(int data) { this.data = data; } } }
运行结果: