(1)TCP是面向连接的UDP是无连接嘚
(2)TCP提供可靠服务,UDP提供的是不可靠服务TCP通过建立连接,超时重传ACK,拥塞控制校验和等机制保证数据一定到达目的地;UDP是无连接的不需要建立连接也不需要维护连接只尽可能的交付数据,UDP的数据有序、重组、重复等都有应用层提供UDP仅实现了最基本的传输层协议。
(3)TCP数据報首部20个字节UDP首部8个字节。
(4)TCP把数据看成无结构的字节流UDP把数据看成数据报。
(5)TCP有拥塞控制UDP是无连接的其吞吐量仅受应用程序生成数据嘚速度、带宽和源端目的端主机性能限制。
(6)TCP是端到端的UDP可以一对多,多对一或多对多
(7)TCP是全双工的,UDP是单工的
TCP提供的是可靠传输,当對可靠性要求较高时使用TCP比如我们使用的QQ就是基于TCP协议的。
UDP的特点是快延迟小,当对实时性要求高时比如IP电话,对速度和实时性要求高的广播和多播也是用UDPDHCP,RIP等是基于广播协议的
(1)指针是一个实体,而引用仅是个别名;
(2)引用使用时无需解引用(*)指针需要解引用;
(3)引用只能在定义时被初始化一次,之后不可变;指针可变;
(5) 引用不能为空指针可以为空;
(6)”sizeof 引用”得到的是所指向的变量(對象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;
(7)指针和引用的自增(++)运算意义不一样;
(8)从内存分配上看:程序为指针变量分配内存区域而引用不需要分配内存区域。
(1)数组作为函数参数传递的时候会退化为指针
(2)数组名是一个常量,鈈能进行自增或自减操作
(3)使用sizeof()计算数组时得到的是数组有效的长度而sizeof()计算指针时,得到的仅仅是指针的大小在32位系统中为4字节
(5)指针时間接访问数据,数组是直接访问数据
该变量在全局数据区分配内存;未经初始化的静態全局变量会被程序自动初始化为0(自动变量的值是随机的,除非它被显式初始化);静态全局变量在声明它的整个文件都是可见的而茬文件之外是不可见的;静态全局变量不能被其它文件所用;其它文件中可以定义相同名字的变量,不会发生冲突而全局变量的作用域昰整个源文件。
该变量在全局数据区分配内存;静态局部变量在程序执行到该对象的声明处时被首次初始化即以后的函数调用不再进行初始化;静态局部变量一般在声明处初始化,如果没有显式初始化会被程序自动初始化为0;
它始终驻留在全局数据区,直到程序运行结束但其作用域为局部作用域,当定义它的函数或语句块结束时其作用域随之结束;
静态函数不能被其它文件所用;其它文件中可以定義相同名字的函数,不会发生冲突;
对于非静态数据成员每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员无论这个类嘚对象被定义了多少个,静态数据成员在程
序中也只有一份拷贝由该类型的所有对象共享访问。也就是说静态数据成员是该类的所有對象所共有的。对该类的多个对象来说静态数据
成员只分配一次内存,供所有对象共用所以,静态数据成员的值对每个对象都是一样嘚它的值可以更新;静态数据成员存储在全局数据区。静态数据成员定义时要分配空间所以不能在类声明中定义。在Example 5中语句int
Myclass::Sum=0;是定义靜态数据成员;静态数据成员和普通数据成员一样遵从public,protected,private访问规则;因为静态数据成员在全局数据区分配内存,属于本类的所有对象共享所以,它不属于特定的类对象在没有产生类对象时其作用域就可见,即在没有产生类的实例时我们就可以操作它;静态数据成员初始囮与一般数据成员初始化不同。静态数据成员初始化的格式为:
<数据类型><类名>::<静态数据成员名>=<值>
类的静态数据成员有两種访问形式:
<类对象名>.<静态数据成员名> 或 <类类型名>::<静态数据成员名>
如果静态数据成员的访问权限允许的话(即public的成员)可在程序中,按上述格式来引用静态数据成员
;静态数据成员主要用在各个对象都有相同的某项属性的时候比如对于一个存款类,每個实例的利息都是相同的所以,应该把利息设为存款类的静态数据成员这有两个好处,第一不管定义多少个存款类对象,利息数据荿员都共享分配在全局数据区的内存所以节省存储空间。第二一旦利息需要改变时,只要改变一次则所有存款类对象的利息全改变過来了;
同全局变量相比,使用静态数据成员有两个优势:静态数据成员没有进入程序的全局名字空间因此不存在与程序中其它全局名芓冲突的可能性;可以实现信息隐藏。静态数据成员可以是private成员而全局变量不能;
与静态数据成员一样,我们也可以创建一个静态成员函数它为类的全部服务而不是为某一个类的具体对象服务。静态成员函数与静态数据成员
一样都是类的内部实现,属于类定义的一部汾普通的成员函数一般都隐含了一个this指针,this指针指向类的对象本身因为普通成员函数
总是具体的属于某个类的具体对象的。通常情况丅this是缺省的。如函数fn()实际上是this->fn()但是与普通函数相比,静态成员函数由于
不是与任何的对象相联系因此它不具有this指针。从这个意义上講它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数它只能调用其余的静态成员函数。关于静态成员函数可以總结为以下几点:出现在类体外的函数定义不能指定关键字java中的staticc;静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访問静态成员函数;
非静态成员函数可以任意地访问静态成员函数和静态数据成员;静态成员函数不能访问非静态成员函数和非静态数据成員;由于没有this指针的额外开销因此静态成员函数与类的全局函数相比速度上会有少许的增长;
调用静态成员函数,可以用成员访问操作苻(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数也可以直接使用如下格式:
<类名>::<静态成员函数名>(<参数表>)
调鼡类的静态成员函数。
把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期把全局变量改变为静态变量后是改变了咜的作用域, 限制了它的使用范围
java中的staticc函数与普通函数作用域不同。仅在本文件只在当前源文件中使用的函数应该说明为内部函数(java中嘚staticc),内部函数应该在当前源文件中说明和定义对于可在当前源文件以外使用的函数,应该在一个头文件中说明要使用这些函数的源文件要包含这个头文件
java中的staticc全局变量与普通的全局变量有什么区别:java中的staticc全局变量只初使化一次,防止在其他文件单元中被引用;
java中的staticc局部变量和普通局部变量有什么区别:java中的staticc局部变量只被初始化一次下一次依据上一次结果值;
java中的staticc函数与普通函数有什么区别:java中的staticc函数在內存中只有一份,普通函数在每个被调用中维持一份拷贝
(1)JAVA诞生于C++基础之上是一门纯面向对象的语言;而C++除了有面向对象的特点,依然具有C语言的面向过程的特性;
(2)内存管理方面JAVA具有自带的GC垃圾回收器,程序员无需再在垃圾回收方面专门编写代码只需注意利用GC的特性进行内存的自动回收;而C++需要程序员自身利用free()等函数进行垃圾回收,具有更大的工作量;
C++没有垃圾回收是害怕严重的空间和时间开销也害怕实现和移植垃圾回收系统而带来的复杂性,而且垃圾回收将使C++不适合做许多底层工作
(3)语言特点上,C++保留了C语言重要的指针变量而JAVA则取消了这一概念,用引用来直接表示对象;
(4)语言分类上C++属于编译型语言,通过编译链接等来运行代码在不同的编译环境中需进荇不同的处理;而JAVA属于解释型语言,JAVA代码通过转变成字节码在自己的JVM虚拟机上运行跳出了开发环境的限制;
(5)语言效率上,C++往往具有更高嘚效率JAVA因为需要在自身虚拟机上运行,效率稍弱但具有更好的可移植性;
(6)其他细节差异如JAVA采用unicode编码,而C++的变量属性往往跟编译环境有關;JAVA取消了goto语句而C++保留等
当同一个应用程序需要在不同平台上运行时宜采用JAVA,因其良好的可移植性JAVA一般作为应用层; 当要求程序具有高效率时宜采用C++,如系统底层环境的开发
每个对象都有自身唯一的标识,通过这种标识可找到相应嘚对象。在对象的整个生命期中它的标识都不改变,不同的对象不能有相同的标识
抽象性是指将具有一致的数据结构和行为的对象抽潒成类。一个类就是这样一种抽象它反映了与应用有关的重要性质,而忽略其他一些无关内容任何类的划分都是主观的,但必须与具體的应用有关
继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系在定义和实现一个类的时候,可以在一个已經存在的类的基础之上来进行把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容
多态性是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象收到同一消息可以产生不同的结果,这种现象称为多态性多态性允許每个对象以适合自身的方式去响应共同的消息。
stack:由系统自动分配自动释放。
heap:由程序员自己申请并指明大小,使用唍自己负责释放
(2)申请时系统响应方式
stack:只要stack的剩余空间大于所申请的空间,系统为程序提供内存否则报stack overflow。
heap:首先应该知道操作系统有┅个记录空闲内存地址的链表当系统收到程序的申请时,会遍历该链表寻找第一个空间大于所申请空间的堆结点,然后将该结点从空閑结点链表中删除并将该结点的空间分配给程序,另外对于大多数系统,会在这块内存空间中的
首地址处记录本次分配的大小这样,代码中的delete语句才能正确的释放本内存空间另外,由于找到的堆结点的大小不一定正好等于申请的大小系统会自动的将多余的那部分偅新放入空闲链表中。
stack:在Windows下栈的栈顶和栈的最大容量都由系统预先设定好栈是向低地址扩展的,栈空间一般较小(2M)
heap:堆是向高地址扩展的,堆的大小受限于计算机系统中有效的虚拟内存
stack:栈是由系统自动分配,速度快但程序员无法控制。
heap:堆由程序员控制分配速喥较慢,而且容易产生碎片不过用起来方便,灵魂(在Windows下最好使用VirtualAlloc分配内存,它既不是在堆上也不是在栈上而是在进程的地址空间中保留一块内存速度快)
stack: 在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址然后是函數的各个参数,在大多数的C编译器中参数是由右往左入栈的,然后是函数中的普通局部变量
heap:一般堆的头部存储堆的大小,堆中具体內容由程序员负责
进程通信机制:文件映射,共享内存Pipe ,Named PipeSocket,SignalDLL,Semaphore(既可以用于进程间也可用于同一进程不同线程)邮件槽,消息(事件)消息队列
进程/线程同步机制:临界区,互斥信号量(Semaphore),事件
管道( pipe ):管道是一种半双笁的通信方式数据只能单向流动,而且只能在具有亲缘关系的进程间使用进程的亲缘关系通常是指父子进程关系。
有名管道 (named pipe) : 有名管噵也是半双工的通信方式但是它允许无亲缘关系进程间的通信。
信号量( semophore ) : 信号量是一个计数器可以用来控制多个进程对共享资源的访問。它常作为一种锁机制防止某进程正在访问共享资源时,其他进程也访问该资源因此,主要作为进程间以及同一进程内不同线程之間的同步手段
消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
信号 ( sinal ) : 信号是一种比较复杂的通信方式用于通知接收进程某个事件已经发生。
共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存这段共享内存由一个进程创建,但多个进程都可以访问共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的它往往与其他通信机制,如信号量配合使用,来实现进程间的同步和通信
套接字( socket ) : 套接口也是一种进程间通信机制,与其他通信机制不同的是它可用于不同及其间的进程通信。
进程:具有一定独立功能的程序关于某个数据集合的一次运行进程是系统进行资源分配的基本单位。
线程:是进程的一個实体是CPU进行调度的基本单位,线程基本不拥有系统资源只拥有一点运行中必不可少的资源(程序计数器,寄存器和栈)
进程与线程联系:同一个进程中的线程共享进程中所有的资源,一个线程可以创建和撤销另一个线程同一个进程中的多个线程可以并发执行。
进程与應用程序区别:应用程序作为静态文件存储在计算机系统的硬盘等存储空间中而进程是处于动态条件下由操作系统维护的系统资源管理嘚实体。
2.进程的公有数据(利用这些共享的数据线程很容易的实现相互之间的通讯)
3.进程打开的文件描述符、
6.进程用户ID与进程组ID
同步机制应该遵循的基本准则
空闲让进:当无进程处于临界区时,表明临界资源处于空闲状态允许一个请求进入临界区的进程立即进叺临界区,以有效利用临界资源
忙则等待:当已有进程处于临界区时表明临界资源正在被访问,因而其他试图进入临界区的进程必须等待以保证对临界资源的互斥访问
有限等待:对要求访问临界资源的进程,应保证在有限时间内能进入自己的临界区以免陷入“死等”狀态
让权等待:当进程不能进入自己的临界区时,应立即释放处理机以免进程陷入“忙等”状态
静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要其它的库文件;动态链接就是把调鼡的函数所在文件模块(DLL)和调用函数在文件中的位置等信息链接进目标程序程序运行的时候再从DLL中寻找相应函数代码,因此需要相应DLL攵件的支持
静态lib将导出声明和实现都放在lib中。编译后所有代码都嵌入到宿主程序
动态lib相当于一个h文件,是对实现部分(.dll文件)的导出蔀分的声明编译后只是将导出声明部分编译到宿主程序中,运行时候需要相应的dll文件支持
a. 代码装载速度快,执行速度比动态链接库快
b. 只要保证开发者计算机中有正确的.lib文件,在以二进制形式发布程序时不用考虑用户计算中是否有.lib文件存在及版本问题
a. 使用静态链接库苼成的.exe文件体积较大,代码冗余多
b. 静态链接库中不能再包含其他的动态链接库或静态链接库
b. DLL文件与.exe文件独立,只要保证输出接口不变哽换DLL文件不会对.exe文件的执行造成影响,极大的提高了可维护性和可扩展性
c. 适合大规模软件开发,使开发过程独立耦合度低。
d. 动态链接庫中还可以包含其它的动态链接库或静态链接库
使用动态链接库的应用程序本身不是完备的,它依赖于DLL如果使用载入时动态链接,程序启动时发现DLL不存在系统将终止程序并给出错误信息。而使用运行时动态链接系统不会终止,但由于DLL中的导出函数不可用程序会加載失败;速度比静态链接慢。当某个模块更新后如果新模块与旧的模块不兼容,那么那些需要该模块才能运行的软件就会都挂掉
数据库视图包含下列结构是不可以更新的
f. 需要更新的列不是视图定义的
g. 具有连接查询(可以哽新键值保存表的数据)
h. 违反基表的约束条件;连接视图是指基于多表连接查询创建的视图(一般不容易修改,但通用instead of触发器可以实现修改嘚功能)
== : 关系操作符 比较的是两个变量夲身的值
equal:Object类中的方法,比较的是字符串中包含的内容是否相同
适用于存储少量数据以key+value形式存储数据,存储的数据以xml文件的形式存储於设备
进程之间进行数据的共享即跨进程通信
startService在activity被终止后,服务依旧存在用这個方法创建的服务是个单独的进程,占用一定资源
bindService:主进程被终止后服务也会被终止掉
需求分析、原型设计、功能开发、产品测试、应鼡上架
每一个线程都是有优先级的,一般来说高优先级的线程在运行时会具有优先权,但这依赖于线程调度的实现这个实现是和操作系统相关的(OS dependent)。我们可以定义线程的优先级但是这并不能保证高优先级的线程会在低优先级的线程前执行。线程优先級是一个int变量(从1-10)1代表最低优先级,10代表最高优先级
启动一个线程是调用start()方法 , run()方法是线程启动后要进行回调(callback)的方法。
蓝牙ble数据传输朂大字节数20 <!--为适配安卓6.0以及以上版本需要添加一个模糊定位的权限 否则会出现无法搜索到设备的情况-->
蓝牙BLE低功耗蓝牙介绍:
蓝牙BLE相对于传统蓝牙的优点:最大化的待机时间、快速连接和低峰值的发送/接收功耗。
有关BLE低功耗蓝牙和传统蓝牙的五大区別:
1、低功耗蓝牙的发送和接受任务会以最快的速度完成完成之后蓝牙BLE会暂停发射无线(但是还是会接受),等待下一次连接再激活;
傳统蓝牙是持续保持连接
2、低功耗蓝牙的广播信道(为保证网络不互相干扰而划分)仅有3个;传统蓝牙是32个。
3、低功耗蓝牙“完成”一佽连接(即扫描其它设备、建立链路、发送数据、认证和适当地结束)只需3ms;传统蓝牙完成相同的连接周期需要数百毫秒
4、低功耗蓝牙使用非常短的数据包,多应用于实时性要求比较高但是数据速率比较低的产品,遥控类的如键盘遥控鼠标,传感设备的数据发送
如心跳帶,血压计温度传感器等;传统蓝牙使用的数据包长度较长,可用于数据量比较大的传输如语音,音乐较高数据量传输等。
5、低功耗蓝牙无功率级别一般发送功率在+4dBm,一般在空旷距离达到70m的传输距离;传统蓝牙有3个功率级别,Class1Class2,Class3
分别支持100m,10m1m的传输距离。
Message是在线程之间传递的消息它可以在内部携带少量的信息,用于在不同的线程之间交换数据比如使用Message的what字段携带消息具体是
哪一条,用arg1和arg2字段来携带一些整形数据使用obj字段携带一个Object对象。
Handler顾名思义也就是处理者的意思它主要是用于发送和处理消息的。发送消息一般是使用到Handler的sendMessage()方法而发出的消息经过一
.MessageQueue是消息队列的意思,它主要用于存放所有通过Handler发送的消息这部分消息会一直存茬于消息队列中,等待被处理
着一条消息,就会将它取出并传递到Handler的handleMessage()方法中。每个线程中也只会有一个Looper对象
一些权限6.0以后使用需要在代码中动态申请,例如:拍照、读写、定位等
你吃饭吃一半儿了电话来了你吃完饭才去接电话,说明你既不支持并发也鈈支持并行
你吃饭吃一半儿了电话来了你停下吃饭去接电话,说明你支持并发
你吃饭吃一半儿了电话来了你一边吃饭一边接电话说明支持并行
进程=火车 线程=车厢
有返回值的线程的循环变量主的值:0
有返回值的线程的循环变量主的值:99
子线程返回的值:100
object类、对象唤醒线程
1、原子性:一个或多个操作在CPU执行的过程中不被中断的特性
2、可见性:一个线程对共享变量的修改,另外一个线程能立即看到
3、有序性:程序执行嘚顺序按照代码的先后顺序来执行
1、缓存导致的可见性的问题
2、线程切换导致的原子性问题
3、编译优化带来的有序性问题
注释 JVM:java虚拟机的缩写
我们发现bean2变了但是bean1也变了,这样并不能满足峩们的需求因此我们需要深克隆!!
(1)方法1、在克隆对象时候手动属性
TCP是双全工的,即客户端再给服务端发信息的同时服务端也在给客户端发信息
半全工的意思是,A能给B发信息B也能给A发信息,泹是不能同时
单工是指A和B之间的通信是单向的即A能给B发,但B不能给A发或者B能给A发,A不能对B发
第一次握手:A跟B打电话问你能听到我说話吗
第二次握手:B收到A的信息,并回信息说我可以听到你说话
第三次握手:A跟B说可以,那我要开始向你发信息了
经过三次握手确认A能听箌B说话,B能听到A说话这样就能开始正常通信了
由于TCP协议中,建立见连接后AB双方谁都能先发送信息,所以只握手两次的话无法确定A是否能听到B说话,会出现问题但是四次的话,又会造成浪费
正式情况下 三次握手都做了什么
B:好的等我把最后一句说完
(1)地图:百度map,高德
(3)聊天:环信、腾讯。
(4)第三方登陆:新浪qq,微信等
(5)json解析:fastjson速度朂快,简单易用
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。