目录
修饰符的权限
\转义符,转义再转义
java中有三种移位运算符
javap
构造器(constructor)是否可被重写(override)?
数组有没有length()方法?String有没有length()方法?
Object类的toString()方法
内存溢出和内存泄露
单例模式
11 >> 2,则是将数字11右移2位
final 在 java 中有什么作用?
BIO、NIO、AIO 有什么区别?
并行和并发有什么区别?
守护线程是什么?
Session、Cookie 与 Application
Cookie
Cookie 主要用于以下三个方面:
Cookie类型
修改或者删除Cookie
Cookie的域名
Cookie机制
1、创建Cookie
2、设置存储Cookie
3、发送Cookie
4、读取Cookie
Session
为什么会出现?
Session在何时创建呢?
Session删除的时间是:
同一客户端电脑多次请求同一个资源,session一样吗?
session的运行机制?
cookie与session的关系
解决session相关问题的技术方案
session和cookie的区别
修饰符的权限
\转义符,转义再转义
\\==\
\\\\==\
java中有三种移位运算符
‘<<’ 左移运算符,num << 1,相当于num乘以2
‘>>’ 右移运算符,num >> 1,相当于num除以2
‘>>>’ 无符号右移,忽略符号位,空位都以0补齐
javap
javap 是JDK自带的反汇编器,可以查看java编译器为我们生成的字节码。通过它,我们可以对照源代码和字节码,从而了解很多编译器内部的工作。
在cmd里面用javap可以将class文件转化为字节码指令。
构造器(constructor)是否可被重写(override)?
答:构造器不能被继承,因此不能被重写,但可以被重载
数组有没有length()方法?String有没有length()方法?
答:数组没有length()方法,有length 的属性。String 有length()方法。
Object类的toString()方法
返回的是类名@对象的hashcode。Object类的hashCode()是一个本地方法。
native是在java和其他语言(如c++)进行协作时使用的,也就是native后的函数的实现不是用java写的。
内存溢出和内存泄露
内存泄漏(memory leak):是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。
内存溢出(out of memory):指程序在申请内存时,没有足够的内存空间使用,出现out of memory。
内存溢出时应该:
①根据异常提示信息,判断是哪个区域的内存溢出。JVM的运行时区域都有发生out of memory error异常的可能。
……
引起内存溢出的原因有很多种,常见的有以下几种:
1、内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
2、集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
3、代码中存在死循环或循环产生过多重复的对象实体;
4、使用的第三方软件中的BUG;
5、JVM启动参数内存值设定的过小;
单例模式
单例模式确保某个类只有一个实例。单例模式的特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
单例模式的适用场景是什么样子的?
答:适用场景:(1)需要生成唯一序列的环境;(2)需要频繁实例化然后销毁的对象;(3)创建对象时耗时过多或者耗资源过多,但又经常用到的对象;(4)方便资源相互通信的环境。
为什么要有单例模式?
答:实际应用场景中,有一些对象,我们只需要一个,比如线程池对象、系数据库连接对象、统全局配置对象等。这样可以就保证一个在全局使用的类不被频繁地创建与销毁,节省系统资源。
11 >> 2,则是将数字11右移2位
右移一位相当于除2,右移n位相当于除以2的n次方。
3 << 2,则是将数字3左移2位
对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
final 在 java 中有什么作用?
final 修饰的类叫最终类,该类不能被继承。
final 修饰的方法不能被重写。
final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。
BIO、NIO、AIO 有什么区别?
BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。
并行和并发有什么区别?
并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。
守护线程是什么?
守护线程(即daemon thread),是个服务线程,准确地来说就是服务其他的线程。
Session、Cookie 与 Application
Cookie
Cookie是一小段的文本数据(key-value格式)。Cookie 是服务器生成的,但是发送给客户端,并且由客户端来保存。客户端每次请求加上 Cookie,发给服务器。服务器端发现客户端发送过来的 Cookie 后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。
Cookie 主要用于以下三个方面:
- 会话状态管理(如用户登录状态、购物车、游戏分数、账号密码或其它需要记录的信息)
- 个性化设置(如用户自定义设置、主题等)
- 浏览器行为跟踪(如跟踪分析用户浏览行为,进行广告推荐等)
Cookie类型
按生命周期分:会话cookie和持久cookie。会话cookie是一种临时cookie,用户退出浏览器,会话Cookie就会被删除了,持久cookie则会储存在硬盘里,保留时间更长,关闭浏览器,重启电脑,它依然存在,通常是持久性的cookie会维护某一个用户周期性访问服务器的配置文件或者登录信息。持久性 Cookie的生命周期取决于过期时间(Expires)或有效期(Max-Age)指定的一段时间。如果想让cookie存在一段时间,就要将expires属性设置为未来的一个过期日期。现在已经被max-age属性所取代,max-age用秒来设置cookie的生存期。max-age优先级高。max-age有3种值,分别为正数,负数和0。如果max-age属性为正数,则表示该Cookie会在max-age秒之后自动失效。浏览器会将max-age为正数的Cookie持久化,即写到对应的Cookie文件中。当max-age属性为负数,则表示该Cookie只是一个临时Cookie,不会被持久化,仅在本浏览器窗口或者本窗口打开的子窗口中有效,关闭浏览器后该Cookie立即失效。当max-age为0时,表示立即删除Cookie。
通常cookie的域和浏览器地址的域匹配,这被称为第一方cookie。第三方cookie就是cookie的域和地址栏中的域不匹配,这种cookie通常被用在第三方广告网站。为了跟踪用户的浏览记录,并且根据收集的用户的浏览习惯,给用户推送相关的广告。
修改或者删除Cookie
HttpServletResponse提供的Cookie操作只有一个addCookie(Cookie cookie),所以想要修改Cookie只能使用一个同名的Cookie来覆盖原先的Cookie。如果要删除某个Cookie,则只需要新建一个同名的Cookie,并将maxAge设置为0,并覆盖原来的Cookie即可。新建的Cookie,除了value、maxAge之外的属性,比如name、path、domain都必须与原来的一致才能达到修改或者删除的效果。否则,浏览器将视为两个不同的Cookie不予覆盖。
值得注意的是,从客户端读取Cookie时,包括maxAge在内的其他属性都是不可读的,也不会被提交。浏览器提交Cookie时只会提交name和value属性,maxAge属性只被浏览器用来判断Cookie是否过期,而不能用服务端来判断。
Cookie的域名
Cookie是不可以跨域名的,隐私安全机制禁止网站非法获取其他网站的Cookie。正常情况下,同一个一级域名下的两个二级域名也不能交互使用Cookie,比如test1.mcrwayfun.com和test2.mcrwayfun.com,因为二者的域名不完全相同。如果想要mcrwayfun.com名下的二级域名都可以使用该Cookie,需要设置Cookie的domain参数为.mcrwayfun.com,这样使用test1.mcrwayfun.com和test2.mcrwayfun.com就能访问同一个cookie。
一级域名又称为顶级域名,一般由字符串+后缀组成。熟悉的一级域名有baidu.com,qq.com。com,cn,net等均是常见的后缀。
二级域名是在一级域名下衍生的,比如有个一级域名为mcrfun.com,则blog.mcrfun.com和www.mcrfun.com均是其衍生出来的二级域名。
Cookie机制
当用户第一次浏览某个使用Cookie的网站时,
1、创建Cookie
该网站的服务器为该用户创建一个Cookie对象;默认是会话cookie。如果网站希望浏览器将该Cookie存储在磁盘上,则需要设置最大时效(max-age),并给出一个以秒为单位的时间(将最大时效设为0则是命令浏览器删除该Cookie)。将Cookie加入HttpServletResponse对象, 服务器使用响应头部中的 Set-Cookie 属性向浏览器发送 Cookie信息。
2、设置存储Cookie
浏览器收到该响应报文之后,根据报文头里的Set-Cookie,生成相应的Cookie,保存在客户端。该Cookie里面记录着用户当前的信息。
3、发送Cookie
当用户再次访问该网站时,浏览器首先检查所有存储的Cookies,将之前保存的Cookie信息通过 Cookie 请求头部再发送给服务器。
4、读取Cookie
服务器接收到用户的HTTP请求报文之后,从报文头获取到该用户的Cookie,从里面找到所需要的东西。
Session
为什么会出现?
因为HTTP是无状态的,什么是无状态呢?就是说这一次请求和上一次请求是没有任何关系的,互不认识的,没有关联的。但是这种无状态的的好处是快速。HTTP无状态会带来一些问题:详细内容见其他章节。为了解决这些问题,出现了一种客户端存储数据的方式:cookie。但是由于cookie 是存在客户端,它本身存储的大小有限,最关键的是用户可以是可见的,并可以随意的修改,很不安全。那如何又要安全,又可以方便地全局读取信息呢?于是,这个时候,一种新的存储会话机制:session 诞生了。session是解决http协议无状态问题的服务端解决方案。
session存放在哪里:服务器端的内存中。不过session可以通过特殊的方式做持久化管理。
Session在何时创建呢?
是在服务器端程序运行的过程中创建的,不同语言实现的应用程序有不同创建Session的方法,而在Java中是通过调用HttpServletRequest的getSession方法(使用true作为参数)创建的。
session第一次产生是在直到某server端程序调用 HttpServletRequest.getSession(true)这样的语句时才被创建。
Session删除的时间是:
1)Session超时:超时指的是连续一定时间服务器没有收到该Session所对应客户端的请求,并且这个时间超过了服务器设置的Session的过期时间。
2)程序调用HttpSession.invalidate()。
3)服务器关闭或服务器卸载了当前Web应用。
Session不会因为浏览器的关闭而删除,session只会通过上面提到的方式去关闭。
同一客户端电脑多次请求同一个资源,session一样吗?
对于多标签的浏览器(比如360浏览器)来说,在一个浏览器窗口中,多个标签同时访问一个页面,session是一个。对于多个浏览器窗口之间,同时或者相隔很短时间访问一个页面,session是多个的,和浏览器的进程有关。对于一个同一个浏览器窗口,直接录入url访问同一应用的不同资源,session是一样的。
session因为请求(request对象)而产生,同一个会话中多个request共享了一个session对象。session的创建和使用总在服务端,而浏览器从来都没得到过session对象。但浏览器可以请求Servlet来获取session的信息。
session的运行机制?
当客户端第一次访问服务器的时候,如果服务器启用了session,就会先检查请求报头有没有JSESSIONID(如果是PHP的话,是PHPSESSIONID)。如果没有sessionid,服务器就会为这个客户端新建一个session对象,为该Session生成唯一的Session id。Session被创建后,服务端就可以调用session的相关方法往session中增加内容。这些内容只会保存在服务器中,发到客户端的只有Session id。服务器会将sessionid放到响应头的Set-Cookie中,以key-value的形式返回给客户端。当客户端再次发送请求的时候,会将这个Session id自动添加到请求头上,服务器接受到请求之后就会依据Session id找到之前创建的session对象,进行相应的处理。
cookie与session的关系
cookie和session的方案虽然分别属于客户端和服务端,但是服务端的session的实现对客户端的cookie有依赖关系的,上面我讲到服务端执行session机制时候会生成session的id值,这个id值会发送给客户端,客户端每次请求都会把这个id值放到http请求的头部发送给服务端,而这个id值在客户端会保存下来,保存的容器就是cookie,因此当我们完全禁掉浏览器的cookie的时候,服务端的session也会不能正常使用。
解决session相关问题的技术方案
session一共有两个问题需要解决:
1) session的存储应该独立于web容器,也要独立于部署web容器的服务器;
2)如何进行高效的session同步。
session如何存储才是高效,是存在内存、文件还是数据库了?文件和数据库的存储方式都是将session的数据固化到硬盘上,操作硬盘的方式就是IO,IO操作的效率是远远低于操作内存的数据,因此文件和数据库存储方式是不可取的,所以将session数据存储到内存是最佳的选择。因此最好的解决方案就是使用分布式缓存技术,例如:memcached和redis,将session信息的存储独立出来也是解决session同步问题的方法。
Tomcat的session同步也有使用memcache的解决方案,大家可以参加下面的文章: http://blog.sina.com.cn/s/blog_5376c71901017bqx.html
但是该方案只是解决了同步问题,session机制任然和web容器紧耦合,我们需要一个高效、可扩展的解决方案,那么我们就应该不是简单的把session独立出来存储而是设计一个完全独立的session机制,它既能给每个web应用提供session的功能又可以实现session同步,下面是一篇用zookeeper实现的分布式session方案:
http://www.open-open.com/lib/view/open1378556537303.html
session的3种实现方式(也就是传递方式):第一种通过cookie实现。第二种通过URL重写来实现。第三种方式:表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。第一种方式:将sessionid放在cookie中。第二种方式:通过response.encodeURL()方法,在URL后面加入sessionID。
session和cookie的区别
1、cookie的数据信息存放在客户端浏览器上。session的数据信息存放在服务器上。
2、存储容量不同。单个cookie保存的数据<=4KB,一个站点最多保存20个Cookie。对于session来说并没有上限,但出于对服务器端的性能考虑,session内不要存放过多的东西,并且设置session删除机制。
3、存放数据不同。cookie中只能保管ASCII字符串。Session中能够存取任何类型的数据,包括而不限于String、Integer、List、Map等。
4、安全性不同。cookie对客户端是可见的,别人可以分析存放在本地的cookie并进行cookie欺骗,所以它是不安全的。考虑到安全性,应当使用session。Session存储在服务器上,对客户端是透明的。session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE。
5、对服务器造成的压力不同
Session是保管在服务器端的,每个用户都会产生一个Session。假如并发访问的用户十分多,会产生十分多的Session,耗费大量的内存。而Cookie保管在客户端,不占用服务器资源。假如并发阅读的用户十分多,Cookie是很好的选择。
6、 跨域支持上的不同
Cookie支持跨域名访问,例如将domain属性设置为“.baidu.com”,则以“.baidu.com”为后缀的一切域名均能够访问该Cookie。跨域名Cookie如今被普遍用在网络中。而Session则不会支持跨域名访问。Session仅在他所在的域名内有效。