算法题
-
单向链表存在环结构,如何快速判断存在环结构
一块一慢两个指针
- 单向链表,存在一个特定的节点,如何快速删除该节点
- 编程题 1,11,21,1211,111221,312211,13112221… 数列规律,后面的数字是对前一个数字的描述,第二个数字11表示1个1,描述的是第一个数字。21表示2个1,1211表示1个2,1个1。
- 字符串逆序
java 基础
-
hashmap的底层实现,如何处理冲突,采用链表存储同一个hash值的元素,对于什么操作会有影响。
底层实现是数组,数组中的对象是Entry类对象。
当存在冲突时,将具有相同hashcode的对象挂载在相同槽内,组成链。采用头插法,新插入对象放在链头,最先加入的对象放在链尾。
hashcode()
indexFor()
put()
get()
addEntry()
loadfactor
loadfactor=元素个数/表长
hash算法
int indexFor(int h, int length){
return h&(length –
1)
}
resize
数组默认大小是16,负载因子默认未0.75
- 为何重写hashcode 和 equals方法
重写equals方法必然重写hashcode方法,这是java规范。
hashcode返回值是一个整数,代表两个对象是否相等。
-
异常种类有哪些
Throwable是所有异常的根,java.lang.Throwable
Error是错误,java.lang.Error
Exception是异常,java.lang.Exception
一般分为Checked异常和Runtime异常,所有RuntimeException类及其子类的实例被称为Runtime异常,不属于该范畴的异常则被称为CheckedException。
- java 排序算法代码实现,复杂度、稳定性
-
浅拷贝 vs 深拷贝
浅拷贝是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象。
深拷贝不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。
若不对clone()方法进行改写,则调用此方法得到的对象即为浅拷贝。
详细解释浅拷贝与深拷贝
当然我们还有一种深拷贝方法,就是将对象串行化。缺点耗时。
- 怎么判断一个对象该被回收
计数法
根搜索法
- hashMap 和 hashtable区别
- hashtable原理
- hashtable是怎么实现线程安全的
- java的代理是怎么实现的
- 抽象类和接口的区别
- 接口和实现类的区别
- java四种引用
- 集合类介绍,各种集合类之间的区别
- 继承和组合区别
- lmbda表达式
- java 8 新特性
-
java基础数据类型
- 整形 byte short int long
- 浮点型 float double
- 逻辑型 boolean
- 字符型 char
- 整形 byte short int long
-
java中的数据存储
- 寄存器:最快的存储区,编译器分配,程序无法控制
- 栈:存放基础数据类型的变量数据
和
对象的引用
- 堆:new出来的对象存放位置
- 静态域:静态成员变量存放位置
- 常量池:字符串变凉&基本数据类型变量 public static final
- 非rRAM存储:硬盘等永久存储空间
- 寄存器:最快的存储区,编译器分配,程序无法控制
数据库
-
数据库
如何在学生成绩表中查询成绩排名第五第学生成绩信息
oracle:
select
*
from(
select
*
from scrore order by score desc
)where rownum =5
mysql : ?
-
数据库索引的数据结构,叶子节点存储什么?非叶子节点存储什么?
http://tech.meituan.com/mysql-index.html
http://blog.codinglabs.org/articles/theory-of-mysql-index.html
-
mysql数据库存储引擎:InnoDB和MyISAM
MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.与其他存储引擎比较,MyISAM具有检查和修复表格的大多数工具. MyISAM表格可以被压缩,而且它们支持全文搜索.它们不是事务安全的,而且也不支持外键。如果事物回滚将造成不完全回滚,不具有原子性。如果执行大量的SELECT,MyISAM是更好的选择。
InnoDB:这种类型是事务安全的.它与BDB类型具有相同的特性,它们还支持外键.InnoDB表格速度很快.具有比BDB还丰富的特性,因此如果需要一个事务安全的存储引擎,建议使用它.如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表, 对于支持事物的InnoDB类型的标,影响速度的主要原因是AUTOCOMMIT默认设置是打开的,而且程序没有显式调用BEGIN 开始事务,导致每插入一条都自动Commit,严重影响了速度。可以在执行sql前调用begin,多条sql形成一个事物(即使autocommit打开也可以),将大大提高性能。
区别:
是否支持外键 innoDB支持
是否需要事务 innoDB支持
是否需要全文搜索 MyISAM支持
经常使用什么样的查询模式(是否带where)
你的数据多大 innoDB
是否使用count(*) MyISAM
主键查询 innoDB
insert MyISAM
update innoDB
- 分布式数据库如何保证一致性
- sql注入原理
- 数据库范式
- 乐观锁 vs 悲观锁
- 数据库锁机制
- 事务隔离机制
- 数据库连接池原理
- 连接池使用什么数据结构实现,
- B+树和二叉树查找时间复杂度
网络
-
get post put detele区别
Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。分别对应查、改、增、删四个操作。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。
get用于信息获取,而且应该是安全的和幂等的。所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,GET 请求一般不应产生副作用。就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。幂等的意味着对同一URL的多个请求应该返回同样的结果。
根据HTTP规范,POST表示可能修改变服务器上的资源的请求。读者对新闻发表自己的评论应该通过POST实现,因为在评论提交后站点的资源已经不同了,或者说资源被修改了。 put、delete操作是幂等的。
post和put区别:
创建操作可以使用POST,也可以使用PUT,区别在于POST 是作用在一个集合资源之上的(/uri),而PUT操作是作用在一个具体资源之上的(/uri/xxx),再通俗点说,如果URL可以在客户端确定,那么就使用PUT,如果是在服务端确定,那么就使用POST,比如说很多资源使用数据库自增主键作为标识信息,而创建的资源的标识信息到底是什么只能由服务端提供,这个时候就必须使用POST。
对资源的增,删,改,查操作,其实都可以通过GET/POST完成,不需要用到PUT和DELETE。
另外一个是,早期的Web MVC框架设计者们并没有有意识地将URL当作抽象的资源来看待和设计,所以导致一个比较严重的问题是传统的Web MVC框架基本上都只支持GET和POST两种HTTP方法,而不支持PUT和DELETE方法。
提交数据:GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,参数之间以&相连。如果是空格,转为为+,如果是中文/其他字符,则直接把字符串用BASE64加密。POST把提交的数据则放置在是html header内一起传送到action属性所指的url地址。
接收数据: 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
请求数据大小: GET是通过url提交数据,get可提交的数据量就跟url长度有关系了。URL不存在参数上限的问题,HTTP协议规范没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。
POST是没有大小限制的,HTTP协议规范也没有进行大小限制,说“POST数据量存在80K/100K的大小限制“是不准确的,POST数据是没有限制的,起限制作用的是服务器的处理程序的处理能力。
- 表单信息传到服务器加密问题 HTTPS 对称加密
非对称加密 tls/ssl rsa
-
session vs cookie
http是无协议的,客户请求第二次到达服务器,服务器如何分辩此用户之前访问过服务器,用户的信息是如何保存的。
cookie是在客户端保存客户的状态。包括(名字,值,过期时间,路径,域)
session是在服务端保持状态。
服务器程序为客户端的请求创建session时,服务器首先检查这个客户端的请求里是否包含sessionID。
如果客户端禁用cookie,使用url重写、表单隐藏字段端方法传递session值。
- dns是基于tcp还是udp的
udp。在数据传输时间很短,以至于此前的连接过程成为整个流量主体的情况下,UDP也是一个好的选择。
- 使用过翻墙工具吗,goagent怎么实现的,shadowsocks怎么实现的
- HTTP HTTPS的区别?前台数据加密传输后台
- html提交如何保证安全
- https如何加密的,怎么做到安全的
-
get提交到字节限制是协议本身限制的吗
http协议本身没有限制get提交字节长度,是url长度的限制。因为get提交到数据要放到url中。
- 计算机网络分层,每层所用协议,协议所占端口
- osi七层模型 vs tcp/ip四层模型,两者之间有什么区别
-
HTTP method
- 一台服务器要与HTTP1.1兼容,只要为资源实现GET和HEAD方法即可
- GET是最常用的方法,通常用于请求服务器发送某个资源。
- HEAD与GET类似,但服务器在响应中值返回首部,不返回实体的主体部分
- PUT让服务器用请求的主体部分来创建一个由所请求的URL命名的新文档,或者,如果那个URL已经存在的话,就用干这个主体替代它。
- POST起初是用来向服务器输入数据的。实际上,通常会用它来支持HTML的表单。表单中填好的数据通常会被送给服务器,然后由服务器将其发送到要去的地方。
- TRACE会在目的服务器端发起一个环回诊断,最后一站的服务器会弹回一个TRACE响应并在响应主体中携带它收到的原始请求报文。TRACE方法主要用于诊断,用于验证请求是否如愿穿过了请求/响应链。
- OPTIONS方法请求web服务器告知其支持的各种功能。可以查询服务器支持哪些方法或者对某些特殊资源支持哪些方法。
- DELETE请求服务器删除请求URL指定的资源。
- 一台服务器要与HTTP1.1兼容,只要为资源实现GET和HEAD方法即可
- TCP 与 UDP的区别
TCP(传输控制协议,Transmission Control Protocol) UDP(用户数据报协议,User Data Protocol) 连接:TCP是面向连接的协议,正式通信前必须要与对方建立连接。UDP面向非连接的协议,正式通信前不必与对方建立连接,不管对方状态就直接发送。
传输可靠性:TCP传输更可靠,保证数据正确性,保证数据顺序。UDP传输不可靠。不能提供可靠性、流控、差错恢复功能。
应用场合:TCP适合一对一传送数据,适合传输大量数据。UDP适合广播数据,适合少量数据,e.g.ping 速度:TCP慢,因为要建立连接。UDP快。
-
TCP三次握手
TCP三次握手的过程如下:
- 客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。
- 服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。
- 客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。
-
TCP四次挥手
- 用进程首先调用close,称该端执行“主动关闭“(active close)。该端的TCP于是发送一个FIN分节,表示数据发送完毕。
- 接收到这个FIN的对端执行 “被动关闭“(passive close),这个FIN由TCP确认。
注意:FIN的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程,放在已排队等候该应用进程接收的任何其他数据之后,因为,FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。
- 一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN。
- 接收这个最终FIN的原发送端TCP(即执行主动关闭的那一端)确认这个FIN。[1]
既然每个方向都需要一个FIN和一个ACK,因此通常需要4个分节。
- 用进程首先调用close,称该端执行“主动关闭“(active close)。该端的TCP于是发送一个FIN分节,表示数据发送完毕。
-
HTTP返回消息代码含义
1xx:信息
2xx:成功
3xx:重定向
4xx:客户端错误
5xx:服务器错误
操作系统
- 与进程的区别:
(1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间。
(2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源。
(3)线程是处理器调度的基本单位,但进程不是。
-
什么是可重入锁 java 递归锁,可重入锁
所谓递归锁,就是在同一线程上该锁是可重入的,对于不同线程则相当于普通的互斥锁。 func A () {
LOCK.lock(); B(); LOCK.unlock(); }
func B() { LOCK.lock(); LOCK.unlock(); } java为每个线程分配一个锁,而不是为每次调用分配一个锁。 java锁的可重入性机制可以解决下面这个问题
可重入的意思是线程可以重复获得它已经持有的锁。
- 对线程安全的理解