摘要: 1.Runnable Runnable是个接口,使用很简单: 1. 实现该接口并重写run方法 2. 利用该类的对象创建线程 3. 线程启动时就会自动调用该对象的run方法 通常在开发中结合ExecutorService使用,将任务的提交与任务的执行解耦开,同时也能更好地利用Executor提供的各 阅读全文
posted @ 2017-06-06 13:38 龍清扬 阅读(357) 评论(0) 推荐(0) 编辑
摘要: 摘要: Eexecutor作为灵活且强大的异步执行框架,其支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程和执行过程解耦开发,基于生产者-消费者模式,其提交任务的线程相当于生产者,执行任务的线程相当于消费者,并用Runnable来表示任务,Executor的实现还提供了对生命周期 阅读全文
posted @ 2017-06-06 13:33 龍清扬 阅读(246) 评论(0) 推荐(0) 编辑
摘要: 摘要 Volatile是Java提供的一种弱同步机制,当一个变量被声明成volatile类型后编译器不会将该变量的操作与其他内存操作进行重排序。在某些场景下使用volatile代替锁可以减少代码量和使代码更易阅读。 Volatile特性 1.可见性:当一条线程对volatile变量进行了修改操作时, 阅读全文
posted @ 2017-06-06 13:25 龍清扬 阅读(354) 评论(0) 推荐(0) 编辑
摘要: 快速排序是冒泡排序的改进版,也是最好的一种内排序,在很多面试题中都会出现,也是作为程序员必须掌握的一种排序方法。 思想:1.在待排序的元素任取一个元素作为基准(通常选第一个元素,但最的选择方法是从待排序元素中随机选取一个作为基准),称为基准元素; 2.将待排序的元素进行分区,比基准元素大的元素放在它 阅读全文
posted @ 2017-06-06 11:25 龍清扬 阅读(324) 评论(0) 推荐(0) 编辑
摘要: 排序思路:通过折半查找的方式找到合适的插入位置再插入。 算法实现: 算法分析:不管元素的初始序列为正序还是反序,其时间复杂度都和直接插入排序的一样为O(n2)。不同的是折半插入排序中查找的平均比较次数为log2(i+1)-1, 所以就平均性能而言,折半插入排序优于直接插入排序。 同样,折半插排序的空 阅读全文
posted @ 2017-06-06 11:21 龍清扬 阅读(472) 评论(0) 推荐(0) 编辑
摘要: 排序思路:每次将一个待排序的元素与已排序的元素进行逐一比较,直到找到合适的位置按大小插入。 第一趟比较示图: 算法实现: 结果: 算法分析:1.当元素的初始序列为正序时,仅外循环要进行n-1趟排序且每一趟只进行一次比较,没有进入if语句不存在元素之间的交换(移动)。此时比较次数(Cmin)和移动次数 阅读全文
posted @ 2017-06-06 11:19 龍清扬 阅读(454) 评论(0) 推荐(0) 编辑
摘要: 排序思路:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环。算法实现: 算法分析:1.在选择排序中,无论元素的初始序列如何,都要进行 (n-1)+(n-2)+(n-3)+....+1 = n*(n-1)/2 = O(n2)次比较,所 阅读全文
posted @ 2017-06-06 11:14 龍清扬 阅读(511) 评论(0) 推荐(0) 编辑
摘要: 排序思路:整个算法从最下面的元素开始,对相邻的元素进行比较,经过交换使得较小的元素在较大的元素之上,经过对每个元素的两两比较,最后最小的元素被移到前面的位置。 算法实现: 算法改进:在某些情况下,可能在第i趟时元素就已经全部排好序了,此时我们就不必在再进行后面几趟的比较了。 如元素:1 2 3 4 阅读全文
posted @ 2017-06-06 11:10 龍清扬 阅读(245) 评论(0) 推荐(0) 编辑