java实现自定义类HashMap,ArrayList,Queue结构
我们可能了解hashmap的用法,了解过底层的源码,jdk1.7底层采用拉链法实现,jdk1.8中采用红黑树。这里我们用
jdk1.7中的方式实现hashmap数据结构。用结点类实现ArrayList和Queue。
自定义类实现Queue结构:
Queue.java:
package MM;
public class Queue{
private int count;
private QueueNode head;
private QueueNode tail;
public void add(Integer i) {
QueueNode tnode=new QueueNode(i);
if(count==0) {
head=tnode;
tail=tnode;
}
else {
tail.next=tnode;
tail=tnode;
}
count++;
}
public Integer remove() {
if(count==0) {
System.out.println("队列没有结点");
return null;
}
else {
QueueNode t=this.head;
QueueNode t1=t;
while(t.next!=null) {
t1=t;
t=t.next;
}
System.out.println("数据"+t.data+"出队列");
t1.next=null;
count--;
return 1;
}
}
public void size() {
System.out.println("队列的长度为"+this.count);
}
}
QueueNode.java:
package MM;
public class QueueNode {
Integer data;
QueueNode next;
public QueueNode(Integer data) {
this.data=data;
}
}
测试类(TestQueue.java):
package MM;
public class TestQueue {
public static void main(String[] args) {
Queue myLink=new Queue();
myLink.add(10);
myLink.add(20);
myLink.add(30);
myLink.remove();
myLink.remove();
myLink.remove();
}
}
自定义类实现ArrayList结构:
MyArrays.java:
package MM;
public class MyArrays{
ArrayListnode arr[];
int size;
int count=10;
public MyArrays() {
arr =new ArrayListnode[count];
size=0;
}
public void add(Integer i) {
ArrayListnode node=new ArrayListnode(i);
if(this.size+3<count) {
arr[size]=node;
}
else{
ArrayListnode newarr[]=new ArrayListnode[count];
this.count*=2;
for(int j=0;j<size;j++) {
newarr[j]=arr[j];
}
this.arr=new ArrayListnode[count];
for(int j=0;j<size;j++) {
arr[j]=newarr[j];
}
arr[size]=node;
}
this.size++;
}
public void del(int i) {
for(int j=i;j<size -1;j++) {
arr[j]=arr[j+1];
}
arr[size - 1]=null;
size-=1;
}
public void get(int i) {
System.out.println("根据下标得到的数据为"+this.arr[i].data);
}
public void change(Integer data,int index) {
System.out.println("修改之前的数据为"+arr[index].data);
arr[index].data=data;
System.out.println("修改之后的数据为"+data);
}
}
ArrayListnode.java:
package MM;
public class ArrayListnode{
Integer data;
public ArrayListnode(Integer i) {
this.data=i;
}
public ArrayListnode() {
this.data=null;
}
}
测试类(TestArrayList.java):
package MM;
public class TestArrayList{
public static void main(String[] args) {
MyArrays my=new MyArrays();
for(Integer i=0;i<10;i++) {
my.add(i);
}
my.get(6);
my.del(3);
my.get(3);
my.get(8);
}
}
自定义类实现HashMap结构:
HashMap.java:
package MM;
public class HashMap {
public HashMapNode[] arr=null;
public HashMap() {
this.arr=new HashMapNode[5];
for(int i=0;i<5;i++) {
arr[i]=new HashMapNode();
}
}
public int add(String key,Integer value) {
int reflect=value%5;
this.arr[reflect]=this.arr[reflect].add(key,value);
return 1;
}
public int get(String key) {
for(int i=0;i<5;i++) {
Integer result=arr[i].get(key);
if(result!=null) {
System.out.println(result);
return result;
}
}
return 1;
}
}
HashMapNode.java:
package MM;
public class HashMapNode {
public Node head;
public Node next;
public HashMapNode add(String key,Integer i) {
Node node=new Node(key,i);
node.key=key;
node.value=i;
if(this.head==null) {
this.head=node;
System.out.println(node.key+node.value);
}
else {
node.next=this.head;
this.head=node;
}
return this;
}
public Integer get(String key) {
Node node=this.head;
if(this.head.key.equals(key)) {
return this.head.value;
}
while(node.next!=null) {
node=node.next;
if(node.key.equals(key)) {
return node.value;
}
}
return null;
}
}
Node.java:
package MM;
public class Node
{
Node next;
Integer value;
String key;
Node(String key,Integer number)
{
this.key=key;
this.value=number;
}
Node(){}
}
测试类(TestHashMap.java):
package MM;
public class TestHashMap {
public static void main(String[] args) {
HashMap list=new HashMap();
list.add("lyc", 1);
list.add("gc", 2);
list.add("ghl", 3);
list.add("hrx", 4);
list.add("ljm", 5);
list.add("lkk", 6);
list.add("mxd", 7);
list.add("lbp", 8);
list.get("lyc");
list.get("lkk");
}
}
上面实现了jdk自带的一些数据结构,但是有的地方还是写的不够好,比如没有用到泛型,可能一些遍历操作带来的开销
考虑的也不是特别全面。但是基本的数据结构的增删改查可以实现了。我们可以自己试着自定义类来实现一些数据结构。
能够帮助我们更好的理解一些集合的结构。