æ ˆçš„ç‰¹ç‚¹åQšåŽ˜q›å…ˆå‡ºï¼Œæ‰€ä»¥ä¸€ä¸ªçº¿æ€§é“¾è¡¨å®žçŽ°çš„æ ˆä¹Ÿåªèƒ½åœ¨ä¸€ç«¯æ“作æ‰èƒ½æ»¡‘Œ™¿™¿U特性;
/**
* @Author: zzz
* @CreateTime: 2017/3/27 14:51
* @Description:
*/
public class MyStack<T> {
private Node top;//æ°¸è¿œæŒ‡å‘æ ˆé¡¶å…ƒç´
//å…ƒç´ ä¸ªæ•°
private int size;
/**
* 内部¾c»ï¼Œå®šä¹‰èŠ‚ç‚¹
*/
private class Node {
public T data;
public Node next;
public Node(T data, Node next) {
this.data = data;
this.next = next;
}
}
public void push(T data) {
//next 指å‘当å‰å…ƒç´ top,如果是第一个元ç´?/span>next 指å‘null;
Node node = new Node(data, top);
//把当å‰å…ƒç´ 指å?/span>top
top = node;
size++;
}
public T pop() {
Node oldNode = top;
top = top.next;
oldNode.next = null;
//释放引用
return oldNode.data;
}
//˜q”å›žæ ˆé¡¶çš„å…ƒç´ ï¼Œä½†ä¸å‡ºæ ˆ
public T peek() {
return top.data;
}
// 判æ–é“¾æ ˆæ˜¯å¦ä¸ºç©ºæ ?br /> public boolean empty() {
return size == 0;
}
public String toString() {
// é“¾æ ˆä¸ºç©ºé“¾æ ˆæ—?br /> if (empty())
return "[]";
else {
StringBuilder sb = new StringBuilder("[");
for (Node current = top; current != null; current = current.next) {
sb.append(current.data.toString() + ", ");
}
int len = sb.length();
return sb.delete(len - 2, len).append("]").toString();
}
}
public static void main(String[] args) throws Exception {
MyStack stack = new MyStack<String>();
for (int i = 0; i <= 10; i++) {
stack.push("111111-" + i);
}
System.out.println(stack);
System.out.println("frist pop="+stack.pop());
System.out.println("second pop="+stack.pop());
System.out.println("thrid pop="+stack.pop());
System.out.println("pop 之åŽçš?/span>"+stack);
}/**
* Created by zz.zhang on 2018/1/4.
*/
public class MyStack<T> {
private int DEFAULT_SIZE = 8;//å®šä¹‰æ ˆçš„åˆå§‹é»˜è®¤é•¿åº¦
private int capacity;//ä¿å˜™åºåºæ ˆçš„长度
private int size;//ä¿å˜™åºåºæ ˆä¸å…ƒç´ 的个æ•?/span>
private Object[] elementData;//定义一个数¾l„用于ä¿å˜é¡ºåºæ ˆä¸çš„å…ƒç´
public MyStack() {
capacity = DEFAULT_SIZE;
elementData = new Object[capacity];
}
public MyStack(int initSize) {
capacity = 1;
while (capacity < initSize) {
capacity <<= 1;//ž®†capacity讄¡½®æˆå¤§äºŽinitSize的最ž®?‹Æ¡æ–¹
}
elementData = new Object[capacity];
}
public void push(T element) throws Exception {
elementData[size++] = element;
}
public T pop() throws Exception {
if (empty()) {
throw new IndexOutOfBoundsException("æ ˆç©ºåQŒä¸èƒ½å‡ºæ ?);
}
T oldValue = (T) elementData[size - 1];
elementData[--size] = null; // 讄¡½®æˆnull 让JVM垃圾回收
return oldValue;
}
public boolean empty() {
return size == 0;
}
//˜q”回当剙åºåºæ ˆä¸å…ƒç´ 的个æ•?/span>
public int length() {
return size;
}
//èŽ·å–æ ˆé¡¶å…ƒç´ åQŒä¸ä¼?x¨¬)å°†æ ˆé¡¶å…ƒç´ åˆ é™?/span>
public T peek() throws Exception {
if (size == 0)
throw new ArrayIndexOutOfBoundsException("æ ˆäØ“(f¨´)½I?);
return (T) elementData[size - 1];
}
public void clear() {
for (int i = 0; i < size; i++) {
elementData[i] = null;
}
size = 0;
}
public static void main(String[] args)throws Exception{
MyStack<String> stack=new MyStack<String>(30);
for(int i=0 ;i<30;i++){
stack.push(String.valueOf(i));
}
System.out.println(stack.pop());
System.out.println(stack.peek());
}
}
HASH 主è¦ç”¨äºŽä¿¡æ¯å®‰å…¨é¢†åŸŸä¸åŠ å¯†ç®—æ³•ï¼Œå®ƒæŠŠä¸€äº›ä¸åŒé•¿åº¦çš„ä¿¡æ¯è½¬åŒ–æˆæ‚ä¹Þqš„128 ä½çš„¾~–ç , ˜q™äº›¾~–ç 值å«åšHASH å€? 也å¯ä»¥è¯´åQŒhash ž®±æ˜¯æ‰‘Öˆ°ä¸€¿Uæ•°æ®å†…容和数æ®å˜æ”¾åœ°å€ä¹‹é—´çš„æ˜ ž®„å…³¾p?/p>
例如å—符ä¸?nbsp;hello 的哈希算æ³?/p>
char* value = "hello"; int key = (((((((27* (int)'h'+27)* (int)'e') + 27)  * (int)'l') + 27) * (int)'l' +27) * 27 ) + (int)'o' ;�/p>
数组的特ç‚ÒŽ(gu¨©)˜¯åQšå¯»å€å®ÒŽ(gu¨©)˜“åQŒæ’å…¥å’Œåˆ é™¤å›°éš¾åQ›è€Œé“¾è¡¨çš„特点是:(x¨¬)å¯Õd€å›°éš¾åQŒæ’å…¥å’Œåˆ é™¤å®ÒŽ(gu¨©)˜“。那么我们能ä¸èƒ½¾l¼åˆä¸¤è€…çš„ç‰ÒŽ(gu¨©)€§ï¼Œåšå‡ºä¸€¿U寻å€å®ÒŽ(gu¨©)˜“åQŒæ’å…¥åˆ é™¤ä¹Ÿå®ÒŽ(gu¨©)˜“ 的数æ®ç»“构?½{”案是肯定的åQŒè¿™ž®±æ˜¯æˆ‘ä»¬è¦æèµïL(f¨¥ng)š„哈希表,哈希表有多ç§ä¸åŒçš„实现方法,我接下æ¥è§£é‡Šçš„æ˜¯æœ€å¸¸ç”¨çš„一¿Uæ–¹æ³?#8212;— 拉链法,我们å¯ä»¥ç†è§£ä¸?#8220; 链表 的数¾l?#8221; åQŒå¦‚图:(x¨¬)
HashMap其实也是一个线性的数组实现çš?所以å¯ä»¥ç†è§£äØ“(f¨´)å…¶å˜å‚¨æ•°æ®çš„容器ž®±æ˜¯ä¸€ä¸ªçº¿æ€§æ•°¾l„。这å¯èƒ½è®©æˆ‘们很ä¸è§£åQŒä¸€ä¸ªçº¿æ€§çš„æ•°ç»„怎么实现按键值对æ¥å˜å–æ•°æ®å‘¢åQŸè¿™é‡ŒHashMap有åšä¸€äº›å¤„ç†ã€?/p>
1.首先HashMap里é¢å®žçŽ°ä¸€ä¸ªé™(r¨´n)æ€å†…部类Entry å…‰™‡è¦çš„属性有 key , value, next,从属性key,value我们ž®Þpƒ½å¾ˆæ˜Žæ˜„¡š„看出æ¥Entryž®±æ˜¯HashMap键值对实现的一个基¼‹€bean,我们上é¢è¯´åˆ°HashMap的基 ¼‹€ž®±æ˜¯ä¸€ä¸ªçº¿æ€§æ•°¾l?˜q™ä¸ªæ•°ç»„ž®±æ˜¯Entry[]åQŒMap里é¢çš„内定wƒ½ä¿å˜åœ¨Entry[]里é¢ã€?/p>
2.既然是线性数¾l„,ä¸ÞZ»€ä¹ˆèƒ½éšæœºå˜å–åQŸè¿™é‡ŒHashMap用了(ji¨£n)ä¸€ä¸ªå°½Ž—æ³•åQŒå¤§è‡´æ˜¯˜q™æ ·å®žçްåQ?/p>
到这里我们轻愡š„ç†è§£äº?ji¨£n)HashMap通过键值对实现å˜å–的基本原ç?/p>
3.ç–‘é—®åQšå¦‚果两个key通过hash % Entry[].length得到的index相åŒåQŒä¼š(x¨¬)ä¸ä¼š(x¨¬)有覆盖的å±é™©åQ?/p>
˜q™é‡ŒHashMap里é¢ç”¨åˆ°é“‘ּ数殾l“构的一个概å¿?ä¸Šé¢æˆ‘们æåˆ°˜q‡Entry¾c»é‡Œé¢æœ‰ä¸€ä¸ªnext属æ€?作用是指å‘下一个Entry。打个比æ–? ½W¬ä¸€ä¸ªé”®å€¼å¯¹A˜q›æ¥,通过计算其keyçš„hash得到的index=0åQŒè®°å?Entry[0] = A.一ä¼?x¨¬)åŽåˆè¿›æ¥ä¸€ä¸ªé”®å€¼å¯¹B,通过计算其index也ç‰äº?,现在怎么办?HashMapä¼?x¨¬)è¿™æ ·å?B.next = A,Entry[0] = B,如果åˆè¿›æ¥C,index也ç‰äº?,那么C.next = B,Entry[0] = CåQ›è¿™æ ähˆ‘们å‘现index=0的地方其实å˜å–了(ji¨£n)A,B,C三个键值对,他们通过next˜q™ä¸ªå±žæ€§é“¾æŽ¥åœ¨ä¸€èµ—÷€‚所以疑问ä¸ç”¨æ‹…å¿?j¨©)ã€?/p>
åˆ°è¿™é‡ŒäØ“(f¨´)æ¢ï¼ŒHashMap的大致实玎ͼŒæˆ‘ä»¬åº”è¯¥å·²ç»æ¸…楚äº?ji¨£n)ã€?/p>
当然HashMap里é¢ä¹ŸåŒ…å«ä¸€äº›ä¼˜åŒ–æ–¹é¢çš„实现åQŒè¿™é‡Œä¹Ÿå•°å—¦ä¸€ä¸‹ã€?/p>
比如åQšEntry[]的长度一定åŽåQŒéšç€mapé‡Œé¢æ•°æ®çš„è¶Šæ¥è¶Šé•¿ï¼Œ˜q™æ ·åŒä¸€ä¸ªindex的链ž®×ƒ¼š(x¨¬)很长åQŒä¼š(x¨¬)ä¸ä¼š(x¨¬)影哿€§èƒ½åQ?/p>
HashMap里é¢è®„¡½®ä¸€ä¸ªå› ç´ ï¼ˆä¹Ÿç§°ä¸ºå› å)(j¨ª)åQŒéšç€mapçš„size‘Šæ¥‘Šå¤§åQŒEntry[]ä¼?x¨¬)ä»¥ä¸€å®šçš„è§„åˆ™åŠ é•¿é•¿åº¦ã€?/p>
解决hash冲çªçš„办æ³?/p>
1åQ‰å¼€æ”‘Ö®šå€æ³•(¾U¿æ€§æŽ¢‹¹‹å†æ•£åˆ—åQŒäºŒ‹Æ¡æŽ¢‹¹‹å†æ•£åˆ—åQŒä¼ªéšæœºæŽ¢æµ‹å†æ•£åˆ—)(j¨ª)
2åQ‰å†å“ˆå¸Œæ³?/p>
3åQ‰é“¾åœ°å€æ³?/p>
4åQ‰å¾ç«‹ä¸€ 公共溢出åŒ?/p>
java ä¸h(hu¨¢n)ashmap的解军_Šžæ³•å°±æ˜¯é‡‡ç”¨çš„é“‘Öœ°å€æ³?br />è½¬è²æ–‡ç«