面试重点汇总

Hashcode()

1.hashcode值从何来:
通过hash函数/算法求得hash值,该值在hash表中的位置就是hashcode;
2.hashcode的用途
hashcode主要为了查找的快捷性,hashcode是用来确定散列存储结构中对象的地址;
3.hashcode与equals
两点:(1)equlas相等,hashcode必定相同;(2)hashcode相同,两个对象不一定相同,只能说明两个对象在散列表中存储的位置相同;
4.为什么重写equlas方法,也建议重写hashcode方法
只重写equlas方法,不能保证equlas相等时,hashcode相等;
5.当对象为String时equlas与“==”的区别
equlas比较的是字符串内容,==比较是否为同一个对象;

Hashmap

1.数据结构
基于数组和链表实现,“链表散列"结构,底层是数组,数组每一项又是一个链表或者红黑树;存储内容是key-value的映射,可以接受null值;
2.哈希冲突
当存储的数据变多时,就会发生哈希冲突(hash位置相同)。
如何解决哈希冲突?
Java中是通过开散列的方式解决哈希冲突,即"链表散列”,当发生冲突时会将该元素放到链表中(链表的长度为常数,实际查询时间复杂度为O(1)性能较高)。当链表元素超过8时,就需要引进红黑树,此时红黑树的查询效率高于链表(不使用二叉树是因为在特定条件下查询效率和链表一样,而红黑树可以通过左旋右旋和变色保持平衡);
3.加载因子
也成负载因子,数据量与存储容量之间的比值,Java中当负载因子超过7.5时,就会扩容resize;
4.hashMap中hash的算法
hashcode值高16位异获低16位的值;
5.hashmap、hashTable、ConcurrentHashmap
hashmap没有用到synchronize,不是线程安全,单线程效率高;
hashTable使用synchronize,锁住整张hash表来保证线程安全,并发效率低;
ConcurrentHashmap使用分段锁(默认将hash表分为16个桶,锁住一个桶是其他桶仍可访问,并发效率提升显而易见),线程安全,效率高(默认提升16倍);
6.map与set
map接口下有hashmap和treemap类,set下有hashset,不同点在于hashmap是key-value键值对存储,hashset是以key值存储,treemap也是以键值对存储但是以key值来排序存储。

集合框架

1.stack继承vector;
2.set与map上文已述;
3.Linklist基于链表,Arraylist基于数组;
4.prorityQueue优先级队列,不能以null作为值(因为要用equals吧)基于大跟堆小跟堆的实现,默认是最小堆;

网络

五层
物理层(设备间的物理连接,发送原始的bit流),数据链路层(通过数据报,即帧保证物理上的可靠传输),网络层(通过网络状况装包来寻找数据传输的最佳路径),传输层(通过TCP可靠传输,UDP不可靠传输,确定发送端和接收端),应用层(处理发送数据和接受数据);
TCP与UDP的区别
1.TCP是面向连接的,UDP是无连接的;
2.TCP是面向字节流的,通过滑动窗口控制发送和接受的数据量,UDP是面向数据报的,UDP没有拥塞控制和流量控制;
3.TCP是可靠传输的,保证数据到达。UDP是不可靠传输,不会因网络拥挤而降低传输速率,因此会丢失数据,但是比较适用某些场景,比如实时通话,视频等。
4.TCP的首部长,UDP首部短,因此TCP比UDP更耗资源;
5.TCP只能一对一传输数据;UDP可以一对一,一对多,多对多,多对一;
TCP的可靠性
1.什么是可靠性:
处理数据是否到达;
数据不出错(UDP也可保证);
数据有序;
不重复;
可以流量控制;
数据包大小可控;
2.如何保证:和上方一一对应
序列号-确认应答-超时重传(发送缓冲区保证超时重传的数据储存)
效验和
序列号(接受缓冲区用来存储暂时未处理的信息)
序列号
滑动窗口/流量控制/拥塞控制
mss:确定最大发送数据量
滑动窗口
主要包括:
1.最大可连续发送数据量
2.对方确认应答
3.数据段
互之间的作用是:
通过对方可接受的最大数据量,可以确定不用等待对方ACK发送多少数据,被确认应答的数据会在发送缓冲区被刷新掉;
窗口越大,网络吞吐率越高(单次传输数据量);
延迟应答
收到数据时,暂时不确认应答,等待上200ms后再应答;
原因:延迟应答后接收的数据量变多,即ACK较大,此时确认应答,窗口变大,网络吞吐率高;
捎带应答
发送其他数据时可以捎带上ACK;
粘包问题
原因:接受的数据是有序排列起来的字节流数据,并不知道某段数据的开始和结束位置;
解决方法:
1.数据按照固定包大小发送和接收,拆分数据也按照固定包大小拆;
2.在包头部声明数据的长度即开始和结束位置;(Content-Length)
3.用特定分隔符来分割数据;(空行/r/n)
面向字节流
创建一个sockt同时在内核中创建了发送缓冲区和接受缓冲区,进行read读和write写;
同时有发送缓冲区和接受缓冲区的也称为全双工
连接管理
1.why:需要沟通序列号等信息;2.生命周期建立连接,发送数据,关闭连接;3.作用:需要沟通序列号,窗口大小等;
三次挥手
A发送syn,B收到并回复ACK,A收到并回复ACK;
必须是三次的原因:
1.第一次:服务端确定客户端的发送数据能力;
2.第二次:客户端确定服务端端的接受能力和发送能力;
3.第三次:服务端确定客户端的接收数据能力;
四次挥手
主动关闭:
一次挥手:A发送FIN包进入FIN_WAIT_1状态,
二次挥手:B收到后回ACK,A收到ACK进入FIN_WAIT_2,
三次挥手:B发送FIN包,A收到B发的FIN包,
三次挥手:发送响应ACK进入TIME_WAIT状态;
同时关闭:同时发FIN并且收到对方的FIN包回ACK,收到ACK进入TIME_WAIT状态;
被动关闭:收FIN,发ACK进入CLOSE_WAIT状态,发送FIN并关闭程序,进入LAST_ACK状态等待最后的响应ACK;
IP和MAC
MAC从物理层和数据链路层确定某一台电脑,主要解决在局域网内确定一台机器,IP从传输层解决端到端的问题。
五元组
源IP地址+源端口号+目的IP地址+目的端口号+协议;
(例192.1.1.1 +1234+121.1.1.1+80+TCP)
DNS
域名解析系统,相当于一个巨大的电话本,当你访问一个网站的时候,需要DNS解析域名为Ip地址,如果本地hosts文件有该域名的映射关系,则完成解析,如果没有就问上一级域,以此类推访问到根DNS系统,它能查询到所有的域名是属于哪一个顶级ip的,然后反馈给你,如果该顶级IP也无法解析,则询问下一级依次类推直到找到该域名的主机;
HTTP
超文本传输协议,作用于应用层,基于TCP的可靠性的,它是一种无状态的协议,即不保存访问信息的,但是当登录购物等需要等需要登陆的网站时,需要保存登录信息,这使就引进了cookies和session了,cookies用于本地保存登录信息,session主要用于服务端查询并确定客户端的信息,HTTP的请求格式:1.请求行(包含请求方法(get/post),URL(唯一资源标识),请求协议版本(HTTP/1.0))。2,请求头,包含接受的响应类型,写入服务器的cookies信息,host端口号等。3,请求体,get方法没有消息体,post方法将数据放在消息体中。然后会收到响应头(协议版本,状态码,状态信息),响应头(内容格式,编码类型,字节数等),响应体(主要以key=value形式显示,之间用&号连接)
cookies和session的区别
cookies用于客户端的,session用于服务器的;cookies可以设置保存时间,可以是永久保存的,session的存活周期短,一般是浏览器开启,关闭;服务器会处理来自客户端的cookies信息,并将其解析为可以识别的字段,查询该字段的session信息。cookies主要作用是保存客户端的登录信息,session只要是用来保持会话的;
状态码
200:成功
302:页面跳转
304:页面内容未改变
400:请求信息有误
401:需要验证用户
403:服务器收到信息,但拒绝提供此服务
404:资源不存在
408:请求超时
500:服务器出现不可预期错误
503:服务器当前不能处理请求,请稍后重试
http和https的区别
1.http在应用层;https在传输层;
2.http无加密,是不安全的;https采用SSL加密,安全的;
3.http耗资源少;https由于要进行加密等操作,耗费资源多;
4.http为80端口;https为443;
get和post的区别
1.get主要用于请求服务器返回信息;post主要用于向服务发送写入的信息;当然get也可用于写入信息,但是向服务器发送私密信息,如登录账号密码的时候用get是不安全的,因为他会被浏览器储存下来,而post不会;
2.get能被收藏为书签;post不行;
3.get能被缓存;post不行;
4.get将信息写在url中且有长度限制,而post将消息写在请求体中,无长度限制;
5.编码类型不同;
6.get不需要考虑幂等性;post需要考虑幂等性(多次提交,结果正确,当多次请求时,若操作重复,服务器捕获重复异常,并不作处理);

未完待续…敬请期待

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值