数据结构与算法(三):树 和 二叉树
有些数据的逻辑关系并不是简单的线性关系,常常存在一对多,甚至多对多的情况。例如,一个家族的 “家谱”,企业的职级关系等、书本的目录章节等都可以用树型数据结构来描述。
树 和 图 是典型的非线性数据结构。本篇描述对 树 和 二叉树 的理解。
有些数据的逻辑关系并不是简单的线性关系,常常存在一对多,甚至多对多的情况。例如,一个家族的 “家谱”,企业的职级关系等、书本的目录章节等都可以用树型数据结构来描述。
树 和 图 是典型的非线性数据结构。本篇描述对 树 和 二叉树 的理解。
栈 和 队列 也是常见的数据结构。Java 里面的方法栈,消息队列 是 栈 和 队列 数据结构的实际应用。
数组、链表、栈和队列、散列表是基础数据结构,几乎所有的高级开发语言都会涉及到这些数据结构,一些更复杂的数据结构也是基于基础数据结构的扩展。
基础数据结构是数据存储的基础理论,有必要彻底理解它。
TCP/IP协议在客户端与服务器建立连接和断开连接时的一套消息确认机制,就是三次握手和四次挥手。
TCP/IP
的三次握手和四次挥手是《计算机网络》的基础知识。
基于静态代理和动态代理需要绑定接口的局限性,而对类的代理在某些场景下确实是需要的,所以某些大牛就创造了CGLIB
这个动态代理类库。
CGLIB
底层是基本ASM
字节码处理框架,该库允许在程运行时对字节码进行修改和动态生成新的类。
CGLIB
所创建的动态代理对象的性能比JDK
所创建的动态代理对象的性能高(大概10倍),但CGLIB
在创建代理对象时所花费的时间却比JDK
动态代理多(大概8倍)。
对于singleton
的代理对象或者具有实例池的代理,因无须频繁创建对象,比较适用CGLIB
动态代理技术;反之则适合采用JDK
动态代理技术。
JDK 1.3 版本后,Java提供了动态代理技术,允许应用在运行期创建接口的代理对象。
JDK 提供的代理只能针对接口做代理。也有更强大的代理库 cglib
,可以实现对类的代理。
JDK 的 java.lang.reflect
包下提供了一个Proxy
类和一个InvocationHandler
接口,Proxy
类利用InvocationHandler
动态创建一个符合某一接口的代理,生成(运行时)目标类的代理对象。
在普通编程过程中,无须使用动态代理,但在编写框架或底层基础代码时,动态代理的作用就非常大。
静态代理在使用时,需要定义接口
或者父类
,目标对象与代理对象一起实现相同的接口
或者是继承相同父类
。
代理对象通过调用代理对象的方法来调用目标对象的方法;可以在不修改目标对象的前提下,对目标对象的功能进行扩展。
学习软件设计模式,需要了解使用设计模式的目的,23种设计模式是对设计模式使用场景进行分类再抽象的方法论,遵循了基本的设计原则。
学习软件设计模式,还需要了解其设计的原则,需要了解软件的可维护性和可复用性。
另:设计是有限度的,不能无限地考虑未来的变更情况,否则会陷入设计的泥潭中难以自拔。
单例模式:自己创建自己的唯一实例,在内存中只有这一个对象,不允许其它类自由创建该类的对象,给所有其它类提供这唯一实例。
HTTP(HyperText Transfer Protocol):超文本传输协议,所有的WWW文件都必须遵守这个标准。现在常用的版本是HTTP 1.1。
HTTP是一个客户端请求和浏览器应签的标准(TCP),浏览器和服务器通信的数据格式,默认端口:80
;HTTPS默认端口:443。
学习http协议,实际上就是要学习http规定的求的数据的格式以及响应的数据的格式。浏览器与服务器一问一答的规则。