Java面试基础复习笔记(计算机网络、数据库部分)

计算机网络知识部分:

1、7层结构

     从上向下:应用层  表示层  会话层  传输层  网络层  数据链路层  物理层

2、TCP和UDP的区别?

  •      基于连接与无连接
  •      TCP要求系统资源较多,UDP较少; 
  •      UDP程序结构较简单 
  •      流模式(TCP)与数据报模式(UDP); 
  •      TCP保证数据正确性,UDP可能丢包 
  •      TCP保证数据顺序,UDP不保证 

3、什么是HTTP协议?
超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。

4、TCP和HTTP的关系?
TCP是传输层,HTTP是应用层。
TCP是底层通讯协议,定义的是数据传输和连接方式的规范
HTTP是应用层协议,定义的是传输数据的内容的规范
HTTP协议中的数据是利用TCP协议传输的,所以支持HTTP也就一定支持TCP     
HTTP是要基于TCP连接基础上的,简单的说,TCP就是单纯建立连接,不涉及任何我们需要请求的实际数据,简单的传输。http是用来收发数据,即实际应用上来的。

5、三次握手是怎样的过程?
第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

两次握手为什么不行:A发送的报文在某些网络节点长时间滞留了,延误到达B,B以为A发出的新请求,于是向A发出确认,同意建立连接,如果只有两次,B确认过后新的连接就建立了,由于A没有发出请求,所以不会发送数据,B在一直等待,会浪费很多资源。

结束时4次握手:
第一步,当主机A的应用程序通知TCP数据已经发送完毕时,TCP向主机B发送一个带有FIN附加标记的报文段(FIN表示英文finish)。
第二步,主机B收到这个FIN报文段之后,并不立即用FIN报文段回复主机A,而是先向主机A发送一个确认序号ACK,同时通知自己相应的应用程序:对方要求关闭连接(先发送ACK的目的是为了防止在这段时间内,对方重传FIN报文段)。
第三步,主机B的应用程序告诉TCP:我要彻底的关闭连接,TCP向主机A送一个FIN报文段。
第四步,主机A收到这个FIN报文段后,向主机B发送一个ACK表示连接彻底释放。

6、TCP如何确认对方收到了消息?
就俩办法,你自己的包里带长度,服务器端首先接收到长度,然后不停的按长度接收,接收满那些长度,则此次发送完毕,或者就是包尾结束符,不停的收,收到结束符则视作此次发送完毕。


数据库部分知识:

1、mysql锁
(1)、表级锁定(table-level)
获取锁和释放锁的速度很快。由于表级锁一次会将整个表锁定,所以可以很好的避免困扰我们的死锁问题。最大负面影响是出现锁定资源争用的概率也会很高,使并发效率不高。
开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
(2)、行级锁定(row-level)
发生锁定资源争用的概率也最小,虽然能够在并发处理能力上面有较大的优势,但是行级锁定也因此带来了不少弊端。由于锁定资源的颗粒度很小,所以每次获取锁和释放锁需要做的事情也更多,带来的消耗自然也就更大了。此外,行级锁定也最容易发生死锁。
开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
(3)、页级锁定(page-level)
开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
适用:从锁的角度来说,表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如Web应用;而行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理(OLTP)系统。

2、索引
索引是对数据库表中一个或多个列的值进行排序的结构。
一般在查询时经常使用的字段添加索引。
索引是用来定位的。
索引的使用:
create index index_name on table_name(column_name) ;
create index idx_a on aaa (a);  //aaa是表名,a是列名
索引一般是在查询时由数据库优化器自动进行判断是否使用,就是说就算你在某个列上创建了索引,当你在查询这个表时数据库也不一定会使用索引,因为有时候需要查询的范围比较大,如全表查询,这时数据库优化器会去判断使用索引和不使用索引哪个效率高,当然是不使用索引效率高啦!所以说一般查询时是不要指定索引的,不过索引还是得创建的!
虽说查询时不推荐指定索引,但还是可以指定的:SELECT * FROM stuMarks(INDEX=IX_writtenExam) WHERE writtenExam BETWEEN 60 AND 9

3、数据库查询优化(看最下面总结)

  • 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
  • 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
  select id from t where num is null
  可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
  select id from t where num=0
  • 应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
  • 应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
  select id from t where num=10 or num=20
  可以这样查询:
  select id from t where num=10
  union all
  select id from t where num=20
  • in 和 not in 也要慎用,否则会导致全表扫描,如:
  select id from t where num in(1,2,3)
  对于连续的数值,能用 between 就不要用 in 了:
  select id from t where num between 1 and 3
  • 下面的查询也将导致全表扫描:
  select id from t where name like '%abc%'
  若要提高效率,可以考虑全文检索。
  • 应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。
  • 应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。

总结:应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

         其次,尽量避免以下情况:

  •                     where子句中对null值进行操作(可以是默认值为0)
  •                     where子句中使用 != 或 <> 或 or (改用union All连接两个子句)
  •                     where子句中对字段进行表达式操作或函数操作
  •                     in 和 not in 的使用
  •                     通配符的使用

你可能感兴趣的:(Java)