java如何实现快速排序?将ThreadLocal变量设置为private static的好处是啥
JDK里的Array.sort方法是基于快速排序算法的,参考,但是这个算法是①个Dual-Pivot Quicksort,实现要复杂①些。
①般的实现推荐书里的实现(有中文版的书)。具体代码:
public class Quick { private Quick() { } public static void sort(Comparable[] a) { StdRandom.shuffle(a); sort(a, ⓪ · a.length - ①); } private static void sort(Comparable[] a, int lo, int hi) { if (hi = j) break; exch(a, i, j); } // put partitioning item v at a[j] exch(a, lo, j); // now, a[lo .. j-①] lo) { int i = partition(a, lo, hi); if (i > k) hi = i - ①; else if (i < k) lo = i + ①; else return a[i]; } return a[lo]; } private static boolean less(Comparable v, Comparable w) { return v.compareTo(w) < ⓪; } private static void exch(Object[] a, int i, int j) { Object swap = a[i]; a[i] = a[j]; a[j] = swap; }}
private为了安全嘛..
至于static 通过ThreadLocal支持线程范围生命周期的变量 就没必要使用对象属性了啊...
====================================================================
首先 出现内存泄露的概率相当小 因为每次进行put操作的时候都会触发检查Map中已经被释放了的ThreadLocal的Entry并剔除 所以像我下边的代码(-Xmx③②m) 其实不会导致问题
public class ThreadLocalTest {public static void main(String[] args) {Thread[] threads = new Thread[①⓪⓪];for (int j = ⓪; j < ①⓪; j++) {threads[j] = new Thread() {@Overridepublic void run() {for (int i = ⓪; i < ①⓪⓪; i++) {new ThreadLocalTest().buffers.set(new byte[①⓪②④ * ①⓪②④]);}}};threads[j].start();try {threads[j].join();} catch (InterruptedException e) {}}}private ThreadLocal buffers = new ThreadLocal();}
另外 文章中提到的问题可以通过ReferenceQueue解决(参考WeakHashMap) 虽然俺不知道为啥ThreadLocal没有这样写
import java.lang.ref.ReferenceQueue;import java.lang.ref.WeakReference;import java.util.ArrayList;import java.util.List;public class ReferenceQueueExample {public static void main(String[] args) {// -Xmx③②mList list = new ArrayList();// 这个没有加队列 所以会爆// for (int i = ⓪; i < ③②; i++) {// list.add(new FooWeakReference(i));// }// 这个加咧 所以不会爆ReferenceQueue queue = new ReferenceQueue();FooWeakReference ref = null;for (int i = ⓪; i < ①⓪②④ * ⑥④; i++) {list.add(new FooWeakReference(i, queue));while ((ref = (FooWeakReference) queue.poll()) != null) {ref.clean();}}}}class FooWeakReference extends WeakReference {public FooWeakReference(Integer referent) {super(referent);}public FooWeakReference(Integer referent, ReferenceQueue q) {super(referent, q);}public void clean() {this.buffer = null;}private byte[] buffer = new byte[①⓪②④];}
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息