package com;
public class linkList {
public final class Node{
public Object k;
public Object v;
public Node next=null;
public Node(Object k,Object v,Node next){
this.k=k;
this.v=v;
this.next=next;
}
}
static Node [] s= new Node[16];
public void put(Object k,Object v){
if(k==null) return;
int hashCode=k.hashCode()%s.length;
if(s[hashCode]==null){
s[hashCode]=new Node (k,v,null);
}else{
Node n=s[hashCode];
while (true){
if(n.k==k){
n.v=v;
break;
}else{
if(n.next==null){
n.next=new Node (k,v,null);
break;
}else{
n=n.next;
}
}
}
}
}
public Object get(Object k){
Object v=null;
if(k==null)
return null;
int hashCode=k.hashCode()%s.length;
Node n=s[hashCode];
while(true){
if(n!=null){
if(n.k==k){
v=n.v;
return v;
}else{
if(n.next!=null){
n=n.next;
}else{
return null;
}
}
}else{
return null;
}
}
}
public void remove1(Object k){//这是我自己总结的 ,开始一直没明白,开始以为跟之前的添加一样,删除的时候吧节点设置为空就行了,其实不想,看了hashmap,remove源码受到启发,设置上一个节点初始为空prv 就改变了数组
if(k==null)
return ;
int hashCode=k.hashCode()%s.length;
Node[] tab = this.s;
int index = hashCode & (tab.length - 1);
Node e=tab[index];
Node prv =null;
while(true){
if(e!=null){
if(e.k==k){
if(prv==null){//如果删除的是第一个节点
tab[index]=e.next;
}else{
prv.next=e.next;
}
break ;
}else{
if(e.next!=null){
prv=e;
e=e.next;
}else{
return ;
}
}
}else{
break ;
}
}
}
public void remove(Object k) {//这是hasmap 用的remove 方法
Node[] tab = this.s;
int hashCode=k.hashCode()%s.length;
int index = hashCode & (tab.length - 1);
for ( Node e = tab[index], prev = null;
e != null; prev = e, e = e.next) {
if (k.equals(e.k)) {
if (prev == null) {
tab[index] = e.next;
} else {
prev.next = e.next;
}
}
}
}
public static void main(String[] args) {
linkList linkList= new linkList();
linkList.put("c", "1211212");
linkList.put("s", "11111");
linkList.remove1("c");
System.out.println(linkList.get("s"));
System.out.println(linkList.get("c"));
}
}
public class linkList {
public final class Node{
public Object k;
public Object v;
public Node next=null;
public Node(Object k,Object v,Node next){
this.k=k;
this.v=v;
this.next=next;
}
}
static Node [] s= new Node[16];
public void put(Object k,Object v){
if(k==null) return;
int hashCode=k.hashCode()%s.length;
if(s[hashCode]==null){
s[hashCode]=new Node (k,v,null);
}else{
Node n=s[hashCode];
while (true){
if(n.k==k){
n.v=v;
break;
}else{
if(n.next==null){
n.next=new Node (k,v,null);
break;
}else{
n=n.next;
}
}
}
}
}
public Object get(Object k){
Object v=null;
if(k==null)
return null;
int hashCode=k.hashCode()%s.length;
Node n=s[hashCode];
while(true){
if(n!=null){
if(n.k==k){
v=n.v;
return v;
}else{
if(n.next!=null){
n=n.next;
}else{
return null;
}
}
}else{
return null;
}
}
}
public void remove1(Object k){//这是我自己总结的 ,开始一直没明白,开始以为跟之前的添加一样,删除的时候吧节点设置为空就行了,其实不想,看了hashmap,remove源码受到启发,设置上一个节点初始为空prv 就改变了数组
if(k==null)
return ;
int hashCode=k.hashCode()%s.length;
Node[] tab = this.s;
int index = hashCode & (tab.length - 1);
Node e=tab[index];
Node prv =null;
while(true){
if(e!=null){
if(e.k==k){
if(prv==null){//如果删除的是第一个节点
tab[index]=e.next;
}else{
prv.next=e.next;
}
break ;
}else{
if(e.next!=null){
prv=e;
e=e.next;
}else{
return ;
}
}
}else{
break ;
}
}
}
public void remove(Object k) {//这是hasmap 用的remove 方法
Node[] tab = this.s;
int hashCode=k.hashCode()%s.length;
int index = hashCode & (tab.length - 1);
for ( Node e = tab[index], prev = null;
e != null; prev = e, e = e.next) {
if (k.equals(e.k)) {
if (prev == null) {
tab[index] = e.next;
} else {
prev.next = e.next;
}
}
}
}
public static void main(String[] args) {
linkList linkList= new linkList();
linkList.put("c", "1211212");
linkList.put("s", "11111");
linkList.remove1("c");
System.out.println(linkList.get("s"));
System.out.println(linkList.get("c"));
}
}