一.java面向对象的特征:
1、抽象:忽略一个主题中和当前目标无关的某些方面,以便充分注意与当前目标有关的方面。总共分为两方面:一:数据抽象,二:过程抽象。
数据抽象:即用代码的形式表示现实世界中一类事物的特性,就是针对对象的属性;具体表现为各种成员变量。
过程抽象:即对象所拥有的一系列动作,就是针对对象的行为特征;即成员方法。
2、继承:继承是联合类的一种层次模型,并且允许坏和鼓励类的重用,对象的新类可以从现有的类中诞生,这种过程被称为类的继承。新类继承了原始类的特征,新类被称为派生类,而原始类被称为基类;
3、封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面,面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象,封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构。同时保护了数据。
4、多态性:多态性是指允许不同类的对象对同一消息做出相应。多态性包括参数化多态性和包含多态性,多态性语言灵活,抽象行为共享、代码共享的优势。很好的解决了应用程序函数同名的问题,
二、算法比较
1、稳定性比较:插入排序、二叉树排序、二路归并排序及其他线性排序是排序稳定的,而选择排序
希尔排序、快速排序并不是稳定的。
2、时间复杂度比较:
![]()
三、数组和链表
数组是将元素在内存中连续存放,由于每个元素占据的内存大小相同,可以通过下标进行访问,每次如果想删除增加一个元素,必须移动大量元素,如果应用需要快速访问数据,很少或者不进行插入或者删除操作,就应该使用数组。
链表恰好相反,元素在内存中没必要连续存储,而是通过指针联系在一起的,所以增加删除很简单,但是查找的时候需要遍历整个链表,所以如果经常插入删除,可以使用链表。
1、从逻辑结构上讲:
数组必须事先定义固定的长度,不能够适应动态增减。当数据增加时,有可能会溢出,数据减少时,可能会浪费内存。
链表动态的进行内存分配,可以适应数据的动态增减,且可以方便的插入删除。
2、从内存存储角度:
数组从栈中分配空间,对程序员来说方便,但是自由度小。
链表从堆中分配空间,自由度大,但是申请管理麻烦。
四、TCP(Transmission Control Protocol) 三次握手和四次挥手
TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手建立连接。
位码即TCP标志位,有6种标示,SYN(synchronous建立联机) ACK(acknowledement 确认) PS(push 传送) FIN(finish 结束) RST(reset 重置) UGR(urgent 紧急)
Sequence number(顺序号码) Acknowledge number(确认号码)
1.三次握手
第一次握手:主机A 发送位码为SYN=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1得知,A请求连接。主机A进入SYN_SEND状态
第二次握手:主机B收到请求后要确认信息,向A发送ACK number=(主机的seq number)+1,SYN=1,ACK=1并随机产生一个seq number=7654321的包。主机B进入SYN_RECV 状态
第三次握手:主机A收到B传来的包时检查ACK number是否正确,及位码ACK是否为1,若正确,主机A会再次发送ACK number=(主机B的SYN number)+1,ACK=1。主机B确认seq和ack=1则连接成功。主机A和主机B进入ESTABLISHED 状态
2.四次挥手
第一次挥手:Client发送一个FIN用来关闭Client到Server的数据传输,Client进入FIN_WAIT_1状态
第二次挥手:Server收到FIN后,发送一个ACK到Client,确认序号为收到序号+1,(于SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
第三次挥手:Server发送一个人FIN,用来关闭Server到Client的数据传输,Server进图LAST_ACK状态
第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK到Server,确认序号为收到序号+1,Server进入close状态,完成4次挥手。
ps:为什么要四次挥手,这是因为服务器在LISTEN 状态下,收到连接请求的SYN报文后,把ACK和SYN放在一个报文里发送到客户端,而关闭连接时,当收到对方FIN报文是,仅仅表示对方不再发送数据了,但是还能接收数据,己方也未必全部数据都发送给对方,所以己方可以立即close,也可以发送一些数据给对方后,在发送FIN报文给对方表示同意现在关闭连接。
五、new和malloc的区别:
1、new/delete是操作符,malloc/free是函数。
2、new 不止是分配内存,而且会调用类的构造函数,同理delete会调用类的析构函数,而malloc则只分配内存,不会进行初始化类成员的工作,同样free 也不会调用析构函数
3、内存泄漏对于malloc或者new都可以检查出来的,区别在于new可以指明是那个文件的那一行,而malloc没有这些信息。