`
文章列表
     好久没写文章,小结ConcurrentLinkedQueue做个临时记录,它虽然强大但也有它的问题,网上介绍集合中cas操作的文章很多,这里只写一下个人理解 (1)size方法很慢(与ConcurrentHashMap相似) (2)remove方法很慢(与大部分Queue相似) (3)如果remove最后一个节点中的元素,remove后节点不会删除 (4)同理当新增完一个元素之后马上删除,这个节点依然存在,所以要尽量避免这种情况的出现: offer(a)、remove(a) ;offer(b)、remove(b) (5)使用迭代器中的删除方法也不会移除节点 (6)迭代器的遍 ...
    一个IO操作其实分成了两个步骤:发起IO请求和实际的IO操作,同步IO和异步IO的区别就在于第二个步骤是否阻塞,如果实际的IO读写阻塞请求进程,那么就是同步IO,因此阻塞IO、非阻塞IO、IO服用、信号驱动IO都是同步IO,如果不阻塞,而是操作系统帮你做完IO操作再将结果返回给你,那么就是异步IO。阻塞IO和非阻塞IO的区别在于第一步,发起IO请求是否会被阻塞,如果阻塞直到完成那么就是传统的阻塞IO,如果不阻塞,那么就是非阻塞IO。
     由于工作太忙,已经很久没写下什么东西了,记录比记忆重要,把一些小知识记下来,顺便与大家交流和分享下(持续更新)。 1)List的复制 //方法(a) public <T extends Object> List<T> copyArrayList(List<T> list){ List<T& ...
    一件事情你很努力很认真地去完成了99%,剩下1%没做好,就相当于整件事都没做好。甚至可能在别人眼里你根本没去做这件事!有时候可以去埋怨下自己的运气不好。。但归根到底都是自己没有去做好这1%。      这个本来就是不公平的世界,从来没有绝对公平的待遇,特别是在某些情况下,你还不能去争取这一份本来可以争取的“公平”。      每个人都会喜欢事业上、工作上一帆风顺,但是逆境更能磨练一个人的性能与情商,要沉得住气,学会克服各种困难,才能成为真正的强者
         关于排序的算法,大约分为两大类:顺序排序与对数排序。          顺序排序一般使用一对嵌套的循环结构(多为两个for循环),因此排序n个元素需要大约n的2次方的比较。比较常用的顺序排序有(1)选择排序法 (2)插入排序法 (3)冒泡排序法          对数排序一般需要大约n*log2n(2为底数)次比较。这两种排序,当n越大的时候,他们性能上的差别就越大。快速排序与归并排序都属于对数排序,同样是使用递归。 1)选择排序法 public class Sort { // 选择排序 public static void selectionSort(Co ...
         经过思考后,发现上一篇介绍的用反射改造访问者模式中,抽象访问者与具体访问者之间的继承关系有不妥的地方。 1)抽象访问者与具体访问者的之间的继承并没有必然的关系 2)用抽象类代替接口并不是一种好办法,毕竟Java不支持多重继承 3)ReflectionVisitor更像是一个具体类,《Java与模式》里面说“只有在分类学的角度上有意义时,才使用继承,不要从工具类继承” 被访问者没有变化 尝试用组合组合/聚合的方式去代替继承。 具体元素的接口与实现类没有变化,依然是依赖ReflectionVisitor public interface Person { ...
    这一篇讲述一下如何用反射改造访问者模式,使之在增加具体元素的时候也符合“开放-封闭”原则(OCP)。为了理解的连贯性继续采用之前的男人-女人的例子。 这是既定访问者的类图: 在(二)在介绍过,既定访问者模式 ...
       众所周知单例模式有有饿汉式与懒汉式两种。当一个单例类的初始化开销很大,而希望当用户实际上需要的时候才去创建单例类,就会考虑使用懒汉式延迟初始化,来提高程序的启动速度。但懒汉式并不容易使用。 在 ...
         学过Java的人对SSH都不会陌生,其中Spring备受青昧除了它的"轻"之外,还因为他的IOC与AOP两大功能的强大。IOC是Spring的核心概念,全称“Inversion Of Control”,翻译成中文是“控制反转”,很多人都把它叫做“依赖注入(Dependency Injection)”。而它的抽象概念是“依赖关系的转移”。转移是相对于过去不良的应用程序设计来说的,象“高层模块不应该依赖于低层模块,而模块必须都依赖于抽象”是IOC的一种表现,“实现必须依赖于抽象,而不是抽象依赖于实现”是IOC的另一种表现。           举一个例子,控制层 ...
              关于模板方法的定义:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 模板方法的类图比较简单,这里就不画出来了。有需要的可以上网Google一下。我们直接看例子。 现在需求要实现学生A与学生B做同一份试卷。 大量Ctrl C+Ctrl V //学生A的试卷 public class TestPaperA { public void testQuestion1(){ System.out.println("杨过得到,后来给了郭靖,炼成了倚天剑、屠龙刀的玄铁可能是[]& ...
       这一篇讲述如何让访问者模式(Visitor)变得更加灵活。但并非结合反射(Reflection)去解决问题,而是采用另外一种的思维方式去改造访问者模式,相对于反射,我更偏向于这种。至于用反射改造访问者模式将会在下一篇讨论。          用回上一篇文章的例子,男人女人。假设现在需求要扩展数据结构,增加一种具体元素,男与女之外的一种不明物体,我们暂时把它称为“怪兽”,在既有访问者模式的架构下,应该怎样?首先增加一个Bruce类,实现Person接口。最麻烦的是要修改访问者接口及其所有具体访问者! 既定访问者模式的类图:         因为Visit方法中没有包含访问 ...
     做了标题党=。=这一篇并没有介绍关于访问者模式的进阶,先说一下访问者模式的使用情况,这里引用大话设计模式的例子,因为讲得比较精辟。 假设有男人和女人两种元素,要分别打印出他们在不同状态时的不同表现。 用OO的思想把表现(行为)提取出来作为一个抽象方法,代码如下: 用if-else对状态进行判断 Person接口 public interface Person { public void action(String state); } Man实现类 public class Man implements Person{ public void acti ...
冒泡算法大家都见得多啦,笔试也经常出,但更多的题目可能会加多一些限制条件。下面举2个例子,这方面做得少的朋友可以以此打开一下思维,其实原理都是一样的。如果有其他的例子或者更好的做法,希望可以提出来,和大家一起分享下:) 题目1:从小到大排列下面一堆数字,3,1,6,2,9,0,2,3,9,3,9 ..并且打印他们重复的次数(先不要急着看答案,自己想一下,能想出更好的做法^_^) 参考代码如下: import java.util.*; public class Test2 { public static void main(String[] args) { int ...
题目如下:用1,2,2,3,4,5这6个数字,用Java写一个main函数,打印出所有不同的排列,如:123254,522134等,要求:“3”与“5”不能相邻,“4”不能排在第3位。(看完题目先不要急着看答案,自己尝试做一下,或者你的做法更好^_^) 解题方案是把相邻问题抽象成一个2维数组,用0与1组成,如[0,1]或者[1,0]就表示0与1相邻的时候,如下图: 0 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 0 解释:0表示不能相邻,1表示可以相邻(当然你掉转也可以) [1,1],[2,2]... ...
        看设计模式总会有一种着迷的感觉,用小林同学的话,“实在太精彩了!”于是又想写下一些东西和大家分享:)         书看过几本,第一本是看小林同学推荐的大话设计模式,用C#写的,印象也最深刻,一开始看设计模式我觉得这本是很合适的。所谓设计模式其实就是对一种经常发生的问题提出的一种解决方案,而且这种方案经常无数人的测试,使用,在经过千锤百炼之后4人组的设计模式几乎是无懈可击。然而,当你把一些模式看完又看,Google后结合实际再深思熟虑,又会发现有些模式其实还可以做得更灵活或者更细腻。我们要相信:设计模式能让我们的编程世界变得更加美好,而我们同样有能力让设计模式变得更加美好。只要 ...
Global site tag (gtag.js) - Google Analytics