Java EE知识储备(八)

来源:互联网 发布:java类的实例化过程 编辑:程序博客网 时间:2024/04/25 12:07

Java EE知识储备(八)

目录:

1、C++创建对象:

2、条件概率:

3、随机插入和删除操作性能好的数据结构:

4、C++初始化列表:

5、系统调用和库函数的区别:

6、Linux两个进程打开同一个文件:

7、进程间通信:

8、并发和并行:

9、四种请求方式区别:

10、rem、em、px的区别:


1、C++:

C++创建对象:

假定CSomething是一个类,执行下面这些语句之后,内存里创建了____个CSomething对象。

CSomething a();

CSomething b(2);

CSomething c[3];

CSomething &ra = b;

CSomething d=b;

CSomething *pA = c;

CSomething *p = new CSomething(4);

答:CSomething a():函数声明,没有创建新对象,若去掉括号才是声明一个CSomething对象,调用默认构造函数。

CSomething b(2):使用一个参数的构造函数,创建了一个新对象;

CSomething c[3]:使用无参构造函数,创建了三个新对象;

CSomething &ra = b:指针引用,没有创建新对象;

CSomething d=b:调用拷贝对象函数,创建了一个新对象;

CSomething *pA = c:创建指针,指向对象c,没有构造新对象;

CSomething *p = new CSomething(4):创建了一个新对象并给指针赋值;

类的指针:是一个内存地址值,指向内存中存放的类对象;

对象:是利用类的构造函数,在内存中分配一块内存(包括一些成员变量所赋的值)

 

2、概率与统计:

条件概率:

假设某商品A在任一时刻t内若有人浏览,则该商品在下一时刻t+1内无人浏览的概率为0.35(即下一时刻的浏览情况仅与当前时段相关),定义此条件概率为 P(O_{t+1}=0|O_t=1)=0.35(即用“1”代表有人浏览的事件,用“0”代表无人浏览的事件),类似得定义P(O_{t+1}=1|O_t=1)=0.65,P(O_{t+1}=0|O_t=0)=0.4,P(O_{t+1}=1|O_t=0)=0.6。若此商品A在t=0时有人浏览,它在t=100000时有人浏览的概率是____。

答:设Pn为t = n时刻时有人浏览的事件,则商品A在t = 0时有人浏览,t = 1时有人浏览的概率为P1 = 0.65。

所以t >= 2时,Pn = Pn-1 * 0.65 + (1 - Pn-1) * 0.6【t = n时刻有人浏览的概率 = { t = n - 1时刻有人浏览且t = n时刻有人浏览的概率 } + { t = n - 1时刻没有人浏览且t = n时刻有人浏览的概率}】

化简得,Pn = 0.05 * Pn-1 + 0.6,构造等比序列,设Pn + k = 0.05 * (Pn-1 + k )

得k = - 0.6 / 0.95;

根据等比数列通项公式an = a1 * q ^ (n - 1);

得到Pn - 0.6 / 0.95 = 0.65 * 0.05 ^ (n - 1),即Pn = 0.65 * 0.05 ^ (n - 1) + 0.6 / 0.95,

当t = 100000时,Pn ≈ 0.6 / 0.95 ≈ 0.632

答案:0.632

 

3、数据结构:

随机插入和删除操作性能好的数据结构:

数组、链表、哈希表、队列、堆、栈、双向队列等数据结构能够支持随机的插入和删除操作、并具有较好的性能的是__________。

答:数组:在定义的时候申请一块连续的存储空间,随机插入和删除操作要移动后面的所有元素;

链表:要查询一个数的时候需要依次遍历;

哈希表:对键值对操作,只要知道key值,就很容易删除和插入;

队列:只是从队尾可以插入,从队头可以删除;

堆:堆是一棵完全二叉树,如大顶堆的特点是大于两个子节点的值,执行随机删除和操作需要对该节点的子节点进行调整;

栈:所有操作都在栈顶,随机插入删除都要操作其他数;

双向队列:只有在两端才可以进行插入和删除。

 

4、C++:

C++初始化列表:

答:(1)定义:与其他函数不同,构造函数除了有名字、参数列表和函数体以外,还有初始化列表,初始化列表以冒号开头,后面跟一系列逗号分隔的初始化字段。

例如:class foo {

    string name ;

    int id ;

    foo(string s, int i):name(s), id(i){} ; // 初始化列表

};

(2)构造函数初始化时必须采用初始化列表的情况:

①没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接调用拷贝构造函数初始化;

②常量成员,即需要初始化const修饰的类成员,因为常量只能初始化而不能赋值;

③引用类型,即需要初始化引用成员数据,因为引用不能重新赋值

static const 成员可以在类中,但是不能在初始化列表中因为static属于类,不属于对象,它在未实例化的时候就已经存在了,而构造函数的初始化列表,只有在实例化的时候才执行。

(3)初始化类的成员有两种方式,一是使用初始化列表,二是在构造函数体内进行赋值操作。使用初始化列表主要是基于性能问题,对于内置类型,如int, float等,使用初始化类表和在构造函数体内初始化差别不是很大,但是对于类类型来说,最好使用初始化列表,因为少了一次调用默认构造函数的过程。一个好的原则是,能使用初始化列表的时候尽量使用初始化列表。

(4)初始化:从无到有,创建新对象;

赋值:没有创建新对象,而是对已有对象赋值。

 

5、C/C++、Linux:

系统调用和库函数的区别:

答:(1)系统调用是操作系统为用户态运行的进程和硬件设备进行交互提供的一组接口,系统调用运行在内核态,库函数是可重用的模块,运行在用户态。库函数是对于系统调用的封装,但不是所有的库函数都有对应的系统调用。

(2)常见的系统函数:

fcntl:文件控制

open:打开文件

create:创建新文件

close:关闭文件描述字

read:读文件

write:写文件

readv:从文件读入数据到缓冲数组中

writev:将缓冲数组里的数据写入文件

pread:对文件随机读

pwrite:对文件随机写

lseek:移动文件指针

flock:文件加锁、解锁

dup:复制已打开的文件描述字

fsync:把文件在内存中的部分写回磁盘

(3)fd是一个文件描述字,内核会在每个进程空间维护一个文件描述字表,所有打开的文件都将通过此表中的文件描述字来引用。fd只是一个整数,在open时产生。起到一个索引的作用,进程通过PCB中的文件描述字表找到该fd所指向的文件指针flip。

 

6、Linux:

Linux两个进程打开同一个文件:

答:(1)两个进程中分别产生生成两个独立的fd;

(2)两个进程可以任意对文件进行读写操作,操作系统并不保证写的原子性;

(3)进程可以通过系统调用对文件加锁,从而实现对文件内容的保护;

(4)两个进程可以分别读取文件的不同部分而不会相互影响;

(5)删除一般是删除文件索引,如果两个文件同时打开同一个文件,一个线程执行删除操作,只要另一个线程不退出,就可以继续对该文件进行操作,一旦退出才找不到该文件的索引节点而报错。

 

7、操作系统:

进程间通信:

(1)管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

(2)有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

(3)信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

(4)消息队列( message queue ) : 消息队列是消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

(5)信号 ( signal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

(6)共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量配合使用,来实现进程间的同步和通信。

(7)套接字( socket ) :套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。

 

8、操作系统:

并发和并行:

答:(1)并发:指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。

特点:

①程序与计算不再一一对应,一个程序副本可以有多个计算;

②并发程序之间有相互制约关系,直接制约体现为一个程序需要另一个程序的计算结果,间接制约体现为多个程序竞争某一资源,如处理机、缓冲区等;

③并发程序在执行中是走走停停,断续推进的。

(2)并行:指两个或两个以上事件或活动在同一时刻发生。在多道程序环境下,并行性使多个程序同一时刻可在不同CPU上同时执行。

(3)并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。

(4)在单处理系统中,进程与进程之间只能并发。

 

9、Web:

四种请求方式区别:

答:(1)delete:delete方法就是通过http请求删除指定的URL上的资源。

delete请求一般会返回3种状态码:

①200 (OK):删除成功,同时返回已经删除的资源

②202 (Accepted):删除请求已经接受,但没有被立即执行(资源也许已经被转移到了待删除区域)

③204 (No Content):删除请求已经被执行,但是没有返回资源(也许是请求删除不存在的资源造成的)

(2)put:put是向服务器发送数据,通常指定了资源的存放位置。

(3)get:向服务器发送请求获取资源。get操作是安全的,幂等的。get一般用于获取/查询资源信息。

(4)post:向服务器提交数据。post操作是不安全的,也不是幂等的。比如常见的post重复加载问题:当我们多次发出同样的post请求后,其结果是创建出了若干的资源。post一般用于更新资源信息。

(5)让Web Server支持put和delete需要如下配置:

<init-param>    

    <param-name>readonly</param-name>    

    <param-value>false</param-value>   

</init-param>

readonly参数默认是true,即不允许delete和put操作,所以默认的通过XMLHttpRequest对象的put或者delete方法访问就会报告 http 403 forbidden 错误。

 

10、前端:

rem、em、px的区别:

答:(1)px是绝对字体大小;em是相对字体大小,会继承父级元素的字体大小;rem也是相对字体大小,相对的是html根元素的字体大小。

(2)rem的浏览器支持:

任意浏览器的默认字体高为16px,所有未经调整的浏览器都符合:1em = 16px,目前大多数浏览器都支持rem单位的字体大小,不过,要想兼容IE8及更早版本,还是需要使用px来做单位。写法如下:

html { font-size: 62.5%; }

p { font-size: 15px; font-size: 1.5rem; } /* =15px */

(3)所以我们在写CSS的时候,需要注意两点:

①body选择器中声明font-size=62.5%;

②将你的原来的px数值除以10,然后换上em作为单位;

③重新计算那些被放大的字体的em数值。避免字体大小的重复声明。

(4)px 与 rem 的选择:

①对于只需要适配少部分手机设备,且分辨率对页面影响不大的,使用px即可 。

②对于需要适配各种移动设备,使用rem,例如只需要适配iPhone和iPad等分辨率差别比较挺大的设备。


1 0