java的Collections中二分查詢原始碼分析
java的Collections類中二分查詢(binarySearch)的實現:
/**判斷List集合是否實現標記介面RandomAccess(ArrayList)或者List集合的長度是否小於5000,如果是滿足以上任何一個條件則採用for(int i = 0; i < size; i++) 來遍歷,
否則使用Iterator迭代器來遍歷。判斷原始碼*/
public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c) {
if (c==null)
return binarySearch((List) list, key);
if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)
return Collections.indexedBinarySearch(list, key, c);
else
return Collections.iteratorBinarySearch(list, key, c);
}
//使用for(int i = 0; i < size; i++)來遍歷二分查詢的原始碼
private static <T> int indexedBinarySearch(List<? extends T> l, T key, Comparator<? super T> c) {
int low = 0;
int high = l.size()-1;
while (low <= high) {
int mid = (low + high) >>> 1;
T midVal = l.get(mid);
int cmp = c.compare(midVal, key);
if (cmp < 0)
low = mid + 1;
else if (cmp > 0)
high = mid - 1;
else
return mid; // key found
}
return -(low + 1); // key not found
}
//使用for(Iterator it;it.hasNext()) it.next()的原始碼
private static <T> int iteratorBinarySearch(List<? extends T> l, T key, Comparator<? super T> c) {
int low = 0;
int high = l.size()-1;
ListIterator<? extends T> i = l.listIterator();
while (low <= high) {
int mid = (low + high) >>> 1;
T midVal = get(i, mid);
int cmp = c.compare(midVal, key);
if (cmp < 0)
low = mid + 1;
else if (cmp > 0)
high = mid - 1;
else
return mid; // key found
}
return -(low + 1); // key not found
}
private static <T> T get(ListIterator<? extends T> i, int index) {
T obj = null;
int pos = i.nextIndex();
if (pos <= index) {
do {
obj = i.next();
} while (pos++ < index);
} else {
do {
obj = i.previous();
} while (--pos > index);
}
return obj;
}
相關文章
- java原始碼分析 Arrays.asList()與Collections.unmodifiableList()Java原始碼
- php陣列中二分查詢是什麼PHP陣列
- Java安全之Commons Collections2分析Java
- Java安全之Commons Collections3分析JavaS3
- Java安全之Commons Collections5分析Java
- Java安全之Commons Collections7分析Java
- Java安全之Commons Collections1分析(二)Java
- Java安全之Commons Collections1分析(三)Java
- 第 16 課 PostgreSQL查詢過程原始碼分析SQL原始碼
- Commons Collections1分析
- Commons Collections2分析
- druid查詢原始碼追蹤UI原始碼
- Ysoserial Commons Collections3分析S3
- Ysoserial Commons Collections2分析
- Ysoserial Commons Collections7分析
- 查詢——二分查詢
- Java原始碼分析:Guava之不可變集合ImmutableMap的原始碼分析Java原始碼Guava
- ElasticSearch - 分頁查詢方式二 【scroll】滾動查詢(kibana、Java示例)ElasticsearchJava
- java 分庫關聯查詢工具類Java
- 【Java】陣列二分查詢元素Java陣列
- 查詢論文原始碼網站原始碼網站
- Java 原始碼如何分析?Java原始碼
- Java String原始碼分析Java原始碼
- 【Java】ServiceLoader原始碼分析Java原始碼
- java 原始碼分析 —BooleanJava原始碼Boolean
- Java:HashMap原始碼分析JavaHashMap原始碼
- 二分查詢(一)——純粹的二分查詢
- 二分查詢常見套路與分析
- Java中關於二分查詢的問題Java
- PostgreSQL 原始碼解讀(24)- 查詢語句#9(查詢重寫)SQL原始碼
- PostgreSQL 原始碼解讀(29)- 查詢語句#14(查詢優化-上拉子查詢)SQL原始碼優化
- MySQL的分頁查詢MySql
- Java容器原始碼學習--ArrayList原始碼分析Java原始碼
- BatteryStatsHelper.java原始碼分析BATJava原始碼
- PowerUsageSummary.java原始碼分析Java原始碼
- 【Java集合】ArrayList原始碼分析Java原始碼
- Java-- String原始碼分析Java原始碼
- JAVA集合:ArrayList原始碼分析Java原始碼
- PostgreSQL 原始碼解讀(179)- 查詢#96(語法分析:gram.y)#4SQL原始碼語法分析