Javaéå常è§é¢è¯é¢æ»ç»
è¿æ¯ä¸åæè®¸å¯¹ä½ æå¸®å©çä¿¡æ¯
- é¢è¯æåï¼è¿æ¯ä¸ä»½å¤§å½¬ç²¾å¿æ´çç大åé¢è¯æåææ°çï¼ç®åå·²ç»æ´æ°è¿ä»£äº19ä¸ªçæ¬ï¼è´¨éå¾é«ï¼ä¸ä¸ºé¢è¯æé ï¼
- ç¥è¯æçï¼ä¸å±é¢è¯æå/ä¸å¯¹ä¸äº¤æµ/ç®åä¿®æ¹/è¶ æ£çå¦ä¹ æ°å´/å¦ä¹ 路线è§åï¼æ¬¢è¿å å ¥å¤§å½¬çç¥è¯æçï¼ç¹å»é¾æ¥æ¥çæçç详ç»ä»ç»ï¼
常è§çéåæåªäºï¼
Javaéå类主è¦ç±ä¸¤ä¸ªæ¥å£CollectionåMapæ´¾çåºæ¥çï¼Collectionæä¸ä¸ªåæ¥å£ï¼ListãSetãQueueã
Javaéåæ¡æ¶å¾å¦ä¸ï¼


Listä»£è¡¨äºæåºå¯éå¤éåï¼å¯ç´æ¥æ ¹æ®å ç´ çç´¢å¼æ¥è®¿é®ï¼Set代表æ åºä¸å¯éå¤éåï¼åªè½æ ¹æ®å ç´ æ¬èº«æ¥è®¿é®ï¼Queueæ¯éåéåãMapä»£è¡¨çæ¯åå¨key-value对çéåï¼å¯æ ¹æ®å ç´ çkeyæ¥è®¿é®valueã
éåä½ç³»ä¸å¸¸ç¨çå®ç°ç±»æArrayListãLinkedListãHashSetãTreeSetãHashMapãTreeMapçå®ç°ç±»ã
List ãSetåMap çåºå«
- List ä»¥ç´¢å¼æ¥ååå ç´ ï¼æåºçï¼å ç´ æ¯å 许éå¤çï¼å¯ä»¥æå ¥å¤ä¸ªnullï¼
- Set ä¸è½åæ¾éå¤å ç´ ï¼æ åºçï¼åªå 许ä¸ä¸ªnullï¼
- Map ä¿åé®å¼å¯¹æ å°ï¼
- List åºå±å®ç°ææ°ç»ãé¾è¡¨ä¸¤ç§æ¹å¼ï¼SetãMap 容卿åºäºåå¸åå¨åçº¢é»æ ä¸¤ç§æ¹å¼å®ç°ï¼
- Set åºäº Map å®ç°ï¼Set éçå ç´ å¼å°±æ¯ Mapçé®å¼ã
ArrayList äºè§£åï¼
ArrayList çåºå±æ¯å¨ææ°ç»ï¼å®ç容éè½å¨æå¢é¿ã卿·»å 大éå
ç´ åï¼åºç¨å¯ä»¥ä½¿ç¨ensureCapacityæä½å¢å ArrayList å®ä¾ç容éãArrayList ç»§æ¿äº AbstractList ï¼å¹¶å®ç°äº List æ¥å£ã
ArrayList çæ©å®¹æºå¶ï¼
ArrayListæ©å®¹çæ¬è´¨å°±æ¯è®¡ç®åºæ°çæ©å®¹æ°ç»çsizeåå®ä¾åï¼å¹¶å°åææ°ç»å 容å¤å¶å°æ°æ°ç»ä¸å»ãé»è®¤æ åµä¸ï¼æ°ç容é伿¯å容éç1.5åã以JDK1.8为ä¾è¯´æ:
public boolean add(E e) {
//夿æ¯å¦å¯ä»¥å®¹çº³eï¼è¥è½ï¼åç´æ¥æ·»å 卿«å°¾ï¼è¥ä¸è½ï¼åè¿è¡æ©å®¹ï¼ç¶ååæeæ·»å 卿«å°¾
ensureCapacityInternal(size + 1); // Increments modCount!!
//å°eæ·»å å°æ°ç»æ«å°¾
elementData[size++] = e;
return true;
}
// æ¯æ¬¡å¨add()ä¸ä¸ªå
ç´ æ¶ï¼arraylisté½éè¦å¯¹è¿ä¸ªlistç容éè¿è¡ä¸ä¸ªå¤æãéè¿ensureCapacityInternal()æ¹æ³ç¡®ä¿å½åArrayListç»´æ¤çæ°ç»å
·æå卿°å
ç´ çè½åï¼ç»è¿å¤çä¹åå°å
ç´ åå¨å¨æ°ç»elementDataçå°¾é¨
private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
private static int calculateCapacity(Object[] elementData, int minCapacity) {
//å¦æä¼ å
¥çæ¯ä¸ªç©ºæ°ç»åæå°å®¹éåé»è®¤å®¹éä¸minCapacityä¹é´çæå¤§å¼
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
return Math.max(DEFAULT_CAPACITY, minCapacity);
}
return minCapacity;
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// è¥ArrayListå·²æçåå¨è½å满足æä½åå¨è¦æ±ï¼åè¿åaddç´æ¥æ·»å å
ç´ ï¼å¦ææä½è¦æ±çåå¨è½å>ArrayListå·²æçåå¨è½åï¼è¿å°±è¡¨ç¤ºArrayListçåå¨è½åä¸è¶³ï¼å æ¤éè¦è°ç¨ grow();æ¹æ³è¿è¡æ©å®¹
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
private void grow(int minCapacity) {
// è·åelementDataæ°ç»çå
å空é´é¿åº¦
int oldCapacity = elementData.length;
// æ©å®¹è³åæ¥ç1.5å
int newCapacity = oldCapacity + (oldCapacity >> 1);
//æ ¡éªå®¹éæ¯å¦å¤
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
//è¥é¢è®¾å¼å¤§äºé»è®¤çæå¤§å¼ï¼æ£æ¥æ¯å¦æº¢åº
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// è°ç¨Arrays.copyOfæ¹æ³å°elementDataæ°ç»æåæ°çå
å空é´
//å¹¶å°elementDataçæ°æ®å¤å¶å°æ°çå
å空é´
elementData = Arrays.copyOf(elementData, newCapacity);
}
æä¹å¨éå ArrayList æ¶ç§»é¤ä¸ä¸ªå ç´ ï¼
foreachå é¤ä¼å¯¼è´å¿«é失败é®é¢ï¼å¯ä»¥ä½¿ç¨è¿ä»£å¨ç remove() æ¹æ³ã
Iterator itr = list.iterator();
while(itr.hasNext()) {
if(itr.next().equals("jay") {
itr.remove();
}
}
Arraylist å Vector çåºå«
- ArrayListå¨å åä¸å¤æ¶æ©å®¹ä¸ºåæ¥ç1.5åï¼Vectoræ¯æ©å®¹ä¸ºåæ¥ç2åã
- Vectorå±äºçº¿ç¨å®å ¨çº§å«çï¼ä½æ¯å¤§å¤æ°æ åµä¸ä¸ä½¿ç¨Vectorï¼å 为æä½Vectoræçæ¯è¾ä½ã
Arraylist ä¸ LinkedListçåºå«
- ArrayListåºäºå¨ææ°ç»å®ç°ï¼LinkedListåºäºé¾è¡¨å®ç°ã
- 对äºéæºindex访é®çgetåsetæ¹æ³ï¼ArrayListçé度è¦ä¼äºLinkedListãå 为ArrayListç´æ¥éè¿æ°ç»ä¸æ ç´æ¥æ¾å°å ç´ ï¼LinkedListè¦ç§»å¨æééåæ¯ä¸ªå ç´ ç´å°æ¾å°ä¸ºæ¢ã
- æ°å¢åå é¤å ç´ ï¼LinkedListçé度è¦ä¼äºArrayListãå 为ArrayList卿°å¢åå é¤å ç´ æ¶ï¼å¯è½æ©å®¹åå¤å¶æ°ç»ï¼LinkedListå®ä¾å对象éè¦æ¶é´å¤ï¼åªéè¦ä¿®æ¹æéå³å¯ã
HashMap
HashMap ä½¿ç¨æ°ç»+é¾è¡¨+çº¢é»æ ï¼JDK1.8å¢å äºçº¢é»æ é¨åï¼å®ç°çï¼ é¾è¡¨é¿åº¦å¤§äº8ï¼TREEIFY_THRESHOLDï¼æ¶ï¼ä¼æé¾è¡¨è½¬æ¢ä¸ºçº¢é»æ ï¼çº¢é»æ èç¹ä¸ªæ°å°äº6ï¼UNTREEIFY_THRESHOLDï¼æ¶æè½¬å为é¾è¡¨ï¼é²æ¢é¢ç¹ç转åã
è§£å³hashå²çªçåæ³æåªäºï¼HashMapç¨çåªç§ï¼
è§£å³Hashå²çªæ¹æ³æï¼å¼æ¾å®åæ³ãåå叿³ãé¾å°åæ³ãHashMapä¸éç¨çæ¯ é¾å°åæ³ ã
- 弿¾å®åæ³åºæ¬ææ³å°±æ¯ï¼å¦æ
p=H(key)åºç°å²çªæ¶ï¼å以p为åºç¡ï¼å次hashï¼p1=H(p),妿p1忬¡åºç°å²çªï¼å以p1为åºç¡ï¼ä»¥æ¤ç±»æ¨ï¼ç´å°æ¾å°ä¸ä¸ªä¸å²çªçåå¸å°åpiã å æ¤å¼æ¾å®åæ³æéè¦çhash表çé¿åº¦è¦å¤§äºçäºæéè¦åæ¾çå ç´ ï¼èä¸å 为åå¨å次hashï¼æä»¥åªè½å¨å é¤çèç¹ä¸åæ è®°ï¼èä¸è½çæ£å é¤èç¹ã - åå叿³æä¾å¤ä¸ªä¸åçhash彿°ï¼å½
R1=H1(key1)åçå²çªæ¶ï¼å计ç®R2=H2(key1)ï¼ç´å°æ²¡æå²çªä¸ºæ¢ã è¿æ ·åè½ç¶ä¸æäº§çå éï¼ä½å¢å äºè®¡ç®çæ¶é´ã - é¾å°åæ³å°åå¸å¼ç¸åçå ç´ ææä¸ä¸ªåä¹è¯çåé¾è¡¨,å¹¶å°åé¾è¡¨ç头æéåæ¾å¨åå¸è¡¨ç第i个åå ä¸ï¼æ¥æ¾ãæå ¥åå é¤ä¸»è¦å¨åä¹è¯é¾è¡¨ä¸è¿è¡ãé¾è¡¨æ³éç¨äºç»å¸¸è¿è¡æå ¥åå é¤çæ åµã
使ç¨çhashç®æ³ï¼
Hashç®æ³ï¼åkeyçhashCodeå¼ãé«ä½è¿ç®ã忍¡è¿ç®ã
h=key.hashCode() //ç¬¬ä¸æ¥ åhashCodeå¼
h^(h>>>16) //ç¬¬äºæ¥ é«ä½åä¸è¿ç®ï¼åå°å²çª
return h&(length-1); //ç¬¬ä¸æ¥ 忍¡è¿ç®
å¨JDK1.8çå®ç°ä¸ï¼ä¼åäºé«ä½è¿ç®çç®æ³ï¼éè¿hashCode()çé«16ä½å¼æä½16ä½å®ç°çï¼è¿ä¹åå¯ä»¥å¨æ°ç»æ¯è¾å°çæ¶åï¼ä¹è½ä¿è¯èèå°é«ä½ä½é½åä¸å°Hashç计ç®ä¸ï¼å¯ä»¥åå°å²çªï¼åæ¶ä¸ä¼æå¤ªå¤§çå¼éã
为ä»ä¹å»ºè®®è®¾ç½®HashMapç容éï¼
HashMapææ©å®¹æºå¶ï¼å°±æ¯å½è¾¾å°æ©å®¹æ¡ä»¶æ¶ä¼è¿è¡æ©å®¹ãæ©å®¹æ¡ä»¶å°±æ¯å½HashMapä¸çå ç´ ä¸ªæ°è¶ è¿ä¸´ç弿¶å°±ä¼èªå¨æ©å®¹ï¼threshold = loadFactor * capacityï¼ã
妿æä»¬æ²¡æè®¾ç½®åå§å®¹é大å°ï¼éçå ç´ ç䏿å¢å ï¼HashMapä¼åç夿¬¡æ©å®¹ãèHashMapæ¯æ¬¡æ©å®¹é½éè¦é建hash表ï¼é叏影忧è½ãæä»¥å»ºè®®å¼åè å¨å建HashMapçæ¶åæå®åå§å容éã
HashMapæ©å®¹è¿ç¨æ¯ææ ·çï¼
1.8æ©å®¹æºå¶ï¼å½å
ç´ ä¸ªæ°å¤§äºthresholdæ¶ï¼ä¼è¿è¡æ©å®¹ï¼ä½¿ç¨2å容éçæ°ç»ä»£æ¿åææ°ç»ãéç¨å°¾æå
¥çæ¹å¼å°åæ°ç»å
ç´ æ·è´å°æ°æ°ç»ã1.8æ©å®¹ä¹åé¾è¡¨å
ç´ ç¸å¯¹ä½ç½®æ²¡æååï¼è1.7æ©å®¹ä¹åé¾è¡¨å
ç´ ä¼åç½®ã
1.7é¾è¡¨æ°èç¹éç¨çæ¯å¤´ææ³ï¼è¿æ ·å¨çº¿ç¨ä¸æ©å®¹è¿ç§»å ç´ æ¶ï¼ä¼å°å ç´ é¡ºåºæ¹åï¼å¯¼è´ä¸¤ä¸ªçº¿ç¨ä¸åºç°å ç´ çç¸äºæåèå½¢æå¾ªç¯é¾è¡¨ï¼1.8éç¨äºå°¾ææ³ï¼é¿å äºè¿ç§æ åµçåçã
åæ°ç»çå
ç´ å¨éæ°è®¡ç®hashä¹åï¼å 为æ°ç»å®¹énå为2åï¼é£ä¹n-1çmaskèå´å¨é«ä½å¤1bitãå¨å
ç´ æ·è´è¿ç¨ä¸éè¦éæ°è®¡ç®å
ç´ å¨æ°ç»ä¸çä½ç½®ï¼åªéè¦çç忥çhash弿°å¢çé£ä¸ªbitæ¯1è¿æ¯0ï¼æ¯0çè¯ç´¢å¼æ²¡åï¼æ¯1çè¯ç´¢å¼åæâåç´¢å¼+oldCapâï¼æ ¹æ®e.hash & oldCap == 0å¤æï¼ ãè¿æ ·å¯ä»¥çå»éæ°è®¡ç®hashå¼çæ¶é´ï¼èä¸ç±äºæ°å¢ç1bitæ¯0è¿æ¯1å¯ä»¥è®¤ä¸ºæ¯éæºçï¼å æ¤resizeçè¿ç¨ä¼ååçæä¹åçå²çªçèç¹åæ£å°æ°çbucketã
说说HashMapputæ¹æ³çæµç¨ï¼
- 妿table没æåå§åå°±å è¿è¡åå§åè¿ç¨
- 使ç¨hashç®æ³è®¡ç®keyçç´¢å¼
- å¤æç´¢å¼å¤ææ²¡æåå¨å ç´ ï¼æ²¡æå°±ç´æ¥æå ¥
- å¦æç´¢å¼å¤åå¨å ç´ ï¼åéåæå ¥ï¼æä¸¤ç§æ åµï¼ä¸ç§æ¯é¾è¡¨å½¢å¼å°±ç´æ¥éåå°å°¾ç«¯æå ¥ï¼ä¸ç§æ¯çº¢é»æ å°±æç §çº¢é»æ ç»ææå ¥
- é¾è¡¨çæ°é大äºéå¼8ï¼å°±è¦è½¬æ¢æçº¢é»æ çç»æ
- æ·»å æåå伿£æ¥æ¯å¦éè¦æ©å®¹

çº¢é»æ çç¹ç¹ï¼
- æ¯ä¸ªèç¹æè æ¯é»è²ï¼æè æ¯çº¢è²ã
- æ ¹èç¹åå¶åèç¹ï¼
NILï¼æ¯é»è²çã - 妿ä¸ä¸ªèç¹æ¯çº¢è²çï¼åå®çåèç¹å¿ é¡»æ¯é»è²çã
- ä»ä¸ä¸ªèç¹å°è¯¥èç¹çååèç¹çææè·¯å¾ä¸å å«ç¸åæ°ç®çé»èç¹ã
å¨è§£å³ hash å²çªçæ¶åï¼ä¸ºä»ä¹éæ©å ç¨é¾è¡¨ï¼åè½¬çº¢é»æ ?
å ä¸ºçº¢é»æ éè¦è¿è¡å·¦æï¼å³æï¼åè²è¿äºæä½æ¥ä¿æå¹³è¡¡ï¼èåé¾è¡¨ä¸éè¦ãæä»¥ï¼å½å
ç´ ä¸ªæ°å°äº8ä¸ªçæ¶åï¼éç¨é¾è¡¨ç»æå¯ä»¥ä¿è¯æ¥è¯¢æ§è½ãèå½å
ç´ ä¸ªæ°å¤§äº8ä¸ªçæ¶å并䏿°ç»å®¹é大äºçäº64ï¼ä¼éç¨çº¢é»æ ç»æãå ä¸ºçº¢é»æ æç´¢æ¶é´å¤æåº¦æ¯ O(logn)ï¼èé¾è¡¨æ¯ O(n)ï¼å¨næ¯è¾å¤§çæ¶åï¼ä½¿ç¨çº¢é»æ å¯ä»¥å å¿«æ¥è¯¢é度ã
HashMap çé¿åº¦ä¸ºä»ä¹æ¯ 2 ç广¬¡æ¹ï¼
Hash å¼çèå´å¼æ¯è¾å¤§ï¼ä½¿ç¨ä¹åéè¦å
对æ°ç»çé¿åº¦å模è¿ç®ï¼å¾å°ç使°ææ¯å
ç´ åæ¾çä½ç½®ä¹å°±æ¯å¯¹åºçæ°ç»ä¸æ ãè¿ä¸ªæ°ç»ä¸æ çè®¡ç®æ¹æ³æ¯(n - 1) & hashãå°HashMapçé¿åº¦å®ä¸º2 ç广¬¡æ¹ï¼è¿æ ·å°±å¯ä»¥ä½¿ç¨(n - 1)&hashä½è¿ç®ä»£æ¿%åä½çæä½ï¼æé«æ§è½ã
HashMapé»è®¤å è½½å 忝å¤å°ï¼ä¸ºä»ä¹æ¯ 0.75ï¼
å çä¸HashMapçé»è®¤æé 彿°ï¼
int threshold; // 容纳é®å¼å¯¹çæå¤§å¼
final float loadFactor; // è´è½½å å
int modCount;
int size;
Node[] tableçåå§åé¿åº¦length为16ï¼é»è®¤çloadFactoræ¯0.75ï¼0.75æ¯å¯¹ç©ºé´åæ¶é´æççä¸ä¸ªå¹³è¡¡éæ©ï¼æ ¹æ®æ³æ¾åå¸ï¼loadFactor å0.75碰ææå°ãä¸è¬ä¸ä¼ä¿®æ¹ï¼é¤é卿¶é´åç©ºé´æ¯è¾ç¹æ®çæ åµä¸ ï¼
妿å å空é´å¾å¤èå对æ¶é´æçè¦æ±å¾é«ï¼å¯ä»¥éä½è´è½½å åLoad factorçå¼ ã
妿å å空é´ç´§å¼ è对æ¶é´æçè¦æ±ä¸é«ï¼å¯ä»¥å¢å è´è½½å åloadFactorçå¼ï¼è¿ä¸ªå¼å¯ä»¥å¤§äº1ã
ä¸è¬ç¨ä»ä¹ä½ä¸ºHashMapçkey?
ä¸è¬ç¨IntegerãStringè¿ç§ä¸å¯åç±»å½ HashMap å½ keyãStringç±»æ¯è¾å¸¸ç¨ã
- å 为 String æ¯ä¸å¯åçï¼æä»¥å¨å®åå»ºçæ¶å`hashcode``就被ç¼åäºï¼ä¸éè¦éæ°è®¡ç®ãè¿å°±æ¯ HashMap ä¸çkeyç»å¸¸ä½¿ç¨å符串çåå ã
- è·åå¯¹è±¡çæ¶åè¦ç¨å°
equals()åhashCode()æ¹æ³ï¼èIntegerãStringè¿äºç±»é½å·²ç»éåäºhashCode()以åequals()æ¹æ³ï¼ä¸éè¦èªå·±å»éåè¿ä¸¤ä¸ªæ¹æ³ã
HashMap为ä»ä¹çº¿ç¨ä¸å®å ¨ï¼
- å¤çº¿ç¨ä¸æ©å®¹æ»å¾ªç¯ãJDK1.7ä¸ç HashMap 使ç¨å¤´ææ³æå ¥å ç´ ï¼å¨å¤çº¿ç¨çç¯å¢ä¸ï¼æ©å®¹çæ¶åæå¯è½å¯¼è´ç¯å½¢é¾è¡¨çåºç°ï¼å½¢ææ»å¾ªç¯ã
- å¨JDK1.8ä¸ï¼å¨å¤çº¿ç¨ç¯å¢ä¸ï¼ä¼åçæ°æ®è¦ççæ åµã
HashMapåHashTableçåºå«ï¼
HashMapåHashtableé½å®ç°äºMapæ¥å£ã
- HashMapå¯ä»¥æ¥å为nullçkeyåvalueï¼key为nullçé®å¼å¯¹æ¾å¨ä¸æ 为0ç头ç»ç¹çé¾è¡¨ä¸ï¼èHashtableåä¸è¡ã
- HashMapæ¯é线ç¨å®å ¨çï¼HashTableæ¯çº¿ç¨å®å ¨çãJdk1.5æä¾äºConcurrentHashMapï¼å®æ¯HashTableçæ¿ä»£ã
- Hashtableå¾å¤æ¹æ³æ¯åæ¥æ¹æ³ï¼å¨å线ç¨ç¯å¢ä¸å®æ¯HashMapè¦æ ¢ã
- åå¸å¼ç使ç¨ä¸åï¼HashTableç´æ¥ä½¿ç¨å¯¹è±¡çhashCodeãèHashMapéæ°è®¡ç®hashå¼ã
LinkedHashMapåºå±åçï¼
HashMapæ¯æ åºçï¼è¿ä»£HashMapæå¾å°å ç´ ç顺åºå¹¶ä¸æ¯å®ä»¬æåæ¾å°HashMapç顺åºï¼å³ä¸è½ä¿æå®ä»¬çæå ¥é¡ºåºã
LinkedHashMapç»§æ¿äºHashMapï¼æ¯HashMapåLinkedListçèåä½ï¼å ·å¤ä¸¤è çç¹æ§ãæ¯æ¬¡putæä½é½ä¼å°entryæå ¥å°ååé¾è¡¨çå°¾é¨ã
讲ä¸ä¸TreeMapï¼
TreeMapæ¯ä¸ä¸ªè½æ¯è¾å ç´ å¤§å°çMapéåï¼ä¼å¯¹ä¼ å ¥çkeyè¿è¡äºå¤§å°æåºãå¯ä»¥ä½¿ç¨å ç´ çèªç¶é¡ºåºï¼ä¹å¯ä»¥ä½¿ç¨éåä¸èªå®ä¹çæ¯è¾å¨æ¥è¿è¡æåºã
public class TreeMap<K,V>
extends AbstractMap<K,V>
implements NavigableMap<K,V>, Cloneable, java.io.Serializable {
}
TreeMap çç»§æ¿ç»æï¼

TreeMapçç¹ç¹ï¼
- TreeMapæ¯æåºçkey-valueéåï¼éè¿çº¢é»æ å®ç°ãæ ¹æ®é®çèªç¶é¡ºåºè¿è¡æåºææ ¹æ®æä¾çComparatorè¿è¡æåºã
- TreeMapç»§æ¿äºAbstractMapï¼å®ç°äºNavigableMapæ¥å£ï¼æ¯æä¸ç³»åçå¯¼èªæ¹æ³ï¼ç»å®å ·ä½æç´¢ç®æ ï¼å¯ä»¥è¿åææ¥è¿çå¹é 项ãå¦floorEntry()ãceilingEntry()åå«è¿åå°äºçäºã大äºçäºç»å®é®å ³èçMap.Entry()对象ï¼ä¸åå¨åè¿ånullãlowerKey()ãfloorKeyãceilingKeyãhigherKey()åªè¿åå ³èçkeyã
HashSetåºå±åçï¼
HashSet åºäº HashMap å®ç°ãæ¾å ¥HashSetä¸çå ç´ å®é ä¸ç±HashMapçkeyæ¥ä¿åï¼èHashMapçvalueååå¨äºä¸ä¸ªéæçObject对象ã
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable {
static final long serialVersionUID = -5024744406713321676L;
private transient HashMap<E,Object> map; //åºäºHashMapå®ç°
//...
}
HashSetãLinkedHashSet å TreeSet çåºå«ï¼
HashSet æ¯ Set æ¥å£ç主è¦å®ç°ç±» ï¼HashSet çåºå±æ¯ HashMapï¼çº¿ç¨ä¸å®å
¨çï¼å¯ä»¥åå¨ null å¼ï¼
LinkedHashSet æ¯ HashSet çåç±»ï¼è½å¤æç
§æ·»å ç顺åºéåï¼
TreeSet åºå±ä½¿ç¨çº¢é»æ ï¼è½å¤æç
§æ·»å å
ç´ ç顺åºè¿è¡éåï¼æåºçæ¹å¼å¯ä»¥èªå®ä¹ã
ä»ä¹æ¯fail fastï¼
fast-failæ¯Javaéåçä¸ç§é误æºå¶ãå½å¤ä¸ªçº¿ç¨å¯¹åä¸ä¸ªéåè¿è¡æä½æ¶ï¼å°±æå¯è½ä¼äº§çfast-failäºä»¶ãä¾å¦ï¼å½çº¿ç¨aæ£éè¿iteratoréåéåæ¶ï¼å¦ä¸ä¸ªçº¿ç¨bä¿®æ¹äºéåçå å®¹ï¼æ¤æ¶modCountï¼è®°å½éåæä½è¿ç¨çä¿®æ¹æ¬¡æ°ï¼ä¼å 1ï¼ä¸çäºexpectedModCountï¼é£ä¹çº¿ç¨a访é®éåçæ¶åï¼å°±ä¼æåºConcurrentModificationExceptionï¼äº§çfast-failäºä»¶ãè¾¹éå边修æ¹éåä¹ä¼äº§çfast-failäºä»¶ã
è§£å³æ¹æ³ï¼
- 使ç¨Colletions.synchronizedListæ¹æ³æå¨ä¿®æ¹éåå 容çå°æ¹å ä¸synchronizedãè¿æ ·çè¯ï¼å¢å éåå 容ç忥éä¼é»å¡éåæä½ï¼å½±åæ§è½ã
- 使ç¨CopyOnWriteArrayListæ¥æ¿æ¢ArrayListãå¨å¯¹CopyOnWriteArrayListè¿è¡ä¿®æ¹æä½çæ¶åï¼ä¼æ·è´ä¸ä¸ªæ°çæ°ç»ï¼å¯¹æ°çæ°ç»è¿è¡æä½ï¼æä½å®æååæå¼ç¨ç§»å°æ°çæ°ç»ã
ä»ä¹æ¯fail safeï¼
éç¨å®å ¨å¤±è´¥æºå¶çéå容å¨ï¼å¨é忶䏿¯ç´æ¥å¨éåå 容ä¸è®¿é®çï¼èæ¯å å¤å¶åæéåå 容ï¼å¨æ·è´çéåä¸è¿è¡éåãjava.util.concurrentå ä¸ç容å¨é½æ¯å®å ¨å¤±è´¥ï¼å¯ä»¥å¨å¤çº¿ç¨ä¸å¹¶å使ç¨ï¼å¹¶åä¿®æ¹ã
åçï¼ç±äºè¿ä»£æ¶æ¯å¯¹åéåçæ·è´è¿è¡éåï¼æä»¥å¨éåè¿ç¨ä¸å¯¹åéåæä½çä¿®æ¹å¹¶ä¸è½è¢«è¿ä»£å¨æ£æµå°ï¼æä»¥ä¸ä¼è§¦åConcurrent Modification Exceptionã
缺ç¹ï¼åºäºæ·è´å 容çä¼ç¹æ¯é¿å äºConcurrent Modification Exceptionï¼ä½åæ ·å°ï¼è¿ä»£å¨å¹¶ä¸è½è®¿é®å°ä¿®æ¹åçå 容ï¼å³ï¼è¿ä»£å¨éåçæ¯å¼å§éåé£ä¸å»æ¿å°çéåæ·è´ï¼å¨éåæé´åéååççä¿®æ¹è¿ä»£å¨æ¯ä¸ç¥éçã
讲ä¸ä¸ArrayDequeï¼
ArrayDequeå®ç°äºå端éåï¼å é¨ä½¿ç¨å¾ªç¯æ°ç»å®ç°ï¼é»è®¤å¤§å°ä¸º16ãå®çç¹ç¹æï¼
å¨ä¸¤ç«¯æ·»å ãå é¤å ç´ çæçè¾é«
æ ¹æ®å ç´ å å®¹æ¥æ¾åå é¤çæçæ¯è¾ä½ã
没æç´¢å¼ä½ç½®çæ¦å¿µï¼ä¸è½æ ¹æ®ç´¢å¼ä½ç½®è¿è¡æä½ã
ArrayDequeåLinkedListé½å®ç°äºDequeæ¥å£ï¼å¦æåªéè¦ä»ä¸¤ç«¯è¿è¡æä½ï¼ArrayDequeæçæ´é«ä¸äºã妿忶éè¦æ ¹æ®ç´¢å¼ä½ç½®è¿è¡æä½ï¼æè ç»å¸¸éè¦å¨ä¸é´è¿è¡æå ¥åå é¤ï¼LinkedListæç¸åºç apiï¼å¦add(int index, E e)ï¼ï¼ååºè¯¥éLinkedListã
ArrayDequeåLinkedList齿¯çº¿ç¨ä¸å®å ¨çï¼å¯ä»¥ä½¿ç¨Collectionså·¥å ·ç±»ä¸synchronizedXxx()è½¬æ¢æçº¿ç¨åæ¥ã
åªäºéåç±»æ¯çº¿ç¨å®å ¨çï¼åªäºä¸å®å ¨ï¼
线æ§å®å ¨çéåç±»ï¼
- Vectorï¼æ¯ArrayListå¤äºåæ¥æºå¶ã
- Hashtableã
- ConcurrentHashMapï¼æ¯ä¸ç§é«æå¹¶ä¸çº¿ç¨å®å ¨çéåã
- Stackï¼æ ï¼ä¹æ¯çº¿ç¨å®å ¨çï¼ç»§æ¿äºVectorã
线æ§ä¸å®å ¨çéåç±»ï¼
- Hashmap
- Arraylist
- LinkedList
- HashSet
- TreeSet
- TreeMap
è¿ä»£å¨ Iterator æ¯ä»ä¹ï¼
Iterator模å¼ç¨åä¸ç§é»è¾æ¥éåéåãå®å¯ä»¥æè®¿é®é»è¾ä»ä¸åç±»åçéåç±»ä¸æ½è±¡åºæ¥ï¼ä¸éè¦äºè§£éåå é¨å®ç°ä¾¿å¯ä»¥éåéåå ç´ ï¼ç»ä¸ä½¿ç¨ Iterator æä¾çæ¥å£å»éåãå®çç¹ç¹æ¯æ´å å®å ¨ï¼å 为å®å¯ä»¥ä¿è¯ï¼å¨å½åéåçéåå ç´ è¢«æ´æ¹çæ¶åï¼å°±ä¼æåº ConcurrentModificationException å¼å¸¸ã
public interface Collection<E> extends Iterable<E> {
Iterator<E> iterator();
}
ä¸»è¦æä¸ä¸ªæ¹æ³ï¼hasNext()ãnext()åremove()ã
Iterator å ListIterator æä»ä¹åºå«ï¼
ListIterator æ¯ Iteratorçå¢å¼ºçã
- ListIteratoréåå¯ä»¥æ¯éåçï¼å 为æprevious()åhasPrevious()æ¹æ³ï¼èIteratorä¸å¯ä»¥ã
- ListIteratoræadd()æ¹æ³ï¼å¯ä»¥åListæ·»å 对象ï¼èIteratorå´ä¸è½ã
- ListIteratorå¯ä»¥å®ä½å½åçç´¢å¼ä½ç½®ï¼å 为ænextIndex()åpreviousIndex()æ¹æ³ï¼èIteratorä¸å¯ä»¥ã
- ListIteratorå¯ä»¥å®ç°å¯¹è±¡çä¿®æ¹ï¼set()æ¹æ³å¯ä»¥å®ç°ãIieratorä» è½éåï¼ä¸è½ä¿®æ¹ã
- ListIteratoråªè½ç¨äºéåListåå ¶åç±»ï¼Iteratorå¯ç¨æ¥éåææéåã
å¦ä½è®©ä¸ä¸ªéåä¸è½è¢«ä¿®æ¹ï¼
å¯ä»¥éç¨Collectionså ä¸çunmodifiableMap/unmodifiableList/unmodifiableSetæ¹æ³ï¼éè¿è¿ä¸ªæ¹æ³è¿åçéåï¼æ¯ä¸å¯ä»¥ä¿®æ¹çãå¦æä¿®æ¹çè¯ï¼ä¼æåº java.lang.UnsupportedOperationExceptionå¼å¸¸ã
List<String> list = new ArrayList<>();
list.add("x");
Collection<String> clist = Collections.unmodifiableCollection(list);
clist.add("y"); // è¿è¡æ¶æ¤è¡æ¥é
System.out.println(list. size());
对äºList/Set/Mapéåï¼Collectionså 齿ç¸åºçæ¯æã
é£ä½¿ç¨finalå ³é®åè¿è¡ä¿®é¥°å¯ä»¥å®ç°åï¼
çæ¡æ¯ä¸å¯ä»¥ã
finalå ³é®å修饰çæååéå¦ææ¯æ¯å¼ç¨ç±»åçè¯ï¼å表示è¿ä¸ªå¼ç¨çå°å弿¯ä¸è½æ¹åçï¼ä½æ¯è¿ä¸ªå¼ç¨ææåç对象éé¢çå å®¹è¿æ¯å¯ä»¥æ¹åçã
èéåç±»é½æ¯å¼ç¨ç±»åï¼ç¨final修饰çè¯ï¼éåéé¢çå å®¹è¿æ¯å¯ä»¥ä¿®æ¹çã
å¹¶å容å¨
JDK æä¾çè¿äºå®¹å¨å¤§é¨åå¨ java.util.concurrent å
ä¸ã
- ConcurrentHashMap: 线ç¨å®å ¨ç HashMap
- CopyOnWriteArrayList: 线ç¨å®å ¨ç Listï¼å¨è¯»å¤åå°çåºåæ§è½é常好ï¼è¿è¿å¥½äº Vector.
- ConcurrentLinkedQueue: 髿çå¹¶åéåï¼ä½¿ç¨é¾è¡¨å®ç°ãå¯ä»¥çåä¸ä¸ªçº¿ç¨å®å ¨ç LinkedListï¼è¿æ¯ä¸ä¸ªéé»å¡éåã
- BlockingQueue: é»å¡é忥å£ï¼JDK å é¨éè¿é¾è¡¨ãæ°ç»çæ¹å¼å®ç°äºè¿ä¸ªæ¥å£ãé常éåç¨äºä½ä¸ºæ°æ®å ±äº«çééã
- ConcurrentSkipListMap: 跳表çå®ç°ã使ç¨è·³è¡¨çæ°æ®ç»æè¿è¡å¿«éæ¥æ¾ã
ConcurrentHashMap
å¤çº¿ç¨ç¯å¢ä¸ï¼ä½¿ç¨Hashmapè¿è¡putæä½ä¼å¼èµ·æ»å¾ªç¯ï¼åºè¯¥ä½¿ç¨æ¯æå¤çº¿ç¨ç ConcurrentHashMapã
JDK1.8 ConcurrentHashMapåæ¶äºsegmentåæ®µéï¼èéç¨CASåsynchronizedæ¥ä¿è¯å¹¶åå®å ¨ãæ°æ®ç»æéç¨æ°ç»+é¾è¡¨/红é»äºåæ ãsynchronizedåªéå®å½åé¾è¡¨æçº¢é»äºåæ çé¦èç¹ï¼ç¸æ¯1.7éå®HashEntryæ°ç»ï¼éç²åº¦æ´å°ï¼æ¯ææ´é«çå¹¶åéãå½é¾è¡¨é¿åº¦è¿é¿æ¶ï¼Nodeä¼è½¬æ¢æTreeNodeï¼æé«æ¥æ¾é度ã
putæ§è¡æµç¨ï¼
å¨putçæ¶åéè¦éä½Segmentï¼ä¿è¯å¹¶åå®å ¨ãè°ç¨getçæ¶åä¸å éï¼å 为nodeæ°ç»æåvalåæénextæ¯ç¨volatile修饰çï¼æ´æ¹åçå¼ä¼ç«å»å·æ°å°ä¸»åä¸ï¼ä¿è¯äºå¯è§æ§ï¼nodeæ°ç»tableä¹ç¨volatile修饰ï¼ä¿è¯å¨è¿è¡è¿ç¨å¯¹å ¶ä»çº¿ç¨å ·æå¯è§æ§ã
transient volatile Node<K,V>[] table;
static class Node<K,V> implements Map.Entry<K,V> {
volatile V val;
volatile Node<K,V> next;
}
put æä½æµç¨ï¼
- 妿table没æåå§åå°±å è¿è¡åå§åè¿ç¨
- 使ç¨hashç®æ³è®¡ç®keyçä½ç½®
- 妿è¿ä¸ªä½ç½®ä¸ºç©ºåç´æ¥CASæå ¥ï¼å¦æä¸ä¸ºç©ºçè¯ï¼åååºè¿ä¸ªèç¹æ¥
- 妿ååºæ¥çèç¹çhash弿¯MOVED(-1)çè¯ï¼å表示å½åæ£å¨å¯¹è¿ä¸ªæ°ç»è¿è¡æ©å®¹ï¼å¤å¶å°æ°çæ°ç»ï¼åå½å线ç¨ä¹å»å¸®å©å¤å¶
- 妿è¿ä¸ªèç¹ï¼ä¸ä¸ºç©ºï¼ä¹ä¸å¨æ©å®¹ï¼åéè¿synchronizedæ¥å éï¼è¿è¡æ·»å æä½ï¼è¿éæä¸¤ç§æ åµï¼ä¸ç§æ¯é¾è¡¨å½¢å¼å°±ç´æ¥éåå°å°¾ç«¯æå ¥æè è¦çæç¸åçkeyï¼ä¸ç§æ¯çº¢é»æ å°±æç §çº¢é»æ ç»ææå ¥
- é¾è¡¨çæ°é大äºéå¼8ï¼å°±ä¼è½¬æ¢æçº¢é»æ çç»ææè è¿è¡æ©å®¹ï¼tableé¿åº¦å°äº64ï¼
- æ·»å æåå伿£æ¥æ¯å¦éè¦æ©å®¹
æä¹æ©å®¹ï¼
æ°ç»æ©å®¹transferæ¹æ³ä¸ä¼è®¾ç½®ä¸ä¸ªæ¥é¿ï¼è¡¨ç¤ºä¸ä¸ªçº¿ç¨å¤ççæ°ç»é¿åº¦ï¼æå°å¼æ¯16ãå¨ä¸ä¸ªæ¥é¿èå´å åªæä¸ä¸ªçº¿ç¨ä¼å¯¹å ¶è¿è¡å¤å¶ç§»å¨æä½ã
ConcurrentHashMap å Hashtable çåºå«ï¼
- Hashtableéè¿ä½¿ç¨synchronizedä¿®é¥°æ¹æ³çæ¹å¼æ¥å®ç°å¤çº¿ç¨åæ¥ï¼å æ¤ï¼Hashtableç忥ä¼é使´ä¸ªæ°ç»ãå¨é«å¹¶åçæ åµä¸ï¼æ§è½ä¼é常差ãConcurrentHashMapéç¨äºæ´ç»ç²åº¦ç鿥æé«å¨å¹¶åæ åµä¸çæçãæ³¨ï¼synchronized容å¨ï¼åæ¥å®¹å¨ï¼ä¹æ¯éè¿synchronizedå ³é®åæ¥å®ç°çº¿ç¨å®å ¨ï¼å¨ä½¿ç¨çæ¶åä¼å¯¹ææçæ°æ®å éã
- Hashtableé»è®¤ç大å°ä¸º11ï¼å½è¾¾å°éå¼åï¼æ¯æ¬¡æç §ä¸é¢çå ¬å¼å¯¹å®¹éè¿è¡æ©å ï¼newCapacity = oldCapacity * 2 + 1ãConcurrentHashMapé»è®¤å¤§å°æ¯16ï¼æ©å®¹æ¶å®¹éæ©å¤§ä¸ºåæ¥ç2åã
CopyOnWrite
Copy-On-Writeï¼åæ¶å¤å¶ã彿们å¾å®¹å¨æ·»å å
ç´ æ¶ï¼ä¸ç´æ¥å¾å®¹å¨æ·»å ï¼èæ¯å
å°å½å容å¨è¿è¡å¤å¶ï¼å¤å¶åºä¸ä¸ªæ°ç容å¨ï¼ç¶å徿°ç容卿·»å å
ç´ ï¼æ·»å å®å
ç´ ä¹åï¼åå°å容å¨çå¼ç¨æåæ°å®¹å¨ãè¿æ ·åç好å¤å°±æ¯å¯ä»¥å¯¹CopyOnWrite容å¨è¿è¡å¹¶åç读èä¸éè¦å éï¼å 为å½å容å¨ä¸ä¼è¢«ä¿®æ¹ã
public boolean add(E e) {
final ReentrantLock lock = this.lock;
lock.lock(); //addæ¹æ³éè¦å é
try {
Object[] elements = getArray();
int len = elements.length;
Object[] newElements = Arrays.copyOf(elements, len + 1); //å¤å¶æ°æ°ç»
newElements[len] = e;
setArray(newElements); //å容å¨çå¼ç¨æåæ°å®¹å¨
return true;
} finally {
lock.unlock();
}
}
ä»JDK1.5å¼å§Javaå¹¶åå
éæä¾äºä¸¤ä¸ªä½¿ç¨CopyOnWriteæºå¶å®ç°çå¹¶å容å¨ï¼å®ä»¬æ¯CopyOnWriteArrayListåCopyOnWriteArraySetã
缺ç¹ï¼
- å åå ç¨é®é¢ãç±äºCopyOnWriteçåæ¶å¤å¶æºå¶ï¼å¨è¿è¡åæä½çæ¶åï¼å åéä¼åæ¶é©»æä¸¤ä¸ªå¯¹è±¡çå åã
- CopyOnWrite容å¨ä¸è½ä¿è¯æ°æ®ç宿¶ä¸è´æ§ï¼å¯è½è¯»åå°æ§æ°æ®ã
CopyOnWriteArrayList
CopyOnWriteArrayListæ¯Javaå¹¶åå 䏿ä¾çä¸ä¸ªå¹¶å容å¨ãCopyOnWriteArrayListç¸å½äºçº¿ç¨å®å ¨çArrayListï¼CopyOnWriteArrayList使ç¨äºä¸ç§å«åæ¶å¤å¶çæ¹æ³ï¼å½ææ°å ç´ addå°CopyOnWriteArrayListæ¶ï¼å ä»åæçæ°ç»ä¸æ·è´ä¸ä»½åºæ¥ï¼ç¶å卿°çæ°ç»ååæä½ï¼åå®ä¹åï¼åå°åæ¥çæ°ç»å¼ç¨æåå°æ°æ°ç»ã
CopyOnWriteArrayListä¸addæ¹æ³æ·»å çæ¶åæ¯éè¦å éçï¼ä¿è¯åæ¥ï¼é¿å
äºå¤çº¿ç¨åçæ¶åå¤å¶åºå¤ä¸ªå¯æ¬ãè¯»çæ¶åä¸éè¦å éï¼å¦æè¯»çæ¶åæå
¶ä»çº¿ç¨æ£å¨åCopyOnWriteArrayListæ·»å æ°æ®ï¼è¿æ¯å¯ä»¥è¯»å°æ§çæ°æ®ã
CopyOnWriteå¹¶å容å¨ç¨äºè¯»å¤åå°çå¹¶ååºæ¯ã
ä¼ç¹ï¼
读æä½æ§è½å¾é«ï¼å 为æ éä»»ä½åæ¥æªæ½ï¼æ¯è¾éç¨äºè¯»å¤åå°çå¹¶ååºæ¯ãJavaçlistå¨éåæ¶ï¼è¥ä¸éæå«ç线ç¨å¯¹list容å¨è¿è¡ä¿®æ¹ï¼å伿åºConcurrentModificationExceptionå¼å¸¸ãèCopyOnWriteArrayListç±äºå ¶"读åå离"çææ³ï¼éååä¿®æ¹æä½åå«ä½ç¨å¨ä¸åçlist容å¨ï¼æä»¥å¨ä½¿ç¨è¿ä»£å¨è¿è¡éåæ¶åï¼ä¹å°±ä¸ä¼æåºConcurrentModificationExceptionå¼å¸¸äºã
缺ç¹ï¼
䏿¯å åå ç¨é®é¢ï¼æ¯ç«æ¯æ¬¡æ§è¡åæä½é½è¦å°å容卿·è´ä¸ä»½ï¼æ°æ®é大æ¶ï¼å¯¹å åååè¾å¤§ï¼å¯è½ä¼å¼èµ·é¢ç¹GCï¼
äºæ¯æ æ³ä¿è¯å®æ¶æ§ï¼Vector对äºè¯»åæä½åå é忥ï¼å¯ä»¥ä¿è¯è¯»ååç强ä¸è´æ§ãèCopyOnWriteArrayListç±äºå ¶å®ç°çç¥çåå ï¼åå读åå«ä½ç¨å¨æ°èä¸å容å¨ä¸ï¼å¨åæä½æ§è¡è¿ç¨ä¸ï¼è¯»ä¸ä¼é»å¡ä½è¯»åå°çå´æ¯è容å¨çæ°æ®ã
ConcurrentLinkedQueue
éé»å¡éåã髿çå¹¶åéåï¼ä½¿ç¨é¾è¡¨å®ç°ãå¯ä»¥çåä¸ä¸ªçº¿ç¨å®å
¨ç LinkedListï¼éè¿ CAS æä½å®ç°ã
妿坹éåå éçææ¬è¾é«åéåä½¿ç¨æ éç ConcurrentLinkedQueue æ¥æ¿ä»£ãéåå¨å¯¹æ§è½è¦æ±ç¸å¯¹è¾é«ï¼åæ¶æå¤ä¸ªçº¿ç¨å¯¹éåè¿è¡è¯»åçåºæ¯ã
éé»å¡éåä¸çå ç§ä¸»è¦æ¹æ³ï¼add(E e): å°å
ç´ eæå
¥å°é快尾ï¼å¦ææå
¥æåï¼åè¿åtrueï¼å¦ææå
¥å¤±è´¥ï¼å³éå已满ï¼ï¼å伿åºå¼å¸¸ï¼ remove()ï¼ç§»é¤éé¦å
ç´ ï¼è¥ç§»é¤æåï¼åè¿åtrueï¼å¦æç§»é¤å¤±è´¥ï¼éå为空ï¼ï¼å伿åºå¼å¸¸ï¼ offer(E e)ï¼å°å
ç´ eæå
¥å°é快尾ï¼å¦ææå
¥æåï¼åè¿åtrueï¼å¦ææå
¥å¤±è´¥ï¼å³éå已满ï¼ï¼åè¿åfalseï¼ poll()ï¼ç§»é¤å¹¶è·åéé¦å
ç´ ï¼è¥æåï¼åè¿åéé¦å
ç´ ï¼å¦åè¿ånullï¼ peek()ï¼è·åéé¦å
ç´ ï¼è¥æåï¼åè¿åéé¦å
ç´ ï¼å¦åè¿ånull
对äºéé»å¡éåï¼ä¸è¬æ åµä¸å»ºè®®ä½¿ç¨offerãpollåpeekä¸ä¸ªæ¹æ³ï¼ä¸å»ºè®®ä½¿ç¨addåremoveæ¹æ³ãå 为使ç¨offerãpollåpeekä¸ä¸ªæ¹æ³å¯ä»¥éè¿è¿åå¼å¤ææä½æåä¸å¦ï¼è使ç¨addåremoveæ¹æ³å´ä¸è½è¾¾å°è¿æ ·çææã
é»å¡éå
é»å¡é忝java.util.concurrentå
ä¸éè¦çæ°æ®ç»æï¼BlockingQueueæä¾äºçº¿ç¨å®å
¨çéåè®¿é®æ¹å¼ï¼å½é»å¡éåè¿è¡æå
¥æ°æ®æ¶ï¼å¦æéå已满ï¼çº¿ç¨å°ä¼é»å¡çå¾
ç´å°éåéæ»¡ï¼ä»é»å¡éååæ°æ®æ¶ï¼å¦æéå已空ï¼çº¿ç¨å°ä¼é»å¡çå¾
ç´å°éåé空ãå¹¶åå
ä¸å¾å¤é«çº§åæ¥ç±»çå®ç°é½æ¯åºäºBlockingQueueå®ç°çãBlockingQueue éåç¨äºä½ä¸ºæ°æ®å
±äº«çééã
使ç¨é»å¡ç®æ³çéåå¯ä»¥ç¨ä¸ä¸ªéï¼å ¥éååºéç¨å䏿éï¼æä¸¤ä¸ªéï¼å ¥éååºéç¨ä¸åçéï¼çæ¹å¼æ¥å®ç°ã
é»å¡éååä¸è¬çéåçåºå«å°±å¨äºï¼
- å¤çº¿ç¨æ¯æï¼å¤ä¸ªçº¿ç¨å¯ä»¥å®å ¨ç访é®éå
- é»å¡æä½ï¼å½éåä¸ºç©ºçæ¶åï¼æ¶è´¹çº¿ç¨ä¼é»å¡çå¾ éåä¸ä¸ºç©ºï¼å½éåæ»¡äºçæ¶åï¼ç产线ç¨å°±ä¼é»å¡ç´å°éå䏿»¡
æ¹æ³
| æ¹æ³\å¤çæ¹å¼ | æåºå¼å¸¸ | è¿åç¹æ®å¼ | ä¸ç´é»å¡ | è¶ æ¶éåº |
|---|---|---|---|---|
| æå ¥æ¹æ³ | add(e) | offer(e) | put(e) | offer(e,time,unit) |
| ç§»é¤æ¹æ³ | remove() | poll() | take() | poll(time,unit) |
| æ£æ¥æ¹æ³ | element() | peek() | ä¸å¯ç¨ | ä¸å¯ç¨ |
JDKæä¾çé»å¡éå
JDK 7 æä¾äº7个é»å¡éåï¼å¦ä¸
1ãArrayBlockingQueue
æçé»å¡éåï¼åºå±éç¨æ°ç»å®ç°ãArrayBlockingQueue 䏿¦å建ï¼å®¹éä¸è½æ¹åãå
¶å¹¶åæ§å¶éç¨å¯éå
¥éæ¥æ§å¶ï¼ä¸ç®¡æ¯æå
¥æä½è¿æ¯è¯»åæä½ï¼é½éè¦è·åå°éæè½è¿è¡æä½ãæ¤éåæç
§å
è¿å
åºï¼FIFOï¼çåå对å
ç´ è¿è¡æåºãé»è®¤æ
åµä¸ä¸è½ä¿è¯çº¿ç¨è®¿é®éåçå
¬å¹³æ§ï¼åæ°fairå¯ç¨äºè®¾ç½®çº¿ç¨æ¯å¦å
¬å¹³è®¿é®éåã为äºä¿è¯å
¬å¹³æ§ï¼é常ä¼éä½ååéã
private static ArrayBlockingQueue<Integer> blockingQueue = new ArrayBlockingQueue<Integer>(10,true);//fair
2ãLinkedBlockingQueue
LinkedBlockingQueueæ¯ä¸ä¸ªç¨ååé¾è¡¨å®ç°çæçé»å¡éåï¼å¯ä»¥å½åæ çéåä¹å¯ä»¥å½åæçéåæ¥ä½¿ç¨ãé常å¨å建 LinkedBlockingQueue 对象æ¶ï¼ä¼æå®éåæå¤§ç容éãæ¤éåçé»è®¤åæå¤§é¿åº¦ä¸ºInteger.MAX_VALUEãæ¤éåæç
§å
è¿å
åºçåå对å
ç´ è¿è¡æåºãä¸ ArrayBlockingQueue ç¸æ¯èµ·æ¥å
·ææ´é«çååéã
3ãPriorityBlockingQueue
æ¯æä¼å
çº§çæ çé»å¡éåãé»è®¤æ
åµä¸å
ç´ éåèªç¶é¡ºåºååºæåãä¹å¯ä»¥èªå®ä¹ç±»å®ç°compareTo()æ¹æ³æ¥æå®å
ç´ æåºè§åï¼æè
åå§åPriorityBlockingQueueæ¶ï¼æå®æé åæ°Comparatoræ¥è¿è¡æåºã
PriorityBlockingQueue åªè½æå®åå§çéå大å°ï¼å颿å
¥å
ç´ çæ¶åï¼å¦æç©ºé´ä¸å¤çè¯ä¼èªå¨æ©å®¹ã
PriorityQueue ç线ç¨å®å
¨çæ¬ãä¸å¯ä»¥æå
¥ null å¼ï¼åæ¶ï¼æå
¥éåç对象å¿
é¡»æ¯å¯æ¯è¾å¤§å°çï¼comparableï¼ï¼å¦åæ¥ ClassCastException å¼å¸¸ãå®çæå
¥æä½ put æ¹æ³ä¸ä¼ blockï¼å ä¸ºå®æ¯æ çéåï¼take æ¹æ³å¨éåä¸ºç©ºçæ¶åä¼é»å¡ï¼ã
4ãDelayQueue
æ¯æå»¶æ¶è·åå
ç´ çæ çé»å¡éåãéå使ç¨PriorityBlockingQueueæ¥å®ç°ãéåä¸çå
ç´ å¿
é¡»å®ç°Delayedæ¥å£ï¼å¨å建å
ç´ æ¶å¯ä»¥æå®å¤ä¹
æè½ä»éåä¸è·åå½åå
ç´ ãåªæå¨å»¶è¿ææ»¡æ¶æè½ä»éå䏿åå
ç´ ã
5ãSynchronousQueue
ä¸åå¨å ç´ çé»å¡éåï¼æ¯ä¸ä¸ªputå¿ é¡»çå¾ ä¸ä¸ªtakeæä½ï¼å¦åä¸è½ç»§ç»æ·»å å ç´ ãæ¯æå ¬å¹³è®¿é®éåã
SynchronousQueueå¯ä»¥çææ¯ä¸ä¸ªä¼ çæï¼è´è´£æç产è
线ç¨å¤ççæ°æ®ç´æ¥ä¼ éç»æ¶è´¹è
线ç¨ãéåæ¬èº«ä¸åå¨ä»»ä½å
ç´ ï¼é常éåä¼ éæ§åºæ¯ãSynchronousQueueçååéé«äºLinkedBlockingQueueåArrayBlockingQueueã
6ãLinkedTransferQueue
ç±é¾è¡¨ç»æç»æçæ çé»å¡TransferQueueéåãç¸å¯¹äºå
¶ä»é»å¡éåï¼å¤äºtryTransferåtransferæ¹æ³ã
transferæ¹æ³ï¼å¦æå½åææ¶è´¹è æ£å¨çå¾ æ¥æ¶å ç´ ï¼takeæè å¾ æ¶é´éå¶çpollæ¹æ³ï¼ï¼transferå¯ä»¥æç产è ä¼ å ¥çå ç´ ç«å»ä¼ ç»æ¶è´¹è ãå¦ææ²¡ææ¶è´¹è çå¾ æ¥æ¶å ç´ ï¼åå°å ç´ æ¾å¨éåçtailèç¹ï¼å¹¶çå°è¯¥å ç´ è¢«æ¶è´¹è æ¶è´¹äºæè¿åã
tryTransferæ¹æ³ï¼ç¨æ¥è¯æ¢ç产è ä¼ å ¥çå ç´ è½å¦ç´æ¥ä¼ ç»æ¶è´¹è ãå¦ææ²¡ææ¶è´¹è å¨çå¾ ï¼åè¿åfalseãåä¸è¿°æ¹æ³çåºå«æ¯è¯¥æ¹æ³æ 论æ¶è´¹è æ¯å¦æ¥æ¶ï¼æ¹æ³ç«å³è¿åãètransferæ¹æ³æ¯å¿ é¡»çå°æ¶è´¹è æ¶è´¹äºæè¿åã
åç
JDK使ç¨éç¥æ¨¡å¼å®ç°é»å¡éåãæè°éç¥æ¨¡å¼ï¼å°±æ¯å½ç产è 徿»¡çéåéæ·»å å ç´ æ¶ä¼é»å¡ç产è ï¼å½æ¶è´¹è æ¶è´¹äºä¸ä¸ªéåä¸çå ç´ åï¼ä¼éç¥ç产è å½åéåå¯ç¨ã
ArrayBlockingQueue使ç¨Conditionæ¥å®ç°ï¼
private final Condition notEmpty;
private final Condition notFull;
public ArrayBlockingQueue(int capacity, boolean fair) {
if (capacity <= 0)
throw new IllegalArgumentException();
this.items = new Object[capacity];
lock = new ReentrantLock(fair);
notEmpty = lock.newCondition();
notFull = lock.newCondition();
}
public E take() throws InterruptedException {
final ReentrantLock lock = this.lock;
lock.lockInterruptibly();
try {
while (count == 0) // éå为空æ¶ï¼é»å¡å½åæ¶è´¹è
notEmpty.await();
return dequeue();
} finally {
lock.unlock();
}
}
public void put(E e) throws InterruptedException {
checkNotNull(e);
final ReentrantLock lock = this.lock;
lock.lockInterruptibly();
try {
while (count == items.length)
notFull.await();
enqueue(e);
} finally {
lock.unlock();
}
}
private void enqueue(E x) {
final Object[] items = this.items;
items[putIndex] = x;
if (++putIndex == items.length)
putIndex = 0;
count++;
notEmpty.signal(); // éåä¸ä¸ºç©ºæ¶ï¼éç¥æ¶è´¹è
è·åå
ç´
}
åè龿¥
http://www.importnew.com/20386.html
https://www.cnblogs.com/yangming1996/p/7997468.html
https://coolshell.cn/articles/9606.htmï¼HashMap æ»å¾ªç¯ï¼
