2019.08.21笔试面试题复盘

150个选择题,我终于及格啦!,对了94了呢

大题

1、简述String对象、StringBuffer、StringBuilder 区分

string是final的,内部用一个final类型的char数组存储数据,它的拼接效率比较低,实际上是通过建立一个StringBuffer,让后台调用append(),最后再将StringBuffer toSting(),每次操作Sting 都会重新建立新的对象来保存新的值.这样原来的对象就没用了,就要被垃圾回收.这也是要影响性能的。
StringBuffer也是final,线程安全的,中采用一个char数组来保存需要append的字符串,char数组有一个初始大小,当append的字符串长度超过当前char数组容量时,则对char数组进行动态扩展,也即重新申请一段更大的内存空间,然后将当前char数组拷贝到新的位置,因为重新分配内存并拷贝的开销比较大,所以每次重新申请内存空间都是采用申请大于当前需要的内存空间的方式,这里是2倍。
StringBuilder,线程不安全。

2、多态的原理

多态就是:允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定。
原理是java的后期绑定。

3、简要描述面向对象编程的思想

抽象:通过特定的实例抽取出共同的特征以后形成的概念的过程,它强调主要特征和忽略次要特征。
封装:把对象的属性和方法结合成一个独立的整体,隐藏实现细节,并提供对外访问的接口。
继承:从已知的一个类中派生出新的一个类,叫子类。子类实现了父类所有非私有化属性和方法,
并能根据自己的实际需求扩展出新的行为。
多态:多个不同的对象对同一消息作出响应,同一消息根据不同的对象而采用各种不同的行为方法。

4、反射的原理

java虚拟机运行时内存有个叫方法区,主要作用是存储被装载的类的类型信息。每装载一个类的时候,java就会创建一个该类的Class对象实例。我们就可以通过这个实例,来访问这个类的信息。
5、代理的作用和实现
代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

6、hashcode和equals的用法

Java对于eqauls方法和hashCode方法是这样规定的:
如果两个对象相同,那么它们的hashCode值一定要相同;
如果两个对象的hashCode相同,它们并不一定相同(上面说的对象相同指的是用eqauls方法比较。)
一般在覆盖equals()方法的同时也要覆盖hashCode()方法,否则,就会违反Object.hashCode的通用约定,从而导致该类无法与所有基于散列值(hash)集合类(HashMap、HashSet和Hashtable)结合在一起正常运行。

7、set、map、list 的区别(尽量详细)

map:
hashmap:链地址法,大概思路:通过取key的hashCode值、高位运算、取模运算计算位置,插入位置是通过hascode和eques方法判断key是否一致
①.判断键值对数组table[i]是否为空或为null,否则执行resize()进行扩容;
②.根据键值key计算hash值得到插入的数组索引i,如果table[i]==null,直接新建节点添加,转向⑥,如果table[i]不为空,转向③;
③.判断table[i]的首个元素是否和key一样,如果相同直接覆盖value,否则转向④,这里的相同指的是hashCode以及equals;
④.判断table[i] 是否为treeNode,即table[i] 是否是红黑树,如果是红黑树,则直接在树中插入键值对,否则转向⑤;
⑤.遍历table[i],判断链表长度是否大于8,大于8的话把链表转换为红黑树,在红黑树中执行插入操作,否则进行链表的插入操作;遍历过程中若发现key已经存在直接覆盖value即可;
⑥.插入成功后,判断实际存在的键值对数量size是否超多了最大容量threshold,如果超过,进行扩容。

treemap:TreeMap实现SortedMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。如果使用排序的映射,建议使用TreeMap。在使用TreeMap时,key必须实现Comparable接口或者在构造TreeMap传入自定义的Comparator,否则会在运行时抛出java.lang.ClassCastException类型的异常。

linkedHashMap:保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的,也可以在构造时带参数,按照访问次序排序。

HashTable:因为内部是采用synchronized来保证线程安全的

CocurrentHashMap:利用锁分段技术增加了锁的数目,从而使争夺同一把锁的线程的数目得到控制。

set:

HashSet:内部new了一个hashMap,添加时key放数据,value放一个内部定义的final的Object对象

LinkedHashSet:内部new了一个linkHashMap,添加时key放数据,value放一个内部定义的final的Object对象,遍历时有序

TreeSet:内部new了一个TreeMap,添加时key放数据,value放一个内部定义的final的Object对象.

list:

arraylist和linkedList(略)

copywriteList:CopyOnWriteArrayList适合使用在读操作远远大于写操作的场景里

8、实现多线程的方式

继承Thread类,重写run方法
实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target
通过Callable和FutureTask创建线程
通过线程池创建线程

9、synchronized原理 .lock原理

synchronized原理

synchronized 依赖于软件层面jvm
每个对象有一个监视器锁(monitor)。当monitor被占用时就会处于锁定状态,线程执行monitorenter指令时尝试获取monitor的所有权,过程如下:
1、如果monitor的进入数为0,则该线程进入monitor,然后将进入数设置为1,该线程即为monitor的所有者。
2、如果线程已经占有该monitor,只是重新进入,则进入monitor的进入数加1.
3.如果其他线程已经占用了monitor,则该线程进入阻塞状态,直到monitor的进入数为0,再重新尝试获取monitor的所有权。
Java SE1.6为了减少获得锁和释放锁所带来的性能消耗,引入了“偏向锁”和“轻量级锁”。

lock原理

lock无关JVM实现的,依赖于硬件层面,
使用CLH对列(什么前驱,尾部自旋,没记住)实现。原生的CLH队列是用于自旋锁,但Doug Lea把其改造为阻塞锁。

10、synchronized和lock区别

使用上:

synchronized 在成功完成功能或者抛出异常时,虚拟机会自动释放线程占有的锁;而Lock对象在发生异常时,如果没有主动调用unLock()方法去释放锁,则锁对象会一直持有,因此使用Lock时需要在finally块中释放锁;
lock接口锁可以通过多种方法来尝试获取锁包括立即返回是否成功的tryLock(),以及一直尝试获取的lock()方法和尝试等待指定时间长度获取的方法,相对灵活了许多比synchronized;
写锁来提高系统的性能,因为读锁是共享锁,即可以同时有多个线程读取共享资源,而写锁则保证了对共享资源的修改只能是单线程的。
lock可以实现公平锁

原理上:见上题

选择题

1、2019.08.21笔试面试题复盘_第1张图片
深度为 h 的满二叉树是:第1层1个结点第2层2个结点第3层4个结点第4层8个结点…第h层2^(h-1)个结点,最后一层都是树叶,所以 m = 2(h-1)( 是次方的意思)结点数目 n = 1 + 2 + 4 + 8 + … + 2^(h-1) = 2^h - 1

2、
2019.08.21笔试面试题复盘_第2张图片
什么是跨域

当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域

当前页面url 被请求页面url 是否跨域 原因
http://www.test.com/ http://www.test.com/index.html 同源(协议、域名、端口号相同)
http://www.test.com/ https://www.test.com/index.html 跨 域 协议不同(http/https)
http://www.test.com/ http://www.baidu.com/ 跨域 主域名不同(test/baidu)
http://www.test.com/ http://blog.test.com/ 跨域 子域名不同(www/blog)
http://www.test.com:8080/ http://www.test.com:7001/ 跨域 端口号不同(8080/7001)

为什么出现跨域

出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)。

非同源限制

【1】无法读取非同源网页的 Cookie、LocalStorage 和 IndexedDB

【2】无法接触非同源网页的 DOM

【3】无法向非同源地址发送 AJAX 请求

解决方案

  • https://www.cnblogs.com/smiler/p/5829621.html
  • https://www.jianshu.com/p/4990f78a6fb7
  • https://segmentfault.com/a/1190000017312269

3、2019.08.21笔试面试题复盘_第3张图片

在选择重传协议中,接收方逐个地确认正确接收的分组,不管接收到的分组是否有序,只要正确接收就发送选择ACK分组进行确认。因此选择重传协议中的ACK分组不再具有累积确认的作用,要特别注意其与GBN协议的区别。本题中只收到1号帧的确认,0、2号帧超时,由于对于1号帧的确认不具累积确认的作用,因此发送方认为接收方没有收到0、2号帧,于是重传这两帧。因为3号帧计时器并无超时,所以暂时不用重传3号帧。

4、
2019.08.21笔试面试题复盘_第4张图片

DML(data manipulation language):

   它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对 数据库 里的数据进行操作的语言 

DDL(data definition language):

   DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用 

DCL(Data Control Language):

   是数据库控制功能。是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。在默认状态下,只有sysadmin,dbcreator,db_owner或db_securityadmin等人员才有权力执行DCL

5、
2019.08.21笔试面试题复盘_第5张图片

如果一个进程有m个资源它就能够结束,不会使自己陷入死锁中。因此最差情况是每个进程有m-1个资源并且需要另外一个资源。如果留下有一个资源可用,那么其中某个进程就能够结束并释放它的所有资源,使其它进程也能够结束。所以避免死锁的条件是:r≥p(m-1)+1。带入上述条件公式:r≥3(4-1)+1=10。所以答案为10个。

6、
2019.08.21笔试面试题复盘_第6张图片

C 首次适应,是按地址排序,然后依次找到大小满足要求(比需要的大即可)的内存块,划分出一定大小,剩下空闲块的还在链上。
D 最佳适应,空闲块还是从小到大排序,找到大小最接近的内存块。摘链,多出来的再插入链表。
对于选项C,D,空间地址是递增的,每个空白块的大小不确定,所以这两个算法只需在链表中查找所需大小的空白块,没有好不好实现一说。
对于选项A,指针大小4字节(32位),和指针所指向的空白块相比,其大小基本可以忽略,就算指针很多,占用了空间,但也说明了空白块也很多,所以对比下,指针所占空间基本可以忽略。
B选项:在分配空间的时候,会进行空白块的查找。根据算法的不同,欲分配空间大小的不同,其查找的时间总是不容易计算的。

7、
2019.08.21笔试面试题复盘_第7张图片

包含2个属性(A,B)的关系模式。
假如A是主键,A->B,由于A只有一个属性,消除了部分依赖,满足2NF;关系模式只有2个属性,也不存在传递依赖,满足3NF;由于除了
A->B,没有其他的函数关系,A是决定因素,又是候选码,满足BCNF;
假如AB是主键,综合上述分析,此外,关系模式中除了主键AB外没有其他属性,满足BCNF;
因此A,B选项是对的。
C选项中,假如主键包含2个属性,可以存在部分依赖;C错误
D选项是对的,任何关系模式都有码

8、
2019.08.21笔试面试题复盘_第8张图片

**pa=a;指针pa指向a[0];
pa++;pa++和++pa的区别知道吧,返回值仍是pa操作之前的值;
(pa++)取pa只想的地址的值;
(pa++)=3;将该值变为原来的3倍,也就是数组a的第一个值为4.5;
由于pa++之后pa指针移动了size(float)个字节,所以pa指向a[1],所以值为2.5。

9、
2019.08.21笔试面试题复盘_第9张图片

组作用域类型

每个安全组和通信组均有作用域,该作用域标识组在域树或树林中应用的范围。组的作用域有通用作用域、全局作用域、本地作用域。

(1)通用组:
有通用作用域的组可以将其成员作为来自域树或树林中任何Windows server 2003域的组合账户,并且在域树或树林的任何域中都可获得权限。 有通用作用域的组成为通用组

(2)全局组:
有全局作用域的组可将其成员作为仅来自组所定义的域的组和账户,并且在树林中的任何域中都可获得权限。有全局作用域的组成为全局组

(3)本地组:
具有域本地作用域的组可以将其作为来自Windows server 2003或Windows NT域的组和账户,且可用于仅在域中授予权限。具有本地作用域的组成为本地组

10、
2019.08.21笔试面试题复盘_第10张图片
栈是线性结构,但可以是顺序存储,也可以是链式存储。
空栈:是指无元素

11、
2019.08.21笔试面试题复盘_第11张图片

RAID的类型和级别

RAID实现的方式分为:

外接式磁盘阵列:通过扩展卡提供适配能力。

内接式RAID:主板集成RAID控制器。

组成RAID阵列的不同方式成为RAID级别

不同的RAID级别,不同的存储性能,不同的数据可靠性,不同的存储成本。

RAID 0的工作原理:

指把多个硬盘按照一定的算法组合起来,容量叠加形成一个逻辑硬盘,但是

当向此逻辑硬盘存储数据时,数据是同时传输给逻辑硬盘组里面的每一个硬盘

同时存储。当逻辑硬盘里面有一个硬盘坏掉时,所有硬盘的数据同时丢失,此

硬盘组不具有恢复备份数据的功能!所需要的磁盘数为:最低为2个或是更多。

2019.08.21笔试面试题复盘_第12张图片

RAID 0的优点:

  • 极高的磁盘读写效率,不存在校验,不会占用太多CPU资源
  • 设计、使用和配置比较简单。

RAID 0的缺点:

  • 无冗余,不能用于对数据安全性要求高的环境

RAID 0使用的领域:

  • 视频生成和编辑,图像编辑,其它需要大的传输带宽的操作。

RAID1的工作原理及特性

  RAID1:RAID1其实很简单,RAID1里面就只有由2个独立的物理硬盘组成的

  逻辑硬盘,当粗存数据时,逻辑硬盘里的一个硬盘存储数据,另一个硬盘

  就同时做备份镜像!就相当于照镜子一样。所以,当其中一个硬盘坏掉时

  可以通过另外一个硬盘恢复所要存储的数据,

2019.08.21笔试面试题复盘_第13张图片

RAID1所需的磁盘数为N>=1 最低为两个

RAID1的优点:

  • 具有100%的数据冗余性,提供最高的数据保障,理论上可以实现2倍的读取效率,设计和使用比较简单。

RAID1的缺点:

  • 开销大,空间利用率只有50%,在写性能方面提升不大

适用的领域:

  • 财务,金融等高可用,高安全的数据存储环境。

RAID2所要采用校验冗余把数据分散为位或块,加入汉明码,间隔写入到磁盘阵列的每个磁盘中在成员磁盘上的地址都一样采用了并行存取方式花费大,成本昂贵存储的数据!

RAID3的工作原理:

  在RAID3中,数据块被分为更小的块并行传输到各个成员磁盘上,同时计

  算XOR校验数据存放到专用的校验磁盘上

2019.08.21笔试面试题复盘_第14张图片

RAID3特性:RAID3所需成员磁盘数 3个或更多,最低为3个

    RAID3的优点:读写性能都比较好当有磁盘损坏时,对整体吞吐量影

    响较小减少了开销

    RAID3缺点:控制器设计复杂采用并行存取方式,主轴同步时吞吐

    量没有提高校验磁盘的写性能有瓶颈

    RAID3适用领域	视频生成和图像、视频编辑等需要高吞吐量的应用环境

RAID5的工作原理:

    RAID 5:RADI5的意思是将n个硬盘按照一定的关系组合成一个逻辑硬盘,

    其中有n-1个硬盘作为存储用,而另一个硬盘作为存储这种关系的镜像盘

  (这个镜像盘不指定为某一个固定盘)。其实简单的说看,可以看成一

   个一元一次方程,当RAID5里面不管是哪一个硬盘被破坏,我们都可以通

   过这个关系(一元一次方程)推算出所被破坏的数据,所以具有数据恢复

   功能!但是RAID5也有一个缺点,就是当被破坏的盘大于两个,那么数据

   将恢复不了,即一元一次方程一个方程式不能解出两个未知数一样!

2019.08.21笔试面试题复盘_第15张图片

2019.08.21笔试面试题复盘_第16张图片

RAID10的工作原理及特性:

2019.08.21笔试面试题复盘_第17张图片

主要工作特性:
2019.08.21笔试面试题复盘_第18张图片
RAID50的工作原理及其特性
2019.08.21笔试面试题复盘_第19张图片
2019.08.21笔试面试题复盘_第20张图片

区别:

  • RAID 0 是以条带的形式将数据均匀分布在阵列的各个磁盘上。
  • RAID 1 以镜像为冗余方式,对虚拟磁盘上的数据做多分拷贝,放在成员磁盘上。
  • RAID 3 数据块被分为更小的块并行传输到各个成员磁盘上,同时计算XOR校验数据存放到专用的校验磁盘上
  • RAID 5 采用独立存取的阵列方式,校验信息被均匀的分散到阵列的各个磁盘上
  • RAID 10 结合RAID 1 和 RAID 0 先镜像,再条带化
  • RAID 50 是RAID 5 和 RAID 0 的结合,先实现RAID 5 ,再条带化。
    2019.08.21笔试面试题复盘_第21张图片

12、
2019.08.21笔试面试题复盘_第22张图片
答案选c,还不太懂

13、
2019.08.21笔试面试题复盘_第23张图片

动态存储分配的方法

  1. 首次适应算法(first fit)
    我们以空闲分区链为例来说明采用 首次适应算法(first fit)时的分配情况。FF 算法要求空闲分区链以地址递增的次序链接。在分配内存时,从链首开始顺序查找,直至找到一个大小能满足要求的空闲分区为止;然后再按照作业的大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区仍留在空闲链中。若从链首直至链尾都不能找到一个能满足要求的分区,则此次内存分配失败,返回。该算法倾向于优先利用内存中低址部分的空闲分区,从而保留了高址部分的大空闲区。这给为以后到达的大作业分配大的内存空间创造了条件。其缺点是低址部分不断被划分,会留下许多难以利用的、很小的空闲分区,而每次查找又都是从低址部分开始,这无疑会增加查找可用空闲分区时的开销。

  2. 循环首次适应算法(next fit)
    该算法是由首次适应算法演变而成的。在为进程分配内存空间时,不再是每次都从链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直至找到一个能满足要求的空闲分区,从中划出一块与请求大小相等的内存空间分配给作业。为实现该算法,应设置一起始查寻指针,用于指示下一次起始查寻的空闲分区,并采用循环查找方式,即如果最后一个(链尾)空闲分区的大小仍不能满足要求,则应返回到第一个空闲分区,比较其大小是否满足要求。找到后,应调整起始查寻指针。该算法能使内存中的空闲分区分布得更均匀,从而减少了查找空闲分区时的开销,但这样会缺乏大的空闲分区。

  3. 最佳适应算法(Best Fit)
    算法:
    将空闲分区链中的空闲分区按照空闲分区由小到大的顺序排序,从而形成空闲分区链。每次从链首进行查找合适的空闲分区为作业分配内存,这样每次找到的空闲分区是和作业大小最接近的,所谓“最佳”。
    优点:
    第一次找到的空闲分区是大小最接近待分配内存作业大小的;
    缺点:
    产生大量难以利用的外部碎片。

  4. 最坏适应算法(Worst Fit)
    算法:
    与最佳适应算法刚好相反,将空闲分区链的分区按照从大到小的顺序排序形成空闲分区链,每次查找时只要看第一个空闲分区是否满足即可。
    优点:
    效率高,分区查找方便;
    缺点:
    当小作业把大空闲分区分小了,那么,大作业就找不到合适的空闲分区。

  5. 快速适应算法(quick fit)
    该算法又称为分类搜索法,是将空闲分区根据其容量大小进行分类,对于每一类具有相同容量的所有空闲分区,单独设立一个空闲分区链表,这样,系统中存在多个空闲分区链表,同时在内存中设立一张管理索引表,该表的每一个表项对应了一种空闲分区类型,并记录了该类型空闲分区链表表头的指针。空闲分区的分类是根据进程常用的空间大小进行划分,如 2 KB、4 KB、8 KB 等,对于其它大小的分区,如 7 KB 这样的空闲区,既可以放在 8 KB 的链表中,也可以放在一个特殊的空闲区链表中。该算法的优点是查找效率高,仅需要根据进程的长度,寻找到能容纳它的最小空闲区链表,并取下第一块进行分配即可。另外该算法在进行空闲分区分配时,不会对任何分区产生分割,所以能保留大的分区,满足对大空间的需求,也不会产生内存碎片。该算法的缺点是在分区归还主存时算法复杂,系统开销较大。此外,该算法在分配空闲分区时是以进程为单位,一个分区只属于一个进程,因此在为进程所分配的一个分区中,或多或少地存在一定的浪费。空闲分区划分越细,浪费则越严重,整体上会造成可观的存储空间浪费,这是典型的以空间换时间的作法。

2019.08.21笔试面试题复盘_第24张图片
14、
2019.08.21笔试面试题复盘_第25张图片
进程即运行中的程序,表示程序是在运行中的;程序是一种非运行的文件类型,表示程序未在运行中,两者的本质区别就是状态的不同:即为动态和静态的区别。

进程的定义:

“进程”是操作系统的最基本、最重要的概念之一。但迄今为止对这一概念还没有一个确切的统一的描述。下面给出几种对进程的定义描述。进程是程序的一次执行。进程是可以并行执行的计算。进程是一个程序与其使用的数据在处理机上顺序执行时发生的活动。进程是程序在一个数据集合上的运行过程。它是系统进行资源分配和调度的一个独立单位。

进程的特征:
动态性:是程序的一次执行;
并发性:进程是可以并发执行;
独立性:是系统进行资源分配和调度的一个独立单位;
异步性:进程间的相互制约,使进程执行具有间隙;
结构性:进程是具有结构的。

进程与程序的主要区别:

  1. 程序是永存的;进程是暂时的,是程序在数据集上的一次执行,有创建有撤销,存在是暂时
  2. 程序是静态的观念,进程是动态的观念
  3. 进程具有并发性,而程序没有
  4. 进程是竞争计算机资源的基本单位,程序不是
  5. 进程和程序不是一一对应的: 一个程序可对应多个进程即多个进程可执行同一程序; 一个进
    程可以执行一个或几个程序

15、
2019.08.21笔试面试题复盘_第26张图片
A—分片可在信源机或路由器,所以 A错
B—重组只发生在目的机,所以 B错
C—由A可知,C的前半句错
D—分片在信源机或路由器,重组只在目的机,所以 D错

  • 在IPv4路由器上确实具有报文分片和重组的功能,根据下一跳的MTU会自动分片,到达目的地后由目标主机进行重组;
  • 在IPv6网络上已经取消了路由器的报文分片和重组的功能,这个功能由源主机来承担,它可以发送MTU探测数据包进行最小MTU探测,然后按照最小MTU发送数据包。

16、
2019.08.21笔试面试题复盘_第27张图片
A)承载信息量的基本信号单位是码元。
B)比特表示信息量的单位;
C)数据传输速率在数值上等于每秒钟传输构成数据代码的二进制比特数;
D)误码率是指二进制码元在数据传输系统中被传错的概率。

17、

2019.08.21笔试面试题复盘_第28张图片
trap指令、跳转指令和压栈指令均可以在用户态执行,其中trap指令负责由用户态转换成为内核态。而关中断指令为特权指令,必须在核心态才能执行

18、
2019.08.21笔试面试题复盘_第29张图片
外模式也称子模式(Subschema)或用户模式,是数据库用户(包括应用程序员和最终用户)能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。理解:①一个数据库可以有多个外模式;②外模式就是用户视图;③外模式是保证数据安全性的一个有力措施。

内模式又称存储模式,对应于物理级,它是数据库中全体数据的内部表示或底层描述,是数据库最低一级的逻辑描述,它描述了数据在存储介质上的存储方式和 物理结构 ,对应着实际存储在外存储介质上的数据库。内模式由内模式描述语言来描述、定义所有内部记录类型、索引和文件的组织方式,以及数据控制方面的细节,它是数据库的存储观。

概念模式 (Conceptual Schema)是数据库中全部数据的整体逻辑结构的描述。它由若干个概念记录类型组成,还包含记录间联系、数据的完整性、安全性等要求。 描述概念模式的数据定义语言称为“模式DDL”

外模式,对应用户级。反应了数据库的用户观。
模式,是对所有用户数据逻辑结构和特征的所有描述。体现了数据库的整体观。
内模式,描述了数据在物理介质上的存储方式和物理结构。体现了数据库的存储观。

19、
2019.08.21笔试面试题复盘_第30张图片
因为ftp使用两条TCP连接完成文件传输,一条是控制连接,一条是数据连接。一个文件传输结束,即数据传输结束,只是关闭了数据连接,即20端口,但是还要等待客户是否有下一个文件传输,所以控制连接21端口还没有关闭释放,所以他们不是同时被释放的。

20、
2019.08.21笔试面试题复盘_第31张图片

每个用户进程都有一个或若干个与之相关的系统栈,用于存放过程和系统调用参数及调用地址。处理机处于执行状态时,正在处理的许多信息都是存放在寄存器中。当进程被切换时,处理机状态信息都保存在相应的pcb中,以便处理机继续执行时,能从断点继续执行

21、
2019.08.21笔试面试题复盘_第32张图片

TCP/IP协议族分4个层次:

  1. 网络接口层(network interface layer):最底层,是负责网络层与硬件设备之间的联系。
  2. 网际层(Internet layer):解决的是计算机到计算机的通信问题。
  3. 传输层(transmission layer):解决的是计算机程序到计算机程序之间的通信问题。
  4. 应用层(application layer):提供一组常用的应用程序给用户

22、
2019.08.21笔试面试题复盘_第33张图片
Unix把进程分成两大类:

一类是系统进程,另一类是用户进程。系统进程执行操作系统程序,提供系统功能,工作于核心态。用户进程执行用户程序,在操作系统的管理和控制下执行,工作于用户态。进程在不同的状态下执行时拥有不同的权力。

在Unix系统中进程由三部分组成,分别是进程控制块、正文段和数据段。Unix系统中把进程控制块分成proc结构和user结构两部分

proc存放的是系统经常要查询和修改的信息,需要快速访问,因此常将其装入内存

23、
2019.08.21笔试面试题复盘_第34张图片
递归锁(recursivelock):

严格上讲递归锁只是互斥锁的一个特例,同样只能有一个线程访问该对象,但允许同一个线程在未释放其拥有的锁时反复对该锁进行加锁操作; windows下的临界区默认是支持递归锁的,而linux下的互斥量则需要设置参数PTHREAD_MUTEX_RECURSIVE_NP,默认则是不支持

正确答案: C
进程/线程同步方法
常见的进程/线程同步方法有互斥锁(或称互斥量Mutex)、读写锁(rdlock)、条件变量(cond)、信号量(Semophore)等。
在windows系统中,临界区(Critical Section)和事件对象(Event)也是常用的同步方法。
递归锁/非递归锁
Mutex可以分为递归锁(recursive mutex)和非递归锁(non-recursive mutex)。 递归锁也叫可重入锁(reentrant mutex),非递归锁也叫不可重入锁(non-reentrant mutex)。
二者唯一的区别是:
同一个线程可以多次获取同一个递归锁,不会产生死锁。
如果一个线程多次获取同一个非递归锁,则会产生死锁。
Windows下的Mutex和Critical Section是可递归的。
Linux下的pthread_mutex_t锁是默认是非递归的。可以通过设置PTHREAD_MUTEX_RECURSIVE属性,将pthread_mutex_t锁设置为递归锁。

24、
2019.08.21笔试面试题复盘_第35张图片
解析:
10=q(10,10)
10=10 10=1+q(10,9)
10=10 10=9+1 10=2+q(10,8)

25、
2019.08.21笔试面试题复盘_第36张图片
为什么用信道复用技术?
因为在一般情况下,通信信道带宽远远大于用户所需的带宽,使用信道复用技术可以提高信道利用率,共享信道资源,降低网络成本。

信道复用技术分为频分复用,时分复用,波分复用,码分复用,空分复用,统计复用,极化波复用。

频分复用技术的特点是所有子信道传输的信号以并行的方式工作,每一路信号传输时可不考虑传输时延,因而频分复用技术取得了非常广泛的应用。频分复用技术除传统意义上的频分复用(FDM)外,还有一种是正交频分复用。

时分复用就是将提供给整个信道传输信息的时间划分成若干时间片(简称时隙),并将这些时隙分配给每一个信号源使用,每一路信号在自己的时隙内独占信道进行数据传输。时分复用技术的特点是时隙事先规划分配好且固定不变,所以有时也叫同步时分复用。

其优点是时隙分配固定,便于调节控制,适于数字信息的传输;缺点是当某信号源没有数据传输时,它所对应的信道会出现空闲,而其他繁忙的信道无法占用这个空闲的信道,因此会降低线路的利用率。

时分复用技术与频分复用技术一样,有着非常广泛的应用,电话就是其中最经典的例子,此外时分复用技术在广电也同样取得了广泛地应用,如SDH,ATM,IP和HFC网络中CM与CMTS的通信都是利用了时分复用的技术。

26、
2019.08.21笔试面试题复盘_第37张图片
ARP:是根据ip地址寻找MAC地址的协议
127.0.0.1是环回地址,不是私有地址

27、
2019.08.21笔试面试题复盘_第38张图片
java不允许单独的方法,过程或函数存在,需要隶属于某一类中。——AB错

java语言中的方法属于对象的成员,而不是类的成员。不过,其中静态方法属于类的成员。——C错

28、
2019.08.21笔试面试题复盘_第39张图片
数据抽象的用途

对需求分析阶段收集到的数据进行分类、组织(聚集),形成实体,实体的属性,标识实体的码,确定实体之间的联系类型(1:1,1:n,m:n)

三种常用抽象

  1. 分类(Classification)
    定义某一类概念作为现实世界中一组对象的类型
    这些对象具有某些共同的特性和行为
    它抽象了对象值和型之间的“is member of”的语义
    在E-R模型中,实体型就是这种抽象
  2. 聚集(Aggregation)
    定义某一类型的组成成分
    它抽象了对象内部类型和成分之间“is part of”的语义
    在E-R模型中若干属性的聚集组成了实体型,就是这种抽象
  3. 概括(Generalization)
    定义类型之间的一种子集联系
    它抽象了类型之间的“is subset of”的语义
    概括有一个很重要的性质:继承性。子类继承超类上定义的所有抽象。

29、
2019.08.21笔试面试题复盘_第40张图片
进程处于运行状态时,它必须已获得所需资源,在运行结束后就撤销。只有在时间片到或出现了比现在进程优先级更高的进程时才转变成就绪状态。

P(wait) 操作表示进程请求某一资源, A 、 B 和 C 都因为请求某一资源会进入阻塞态,而 D 只是被剥夺了处理机资源,进入就绪态,一旦得到处理机即可运行。

30、
2019.08.21笔试面试题复盘_第41张图片
所有操作都成功了,数据自然就一致了。据库的安全性是指保护数据库以防止不合法的使用所造成的数据泄露、更改或破坏。

由于硬件的故障,系统软件和应用软件的错误,操作的失误以及恶意的破坏都是不可避免的,这些故障,轻则会造成运行事务非正常中断,影响数据库中数据的正确性,重则破坏数据库,使数据库中的数据部分丢失或全部丢失.为了保证各种故障发生后,数据库中的数据都能从错误状态恢复到某种逻辑一致状态,DBMS中的恢复子系统是必不可少的.

恢复子系统的功能就是利用冗余数据,再根据故障的类型采取相应的恢复措施,把数据库恢复到故障前的某一时刻的一致性状态.

31、
2019.08.21笔试面试题复盘_第42张图片

String s = “hello” ; // 先在栈中创建一个对String类的对象引用变量s,然后通过符号引用去字符串常量池里找有没有"hello",因为之前在常量池中已经 有"hello",所以直接将b指向"hello" --> 因为不需要在常量池产生"hello",所以只是在栈中产生1个引用
String t = new String( “hello” ); // 先在栈中创建一个对String类的对象引用变量t,然后new()操作会在heap堆中产生一个新的对象"hello",并将t指向堆中 的"hello",同时检查String pool常量池中是否有对象"hello",如果没有也产生一个对象"hello",如果有则不产生,因为这里 之前已经在常量池中产生过了,所以 --> 只需要产生1个对象及1个引用

String 类的equals方法重写了父类的equals方法,它是会首先判定是不是string类型,再去判定里面的值是否相等

equal 的源码

public boolean equals(Object anObject) {
if ( this == anObject) {
return true ;
}
if (anObject instanceof String) {
String anotherString = (String) anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0 ;
while (n-- != 0 ) {
if (v1[i] != v2[i])
return false ;
i++;
}
return true ;
}
}
return false ;
}

32、
2019.08.21笔试面试题复盘_第43张图片
时间片轮转法(RR)

算法描述:用于分时系统中的进程调度。每次调度时,总是选择就绪队列的队首进程,让其在CPU上运行一个系统预先设置好的时间片。一个时间片内没有完成运行的进程,返回到绪队列末尾重新排队,等待下一次调度。

时间片轮转算法的基本思想是,系统将所有的就绪进程按先来先服务算法的原则,排成一个队列,每次调度时,系统把 处理机分配给队列首进程,并让其执行一个时间片。当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序根据这个请求停止该进程的运行,将它送到就绪队列的末尾,再把处理机分给就绪队列中新的队列首进程,同时让它也执行一个时间片。

33、
2019.08.21笔试面试题复盘_第44张图片
操作系统的题复盘是真的不会啊。

34、
2019.08.21笔试面试题复盘_第45张图片
满二叉树的定义是:除叶子节点外,每个节点都有两个子树。我举例你看能不能理解。
树只有
1层:1个根节点,深度为1。
2层:3节点,包括一根节点,两个叶子节点,深度是2.
3层:7节点,包括一根节点,第二层的2个节点,第三层的4各节点。叶子节点是4,深度是3
4层:15节点,包括一根节点,第二层的2个节点,第三层的4个节点,第4层的8各节点,叶子节点是8,深度是4。
5层:31节点,包括一根节点,第二层的2个节点,第三层的4个节点,第四层的8各节点,第五层的16个节点,叶子结点是16,深度是5.

35、
2019.08.21笔试面试题复盘_第46张图片
Integer.valueOf(i)方法 , 当i在-128-127之间时返回的是缓存的Integer对象。 否则返回的是一个新的Integer对象。
可以发现:Integer i01=59;在反编译过来之后是Integer.valueOf(59);

在用Integer 类型的i01和int类型的i02进行“==”比较的时候,反编译过来的是:i01.intValue() == i02

这两个操作分别为 自动装箱 和自动拆箱。这个特性是在java1.5开始才有的。所以第一点中提到了jdk版本为1.5.

如果我们在eclipse/myeclipse 中将java compiler设置成1.5以下的就会无法通过编译。

所以
i01 == i02 等价于 i01.intValue() 和 i02 两个值的比较59==59 -->true;

i01 == i03 由于 59在-128到127之间,所以,i01和i03的赋值操作返回的是同一个对象。都是从chche中返回的同一个对象,对象地址相同 true;

i03 == i04 i03是来自缓存值,i04是新new的对象 ,二者不是同一个对象,所以false。

i02 == i04 和第一个类似,true。

36、
2019.08.21笔试面试题复盘_第47张图片
Java程序中,main()方法的格式为public staric void main(String args[]) { },返回值为void,参数必须为字符数组。本题目程序的参数不是字符数组,编译不会出错,但是运行时会找不到main()方法,程序无法执行。

37、
2019.08.21笔试面试题复盘_第48张图片
String、StringBuffer与StringBuilder之间区别

  1. 三者在执行速度方面的比较:StringBuilder > StringBuffer > String
  2. String <(StringBuffer,StringBuilder)的原因
    String:字符串常量
    StringBuffer:字符创变量
    StringBuilder:字符创变量
    从上面的名字可以看到,String是“字符创常量”,也就是不可改变的对象。对于这句话的理解你可能会产生这样一个疑问 ,比如这段代码:
    String s = "abcd"; s = s+1; System.out.print(s);// result : abcd1
    我们明明就是改变了String型的变量s的,为什么说是没有改变呢? 其实这是一种欺骗,JVM是这样解析这段代码的:首先创建对象s,赋予一个abcd,然后再创建一个新的对象s用来执行第二行代码,也就是说我们之前对象s并没有变化,所以我们说String类型是不可改变的对象了,由于这种机制,每当用String操作字符串时,实际上是在不断的创建新的对象,而原来的对象就会变为垃圾被GC回收掉,可想而知这样执行效率会有多底。而StringBuffer与StringBuilder就不一样了,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,这样就不会像String一样创建一些而外的对象进行操作了,当然速度就快了。
  3. StringBuilder与 StringBuffer
    StringBuilder:线程非安全的
    StringBuffer:线程安全的

对于三者使用的总结:

1.如果要操作少量的数据用 = String

2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder

3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer

38、
2019.08.21笔试面试题复盘_第49张图片
任何情况下,所以先构成六个顶点的无向图,需要6*5/2=15条边,然后使G7与G1连接起来,共15+1=16条边。

无向图:连通性
具有 7 个顶点的无向图至少应有多少条边才可能成为一个连通图 ? n-1=6

问题同:已知一个无向图具有 7 个顶点,且是一个连通图,问至少多少条边?n-1=6

具有7个顶点的无向图至少应有多少条边一定成为一个连通图? (n-1)(n-2)/2 + 1=16

已知一个有向图具有 7 个顶点,且是一个强联通图,问至多 多少条弧?(n-1)*n/2=21(即从1加到n,累加)

有向图: 强连通性

具有 7 个顶点的有向图至少应有多少条边才可能成为一个强连通图 ? key: n=7

问题同:已知一个有向图具有 7 个顶点,且是一个强联通图,问至少多少条弧? key: n=7

具有 7 个顶点的有向图至少应有多少条边一定成为一个强连通图 ? key:(n-1)(n-1) + 1=37

已知一个有向图具有 7 个顶点,且是一个强联通图,问至多 多少条弧?key:(n-1)*n=42

39、
2019.08.21笔试面试题复盘_第50张图片

Lanbda表达式的主要作用就是代替匿名内部类的繁琐语法, 它由三部分组成:
(1) 形参列表。形参列表允许省略形参类型。如果形参列表中只有一个参数,甚至连形参列表的圆括号也可以省略。
(2) 箭头(→)。必须通过英文中画线和大于符号组成。
(3)代码块。如果代码块只包含一条语句,Lambda表达式允许省略代码块的花括号,那么那条语句就不要用花括号表示语句结束。Lambda代码块只有一条return语句,甚至可以省略return关键字。Lambda表达式需要返回值,而它的代码块中仅有一套省略了return的语句。Lambda表达式会自动返回这条语句的值。
由此可见,应该是A和D正确。

40、JAVA所定义的版本中不包括: ( )
A、JAVA2 EE B、 JAVA2 Card
C、 JAVA2 ME D、JAVA2 HE

只知道EE、ME、SE。B不太清楚

41、下列 javaDoc注释正确的是( )
A、/* 我爱北京天安门 / B、 // 我爱北京天安门 /
C、 /
我爱北京天安门 */ D、/*我爱北京天安门 **/

注释的格式、类型

  • 单行注释://……
  • 块注释:/……/
  • 文档注释:/**……*/

42、以下( )不是合法的标识符
A、STRING B、 x3x;
C、 void D、de$f

Java标识符由数字,字母和下划线(_),美元符号($)或人民币符号(¥)组成。在Java中是区分大小写的,而且还要求首位不能是数字。最重要的是,Java关键字不能当作Java标识符。

命名约定
1.类和接口名。每个字的首字母大写,含有大小写。例如,MyClass,HelloWorld,Time等。
2.方法名。首字符小写,其余的首字母大写,含大小写。尽量少用下划线。例如,myName,setTime等。这种命名方法叫做驼峰式命名。
3.常量名。基本数据类型的常量名使用全部大写字母,字与字之间用下划线分隔。对象常量可大小混写。例如,SIZE_NAME。
4.变量名。可大小写混写,首字符小写,字间分隔符用字的首字母大写。不用下划线,少用美元符号。给变量命名是尽量做到见名知义。

43、下列关于字符串的描叙中错误的是( BC )(选择两项)
A、字符串是对象
B、 String 对象存储字符串的效率比 StringBuffer 高
C、 可以使用 StringBuffer sb="这里是字符串 "声明并初始化 StringBuffer对象 sb
D、String 类提供了许多用来操作字符串的方法:连接,提取,查询等=

44、下面关于数组的说法中,错误的是( )(选择两项)
A、在类中声明一个整数数组作为成员变量,如果没有给它赋值,数值元素值为空
B、 数组可以在内存空间连续存储任意一组数据
C、 数组必须先声明,然后才能使用
D、数组本身是一个对象

如果没有复制,数值元素为0
java的数组是指针,可以不连续。

45、 Java中,如果类 C是类 B的子类,类 B是类 A 的子类,那么下面描述正确的是( )
A、C不仅继承了 B中的成员,同样也继承了 A中的成员
B、 C只继承了 B中的成员
C、 C只继承了 A 中的成员
D、C不能继承 A 或 B 中的成员

46、 在 JAVA中,LinkedList类和 ArrayList类同属于集合框架类,下列( D)选项中的方法是 LinkedList类有而 ArrayList类没有的。
A、 add(Object o)
B、 add(int index,Object o)
C、 remove(Object o)
D、 removeLast()

47、在 JAVA中 ArrayList类实现了可变大小的数组, 便于遍历元素和随机访问元素,已知获得了 ArrayList 类的对象 bookTypeList,则下列语句中能够实现判断列表中是否存在字符串 “小说”的是( C )。
A、 bookTypeList.add(“小说”);
B、 bookTypeList.get(“小说”);
C、 bookTypeList.contains(“小说”);
D、 bookTypeList.remove(“小说”);

你可能感兴趣的:(笔试面试题)