java如何实现快速排序?将ThreadLocal变量设置为private static的好处是啥

时间:2018-03-13 21:24:03   浏览:次   点击:次   作者:   来源:   立即下载

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[①⓪②④];}

收起

相关推荐

相关应用

平均评分 0人
  • 5星
  • 4星
  • 3星
  • 2星
  • 1星
用户评分:
发表评论

评论

  • 暂无评论信息