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 Collections 原始碼分析Java原始碼
- Java 常用工具類 Collections 原始碼分析Java原始碼
- php陣列中二分查詢是什麼PHP陣列
- java原始碼分析 Arrays.asList()與Collections.unmodifiableList()Java原始碼
- Java安全之Commons Collections5分析Java
- Java安全之Commons Collections2分析Java
- Java安全之Commons Collections7分析Java
- Java安全之Commons Collections3分析JavaS3
- 第 16 課 PostgreSQL查詢過程原始碼分析SQL原始碼
- Java安全之Commons Collections1分析(二)Java
- Java安全之Commons Collections1分析(三)Java
- 【集合框架】JDK1.8原始碼分析之Collections && Arrays(十)框架JDK原始碼
- Commons Collections1分析
- Commons Collections2分析
- 使用SQL查詢Java程式碼分析的開源專案:JQLSQLJava
- 事件分發原始碼分析事件原始碼
- Ysoserial Commons Collections7分析
- Ysoserial Commons Collections2分析
- Ysoserial Commons Collections3分析S3
- 查詢——二分查詢
- Java原始碼分析:Guava之不可變集合ImmutableMap的原始碼分析Java原始碼Guava
- 資料庫分庫分表中介軟體 Sharding-JDBC 原始碼分析 —— SQL 解析(三)之查詢SQL解析資料庫JDBC原始碼SQL
- Mybatis封裝分頁查詢的java公用類MyBatis封裝Java
- java 原始碼分析 —BooleanJava原始碼Boolean
- Java 原始碼如何分析?Java原始碼
- Java:HashMap原始碼分析JavaHashMap原始碼
- java 分庫關聯查詢工具類Java
- 【Java】陣列二分查詢元素Java陣列
- 菜鳥學Java(十)——分頁查詢Java
- 查詢論文原始碼網站原始碼網站
- druid查詢原始碼追蹤UI原始碼
- 二分查詢(一)——純粹的二分查詢
- 二分查詢常見套路與分析
- java collectionsJava
- ElasticSearch - 分頁查詢方式二 【scroll】滾動查詢(kibana、Java示例)ElasticsearchJava
- Java中關於二分查詢的問題Java
- java實現的二分法查詢Java
- MySQL的分頁查詢MySql