我回老家,我能干啥?
|
至此,我想大家已经明白,红黑树其实就是对概念模型2-3树(或者2-3-4树)的一种实现。 算法导论中给出的是红黑树基于2-3-4树实现,其中4节点要求平衡(即4节点必须用黑色父亲和左右两个红色儿子表示,红色儿子不能出现在同一边)。 算法4中给出的红黑树是基于2-3树实现,而且这种实现的红黑树十分特殊,它要求概念模型中的3节点在红黑树中必须用左倾的红色节点来表示。这种限定能够很大的减少红黑树调整过程中的复杂性,我们将在接下来的内容中体会到这一点。 我将算法导论和算法4中的红黑树反复的看了几遍,最终选择算法4中的红黑树做演示主体。
考虑到部分读者有充足的精力研究以2-3-4树为概念模型的红黑树,在介绍2-3树的同时也会带上2-3-4树的基础知识,帮助学有余力的读者去理解算法导论中的红黑树。(所以如果没有必要,只看2-3树的部分就行)。 我们在了解红黑树的插入删除操作之前,需要先了解2-3树的插入删除操作,这样才能理解红黑树中染色和旋转背后的意义。
让我们来看一下对于2-3树的插入。我们的插入操作需要遵循一个原则:先将这个元素尝试性地放在已经存在的节点中,如果要存放的节点是2节点,那么插入后会变成3节点,如果要存放的节点是3节点,那么插入后会变成4节点(临时)。然后,我们对可能生成的临时4节点进行分裂处理,使得临时4节点消失。 什么是反射 一般情况下,需要一个功能的前提是遇到了什么问题,先列举一些问题,再通过反射是如何解决这些问题。普通开发人员工作中最常遇到的问题是,需要生成代理对象。解决方法是:将需要加强的类,利用反射加载之后,与补充的逻辑进行融合,产生一个新的对象,这个对象就是代理对象,即具备原有的类以及新的逻辑的增强后的类。比如Man类里有个 eat 方法,我们希望执行eat方法之前和之后都需要执行洗手,洗碗,而又不能修改eat方法,这个时候就需要使用代理对象,在执行eat之前和之后执行这些操作。 应用场景 开发通用框架,反射最重要的用途就是开发各种通用框架,很多框架比如Spring,都是配置化的,为了保证框架的通用性,它们可能需要根据配置文件加载不同的对象和类,调用不同的方法,这个时候就需要使用反射,在运行时动态的加载需要的对象。动态代理,在切面编程中,需要拦截特定的方法,通常会使用动态代理,动态代理需要使用反射技术来实现。注解:注解也是使用了反射机制,根据注解的标记来调用注解解释器,执行行为,如果没有反射机制,注解就会失效。可扩展功能,应用程序可以通过使用完全限定名称创建可扩展的对象实例。 反射和代理涉及的术语 真实对象:就是原始类实例化后产生的对象,未经过代理模式加强后的对象。代理对象:利用代理模式增强后的对象。动态代理类:代理对象逻辑处理器,即,增强的逻辑所处的位置,需要传入真实对象产生关联的动态代理对象。invocationHandler 接口:动态代理类需要实现这个接口,并且重写 invoke方法,增强的逻辑在 invoke 方法里,每个代理类的实例都关联到了一个 Handler,当我们调用代理对象的时候,会转发到invocationHandler接口的invoke方法进行调用。Proxy:代理类,用于动态代理对象传入之后,产生代理对象。 反射与代理关系
代理模式的主要作用产生代理对象从而实现增强后的方法,反射作为Java提供的特性,是实现代理模式的基础,即,利用反射技术获取和操作Java程序里的类,从而对这些类进行包装盒加工,产生代理对象。获取代理对象:第一步:调用 Proxy.newProxyInstance 获得一个动态代理对象,其接收三个参数,上个参数分别是 (编辑:南昌站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


