1.hashcode
hashcode是通过hash函数放回的一个int值,在对象的equals是,必须重写hashcode。因为对象的hashcode就类似一个MD5的加密值,只要这个值相等,对象肯定相等,而不用通过equal比较(equals比较就是一个属性一个属性的比对,效率太低,而hashcode就是计算的一个散列,一步就可以比较)。但是前提是生成hashcode的hash函数要没有冲突,所以,一般情况下,重新equals,为了更好生成对应唯一的hashcode,重写hashcode方法。
2.char基于uncode字符编码的,占2个字节,而一个汉字就可以用一个char表示。其次,string是不可变得,string对应一个常量池。
3.阻塞操作
socket.accept,inputstrum.read,futre.get等,因为这些方法都要求有放回值,如果没有放回,程序就阻塞,不能继续执行。
而NIO处理的机制就是通过轮询机制,以及事件监听机制,达到channel的复用,也就是说selector可以监听多个channel,那个里面有数据,那个就执行。
NIO优势的基础是buffer,编程接口bufferFull()轮询监听buffer是否已满,此方法不阻塞,而reader.readLine()是阻塞的,其次NIO单线程处理多个connection,而IO是多个
线程处理多个connection,因为线程多,耗费的资源就多。
NIO可让您只使用一个(或几个)单线程管理多个通道(网络连接或文件),但付出的代价是解析数据可能会比从一个阻塞流中读取数据更复杂。
如果需要管理同时打开的成千上万个连接,这些连接每次只是发送少量的数据,例如聊天服务器,实现NIO的服务器可能是一个优势。同样,如果你需要维持许多打开的连接到其他计算机上,如P2P网络中,使用一个单独的线程来管理你所有出站连接,可能是一个优势。一个线程多个连接的设计方案如
如果你有少量的连接使用非常高的带宽,一次发送大量的数据,也许典型的IO服务器实现可能非常契合。下图说明了一个典型的IO服务器设计:
NIO就是单线程处理多个channel,减少线程切换,提高效率,一般如果并发量大并且通信数据量小,则可以使用NIO,否则我们可以基于BIO,自己创建线程处理请求。
参看:http://www.jb51.net/article/50621.htm
3.缓存机制的原理是什么?
在开发中,我们基本都会使用缓存,本质就是将处理对象缓存在内存中,减少服务器的压力(比如2次一样的sql查询等),但是缓存管理的难点在于缓存的大小是固定的,那么
如何换入换出,基本的算法就是FIFO等。常见的缓存有分布式缓存以及单机缓存。而各个缓存的实现高效在于缓存空间的管理以及内存分配。
所以,涉及到内存或者磁盘的分配以及管理,基本都大同小易,比如oracle数据的磁盘与内存管理,但是基于的原理都是把磁盘内存空间对应成数据结构进行管理,此处了解不是很深刻,暂时记录一下。
4.SQL的执行计划
对于sql写完之后,基本就是优化,而优化的前提就是了解执行计划,执行计划就是sql转换成函数调用,其实RDBMS的SQL的执行计划就类似Hive的转换成MapReduce一样,下面说一下表链接的执行计划
NESTED LOOPS 对应exists
HASH JOIN 对应join/in
MERGE JOIN
5.Tomcat的内存设置
第一:对于tomcat来说,设置内存就是设置jvm的内存,因为tomcat基于java开发,java运行在jvm虚拟机里面,而jvm类似计算机,他也有自己的内存区域,比如存放对象的堆内存,方法区(metadata数据),栈区(临时变量),所以在部署web app的过程中,存在堆内存设置(xms/xmx)以及方法区内存(pem)以及栈区的设置。注意堆内存的设置原则是物理内存的1/4-1/64之间,具体设置多少与场景有关。
第二:对于tomcat来说,有connector(8080,8009)两个连接器,一个Engine,多个虚拟的Host,每个host下面可以部署一个webapp,各自一个context。其次就是对于tomcat的并发设置,最大并发线程,最小线程,空闲线程数量的设置,基本tomcat都有默认值。
第三:设置tomcat的URL编码格式,URIEncoding .
6.java线程池的原理:
线程池的目的类似于生产者-消费者的模式,用户的请求就是生产者,存储在队列里面,而线程池就是消费者,通过notify来执行task。
volatile 在线程开发场景里面可以保证数据一致性,不需要并发控制,基于的它的原子变量的非阻塞CAS轮询算法