1.session和cookie的区别
(1)cookie存放在客户端的浏览器上,session则存放在服务器中
(2)Cookie是不安全的,别人可以通过分析本地的cookie进行cookie欺骗,考虑安全性的话应使用session
(3)Session保存在服务器上的时间是有限制的,当服务器的session较多时,会给服务器造成很大压力,考虑减轻服务器压力可以使用cookie
(4)Cookie保存在客户端浏览器中的大小有限制的,单个cookie不能大小不能超过4K,一般浏览器存放的cookie的个数不超过20个
(5)保存用户登录信息可以使用session比较安全,不考虑安全性可以使用cookie
2.get、post区别
(1)get参数通过url传递,post放在request body中。
(2)get请求在url中传递的参数是有长度限制的,而post没有。
(3)get比post更不安全,因为参数直接暴露在url中,所以不能用来传递敏感信息。
(4)get请求只能进行url编码,而post支持多种编码方式
(5)get请求会浏览器主动cache,而post支持多种编码方式。
(6)get请求参数会被完整保留在浏览历史记录里,而post中的参数不会被保留。
(7)GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
(8)GET产生一个TCP数据包;POST产生两个TCP数据包。
长的说:
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
3.常见的http状态码
当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。
HTTP状态码的英文为HTTP Status Code。
下面是常见的HTTP状态码:
200 - 请求成功
301 - 资源(网页等)被永久转移到其它URL
404 - 请求的资源(网页等)不存在
500 - 内部服务器错误
HTTP状态码分类
HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。HTTP状态码共分为5种类型:
HTTP状态码分类
分类 分类描述
1** 信息,服务器收到请求,需要请求者继续执行操作
2** 成功,操作被成功接收并处理
3** 重定向,需要进一步的操作以完成请求
4** 客户端错误,请求包含语法错误或无法完成请求
5** 服务器错误,服务器在处理请求的过程中发生了错误
HTTP状态码列表:
HTTP状态码列表
状态码 状态码英文名称 中文描述
100 Continue 继续。客户端应继续其请求
101 Switching Protocols 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议
200 OK 请求成功。一般用于GET与POST请求
201 Created 已创建。成功请求并创建了新的资源
202 Accepted 已接受。已经接受请求,但未处理完成
203 Non-Authoritative Information 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本
204 No Content 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档
205 Reset Content 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域
206 Partial Content 部分内容。服务器成功处理了部分GET请求
300 Multiple Choices 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择
301 Moved Permanently 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
302 Found 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
303 See Other 查看其它地址。与301类似。使用GET和POST请求查看
304 Not Modified 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
305 Use Proxy 使用代理。所请求的资源必须通过代理访问
306 Unused 已经被废弃的HTTP状态码
307 Temporary Redirect 临时重定向。与302类似。使用GET请求重定向
400 Bad Request 客户端请求的语法错误,服务器无法理解
401 Unauthorized 请求要求用户的身份认证
402 Payment Required 保留,将来使用
403 Forbidden 服务器理解请求客户端的请求,但是拒绝执行此请求
404 Not Found 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置”您所请求的资源无法找到”的个性页面
405 Method Not Allowed 客户端请求中的方法被禁止
406 Not Acceptable 服务器无法根据客户端请求的内容特性完成请求
407 Proxy Authentication Required 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权
408 Request Time-out 服务器等待客户端发送的请求时间过长,超时
409 Conflict 服务器完成客户端的PUT请求是可能返回此代码,服务器处理请求时发生了冲突
410 Gone 客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置
411 Length Required 服务器无法处理客户端发送的不带Content-Length的请求信息
412 Precondition Failed 客户端请求信息的先决条件错误
413 Request Entity Too Large 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息
414 Request-URI Too Large 请求的URI过长(URI通常为网址),服务器无法处理
415 Unsupported Media Type 服务器无法处理请求附带的媒体格式
416 Requested range not satisfiable 客户端请求的范围无效
417 Expectation Failed 服务器无法满足Expect的请求头信息
500 Internal Server Error 服务器内部错误,无法完成请求
501 Not Implemented 服务器不支持请求的功能,无法完成请求
502 Bad Gateway 充当网关或代理的服务器,从远端服务器接收到了一个无效的请求
503 Service Unavailable 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中
504 Gateway Time-out 充当网关或代理的服务器,未及时从远端服务器获取请求
505 HTTP Version not supported 服务器不支持请求的HTTP协议的版本,无法完成处理
4重写和重载的区别
重写和重载都是实现多态的两种方式,重写指的是运行时的多态(动态绑定),而重载指的是编译(静态绑定)时的多态。
(1)重载的指的是同一个类中,具有相同方法名的参数列表(参数类型、参数个数、参数顺序)不同那么就称方法时重载的,其中重载与被重载方法的返回值可以相同,也可以不相同。而重写指的是父类与子类之间有继承关系,子类的方法与父类方法具有相同的方法名、参数列表、返回值必须相同,只是方法执行的行为不同。
(2)子类中的方法不能重写父类被private修饰的方法,也不能重写被final修饰的方法,而重载只要是在相同类中具有相同方法名但参数列表不同就可以重载。
(3)重写时子类方法的修饰符不能比父类方法的修饰符的范围窄,即如果父类方法修饰符是public那么子类重写的方法必须最少为public;重载时重载方法和被重载方法的修饰符不做限制。
(4)重写时子类方法不能抛出比父类方法新的类型的异常或者范围更广的异常,例如父类方法抛出IOException那么子类重写的方法不能抛出Exception,只能抛出IOException或者IOException的子类异常,而重载方法可以抛出比被重载方法具有更多更广的异常。
(5)在子类中如果想原封不动的调用父类方法可以使用super关键字来完成
5怎样理解面向对象
面向对象其实指的是想象类的实例,因为类是由多个具有相同属性和行为特征的对象抽取出来的,而类的实例指的就是对象,所以说面向对象其实就是面向类的实例。
类具有3个重要特性:封装、继承、多态
(1)封装:指的是将多个方法和属性封装起来形成一个类,对于属性一般私有,对于方法该私有的私有该公开的公开,对外隐藏实现细节,使代码模块化,同时通过不同的修饰符将对象的数据保护起来只允许指定的对象访问,对对象内部提供不同级别的保护,防止程序无关的部分对对象的内部数据进行串改。
(2)继承:指的是创建新类的一种方式,被继承的类被称为父类或者超类,继承的类指的是子类或基类,对于子类可以调用父类中被非private修饰的方法和属性,继承的过程对应着类的从一般到具体的过程,子类中可以服用父类非private修饰的方法和属性,也可以自己定义新的方法或重写父类的方法丰富自己的类,让自己的类更具体。
继承一般有两种方式:实现继承和接口继承,方法继承一般就是直接复用父类的属性和方法,接口继承指的是实现接口中定义的方法和属性的名称。
(3)多态:指的是父类对象在不同的子类对象下具有不同的表现形式(设计模式的模板模式),父类引用指向子类对象,多态有两种表现形式:重载和重写。
6静态和非静态方法的锁(synchronized)
对于类中的非静态方法加锁(synchronized),作用的是调用该方法的对象,锁指的是当前调用这个方法的对象(this),即为对象锁。
情况1:同一个类中如果有2个方法同时被synchronized修饰,如果有同样的对象调用这两个方法那么是互斥的吗,因为这时非静态方法的锁只有一个即为调用这个方法的对象,相当于有多个房间但只要一把钥匙,一把钥匙只能打开一个房间一样。只有等这个对象执行完成后释放锁,其它线程去获取这把锁才能执行。
情况2:不同的对象在两个线程中访问两个非静态同步方法,这样是不会参数互斥的,因为非静态方法的锁是调用该方法的对象,而对象有多个就说明有多把锁。
对于静态方法加锁,作用对象为这个类的所有对象,锁为当前类的字节码对象,人和时候都只有一把锁,如果多个对象想访问这个静态同步方法会产生互斥,因为锁只有一把。其它线程只能等当前线程执行完释放锁再去获取到锁后才能执行。
7 get和post的区别
首先get和post都是基于http协议的请求方式,本质上是基于tcp协议的,因为http协议本质上是基于tcp协议传输的。那么get、post主要区别如下:
(1)get的传输参数放在URL中,而post的参数放在request body中
(2)因为get请求时参数放在URL对外都是可见的,所以get请求没有post请求安全
(3)Get请求的URL有长度的限制一般为2k,而post请求没有长度的限制
(4)对于get请求的参数类型只能为ASCCII字符,而post可以有更多的参数类型
(5)Get请求只能进行URL编码,而post可以有更多的编码方式
(6)Get请求的参数会完整的保存在浏览器的历史记录里,而post不会保存在浏览器的历史记录里。
(7)Get请求一次发送一个tcp数据包,而post需要连续发送2个tcp数据包,即get请求时会先把http header和data一次发送到服务器,服务器直接响应200,而post请求时浏览器会先发送header,服务器先响应100 continue,然后浏览器会再一次发送data到服务器,这时服务器会响应200.。
8堆得区间划分
上图中,刻画了Java程序运行时的堆空间,可以简述成如下2条
1..JVM中堆空间可以分成三个大区:新生代、老年代、永久代(方法区,存放加载的类的信息、静态方法、常量池,gc时主要是进行常量池的回收和类型卸载)
2.新生代可以划分为三个区,Eden区,两个survivor幸存区
在JVM运行时,可以通过配置以下参数改变整个JVM堆的配置比例
1.JVM运行时堆的大小
-Xms堆的最小值
-Xmx堆空间的最大值
2.新生代堆空间大小调整
-XX:NewSize新生代的最小值
-XX:MaxNewSize新生代的最大值
-XX:NewRatio设置新生代与老年代在堆空间的大小
-XX:SurvivorRatio新生代中Eden所占区域的大小
3.永久代大小调整
-XX:MaxPermSize
4.其他
-XX:MaxTenuringThreshold,设置将新生代对象转到老年代时需要经过多少次垃圾回收
9为什么新生代空间要划分为三个区Eden及两个Survivor区?*
复制算法:
(1)将内存分为大小相等的1:1的两块A、B,在内存A中新建对象,当A中内存满时,将A中还存活的对象复制到内存B中
(2)将A中对象清除
(3)将新建对象放在内存B中,当B中内存满时将B中还存活的对象复制到A中。
(4)将B中的死亡的对象清除
(5)重复(1)-(4)
优点:垃圾回收效率高,解决了标记-清理算法垃圾回收时产生垃圾碎片的问题,可以为占用较大内存对象分配较大的内存空间。
缺点:有效内存只占用了总内存的一般空间,空间利用率低
解决方法:
IBM公司认为可以把内存分为1个Eden区和2个survivor存活区,比例为8:1:1,即这样就把内存利用率提高到了90%,同时这样还有一个好处就是可以计算出在新生代对象被MionorGC的次数,这样能更好的把存活较长的对象移动到另外一个survivor区中,当到达我们设定的GC次数时就会把依然存活的对象移动到老年代中。
此时新生代划分为1个Eden(占总内存得80%)和两个大小等的survivor分别为s1,s2(各占总内存得10%),此时复制算法过程:
(1)在Eden和s0中分配对象内存
(2)将还存活的对象移动到s2中,并把Eden和S0中的对象清除,这是一次MoniorGC
(3)在Eden和S1中分配内存
(4)把Eden和S1中还存活的对象复制到S0中,并把Eden和S1中的对象清除,对应第二次MoniorGC
(5)重复(1)-(4)