1 、a.hashCode() 有什么用?与 a.equals(b) 有什么关系?java
hashCode() 方法对应对象整型的 hash 值。它经常使用于基于 hash 的集合类,如 Hashtable、HashMap、LinkedHashMap等等。它与 equals() 方法关系特别紧密。根据 Java 规范,两个使用 equal() 方法来判断相等的对象,必须具备相同的 hash code。c++
2 、字节流与字符流的区别程序员
要把一段二进制数据数据逐一输出到某个设备中,或者从某个设备中逐一读取一段二进制数据,无论输入输出设备是什么,咱们要用统一的方式来完成这些操做,用一种抽象的方式进行描述,这个抽象描述方式起名为IO流,对应的抽象类为OutputStream和InputStream,不一样的实现类就表明不一样的输入和输出设备,它们都是针对字节进行操做的。web
计算机中的一切最终都是二进制的字节形式存在。对于常常用到的中文字符,首先要获得其对应的字节,而后将字节写入到输出流。读取时,首先读到的是字节,但是咱们要把它显示为字符,咱们须要将字节转换成字符。因为这样的需求很普遍,Java专门提供了字符流包装类。sql
底层设备永远只接受字节数据,有时候要写字符串到底层设备,须要将字符串转成字节再进行写入。字符流是字节流的包装,字符流则是直接接受字符串,它内部将串转成字节,再写入底层设备,这为咱们向IO设备写入或读取字符串提供了一点点方便。数据库
字符向字节转换时,要注意编码的问题,由于字符串转成字节数组,实际上是转成该字符的某种编码的字节形式,读取也是反之的道理。编程
3 、什么是java序列化,如何实现java序列化?或者请解释Serializable接口的做用。设计模式
咱们有时候将一个java对象变成字节流的形式传出去或者从一个字节流中恢复成一个java对象,例如,要将java对象存储到硬盘或者传送给网络上的其余计算机,这个过程咱们能够本身写代码去把一个java对象变成某个格式的字节流再传输。数组
可是,jre自己就提供了这种支持,咱们能够调用OutputStream的writeObject方法来作,若是要让java帮咱们作,要被传输的对象必须实现serializable接口,这样,javac编译时就会进行特殊处理,编译的类才能够被writeObject方法操做,这就是所谓的序列化。须要被序列化的类必须实现Serializable接口,该接口是一个mini接口,其中没有须要实现方法,implements Serializable只是为了标注该对象是可被序列化的。浏览器
例如,在web开发中,若是对象被保存在了Session中,tomcat在重启时要把Session对象序列化到硬盘,这个对象就必须实现Serializable接口。若是对象要通过分布式系统进行网络传输,被传输的对象就必须实现Serializable接口。
4 、描述一下JVM加载class文件的原理机制?
JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。
5 、heap和stack有什么区别。
java的内存分为两类,一类是栈内存,一类是堆内存。栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个栈中的变量也将随之释放。
堆是与栈做用不一样的内存,通常用于存放不在当前方法栈中的那些数据,例如,使用new建立的对象都放在堆里,因此,它不会随方法的结束而消失。方法中的局部变量使用final修饰后,放在堆中,而不是栈中。
6 、GC是什么?为何要有GC?
GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会致使程序或系统的不稳定甚至崩溃,Java提供的GC功能能够自动监测对象是否超过做用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操做方法。
7 、垃圾回收的优势和原理。并考虑2种回收机制。
Java语言中一个显著的特色就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候再也不须要考虑内存管理。因为垃圾回收机制,Java中的对象再也不有"做用域"的概念,只有对象的引用才有"做用域"。
垃圾回收能够有效的防止内存泄露,有效的使用可使用的内存。垃圾回收器一般是做为一个单独的低级别的线程运行,不可预知的状况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或全部对象进行垃圾回收。
回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。
8 、垃圾回收器的基本原理是什么?垃圾回收器能够立刻回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
对于GC来讲,当程序员建立对象时,GC就开始监控这个对象的地址、大小以及使用状况。一般,GC采用有向图的方式记录和管理堆(heap)中的全部对象。经过这种方式肯定哪些对象是"可达的",哪些对象是"不可达的"。当GC肯定一些对象为"不可达"时,GC就有责任回收这些内存空间。
程序员能够手动执行System.gc(),通知GC运行,可是Java语言规范并不保证GC必定会执行。
9 、Java 中,throw 和 throws 有什么区别
throw 用于抛出 java.lang.Throwable 类的一个实例化对象,意思是说你能够经过关键字 throw 抛出一个Exception,如:
throw new IllegalArgumentException(“XXXXXXXXX″)
而throws 的做用是做为方法声明和签名的一部分,方法被抛出相应的异常以便调用者能处理。Java 中,任何未处理的受检查异常强制在 throws 子句中声明。
10 ,java中会存在内存泄漏吗,请简单描述。
先解释什么是内存泄漏:所谓内存泄露就是指一个再也不被程序使用的对象或变量一直被占据在内存中。java中有垃圾回收机制,它能够保证当对象再也不被引用的时候,对象将自动被垃圾回收器从内存中清除掉。
因为Java使用有向图的方式进行垃圾回收管理,能够消除引用循环的问题,例若有两个对象,相互引用,只要它们和根进程不可达,那么GC也是能够回收它们的。
java中的内存泄露的状况:长生命周期的对象持有短生命周期对象的引用就极可能发生内存泄露,尽管短生命周期对象已经再也不须要,可是由于长生命周期对象持有它的引用而致使不能被回收,这就是java中内存泄露的发生场景,通俗地说,就是程序员可能建立了一个对象,之后一直再也不使用这个对象,这个对象却一直被引用,即这个对象无用可是却没法被垃圾回收器回收的,这就是java中可能出现内存泄露的状况,例如,缓存系统,咱们加载了一个对象放在缓存中(例如放在一个全局map对象中),而后一直再也不使用它,这个对象一直被缓存引用,但却再也不被使用。
11 、说一说Servlet的生命周期?
Servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。这个生存期由javax.servlet.Servlet接口的init(),service()和destroy方法表达。
Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。
web容器加载servlet,生命周期开始。经过调用servlet的init()方法进行servlet的初始化。经过调用service()方法实现,根据请求的不一样调用不一样的do***()方法。结束服务,web容器调用servlet的destroy()方法。
12 、Servlet API中forward()与redirect()的区别?
(1).从地址栏显示来讲
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,而后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,因此它的地址栏仍是原来的地址.
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器从新去请求那个地址.因此地址栏显示的是新的URL.因此redirect等于客户端向服务器端发出两次request,同时也接受两次response。
(2).从数据共享来讲
forward:转发页面和转发到的页面能够共享request里面的数据.
redirect:不能共享数据.
redirect不只能够重定向到当前应用程序的其余资源,还能够重定向到同一个站点上的其余应用程序中的资源,甚至是使用绝对URL重定向到其余站点的资源.
forward方法只能在同一个Web应用程序内的资源之间转发请求.forward 是服务器内部的一种操做.
redirect 是服务器通知客户端,让客户端从新发起请求.
因此,你能够说 redirect 是一种间接的请求, 可是你不能说"一个请求是属于forward仍是redirect "
(3).从运用地方来讲
forward:通常用于用户登录的时候,根据角色转发到相应的模块.
redirect:通常用于用户注销登录时返回主页面和跳转到其它的网站等.
(4).从效率来讲
forward:高.
redirect:低.
13 、request.getAttribute()和 request.getParameter()有何区别?
(1),request.getParameter()取得是经过容器的实现来取得经过相似post,get等方式传入的数据。
request.setAttribute()和getAttribute()只是在web容器内部流转,仅仅是请求处理阶段。
(2),getAttribute是返回对象,getParameter返回字符串
(3),getAttribute()一贯是和setAttribute()一块儿使用的,只有先用setAttribute()设置以后,才可以经过getAttribute()来得到值,它们传递的是Object类型的数据。并且必须在同一个request对象中使用才有效。,而getParameter()是接收表单的get或者post提交过来的参数
14 ,jsp静态包含和动态包含的区别
(1)、<%@include file="xxx.jsp"%>为jsp中的编译指令,其文件的包含是发生在jsp向servlet转换的时期,而<jsp:include page="xxx.jsp">是jsp中的动做指令,其文件的包含是发生在编译时期,也就是将java文件编译为class文件的时期
(2)、使用静态包含只会产生一个class文件,而使用动态包含会产生多个class文件
(3)、使用静态包含,包含页面和被包含页面的request对象为同一对象,由于静态包含只是将被包含的页面的内容复制到包含的页面中去;而动态包含包含页面和被包含页面不是同一个页面,被包含的页面的request对象能够取到的参数范围要相对大些,不只能够取到传递到包含页面的参数,一样也能取得在包含页面向下传递的参数
15 ,MVC的各个部分都有那些技术来实现?如何实现?
MVC是Model-View-Controller的简写。Model表明的是应用的业务逻辑(经过JavaBean,EJB组件实现),View是应用的表示面(由JSP页面产生),Controller是提供应用的处理过程控制(通常是一个Servlet),经过这种设计模型把应用逻辑,处理过程和显示逻辑分红不一样的组件实现。这些组件能够进行交互和重用。
16,jsp有哪些内置对象?做用分别是什么?
JSP共有如下9个内置的对象:
(1),request 用户端请求,此请求会包含来自GET/POST请求的参数
(2),response 网页传回用户端的回应
(3),pageContext 网页的属性是在这里管理
(4),session 与请求有关的会话期
(5),application servlet 正在执行的内容
(6),out 用来传送回应的输出
(7),config servlet的构架部件
(8),page JSP网页自己
(9),exception 针对错误网页,未捕捉的例外
17 ,Http中,get和post方法的区别
(1),Get是向服务器发索取数据的一种请求,而Post是向服务器提交数据的一种请求
(2),Get是获取信息,而不是修改信息,相似数据库查询功能同样,数据不会被修改
(3),Get请求的参数会跟在url后进行传递,请求的数据会附在URL以后,以?分割URL和传输数据,参数之间以&相连,%XX中的XX为该符号以16进制表示的ASCII,若是数据是英文字母/数字,原样发送,若是是空格,转换为+,若是是中文/其余字符,则直接把字符串用BASE64加密。
(4),Get传输的数据有大小限制,由于GET是经过URL提交数据,那么GET可提交的数据量就跟URL的长度有直接关系了,不一样的浏览器对URL的长度的限制是不一样的。
(5),GET请求的数据会被浏览器缓存起来,用户名和密码将明文出如今URL上,其余人能够查到历史浏览记录,数据不太安全。
在服务器端,用Request.QueryString来获取Get方式提交来的数据
Post请求则做为http消息的实际内容发送给web服务器,数据放置在HTML Header内提交,Post没有限制提交的数据。Post比Get安全,当数据是中文或者不敏感的数据,则用get,由于使用get,参数会显示在地址,对于敏感数据和不是中文字符的数据,则用post。
(6),POST表示可能修改变服务器上的资源的请求,在服务器端,用Post方式提交的数据只能用Request.Form来获取。
(仅供参考,若是有更好的回答,欢迎探讨)
18 ,什么是cookie?Session和cookie有什么区别?
Cookie是会话技术,将用户的信息保存到浏览器的对象.
区别:
(1)cookie数据存放在客户的浏览器上,session数据放在服务器上
(2)cookie不是很安全,别人能够分析存放在本地的COOKIE并进行COOKIE欺骗,若是主要考虑到安全应当使用session
(3)session会在必定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,若是主要考虑到减轻服务器性能方面,应当使用COOKIE
(4)单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能3K。
结论:
将登录信息等重要信息存放为SESSION;其余信息若是须要保留,能够放在COOKIE中。
19 ,jsp和servlet的区别、共同点、各自应用的范围?
JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。JSP编译后是“类servlet”。
Servlet和JSP最主要的不一样点在于:Servlet的应用逻辑是在Java文件中,而且彻底从表示层中的HTML里分离开来。而JSP的状况是Java和HTML能够组合成一个扩展名为.jsp的文件。
JSP侧重于视图,Servlet主要用于控制逻辑。在struts框架中,JSP位于MVC设计模式的视图层,而Servlet位于控制层.
20 ,tomcat容器是如何建立servlet类实例?用到了什么原理?
当容器启动时,会读取在webapps目录下全部的web应用中的web.xml文件,而后对xml文件进行解析,并读取servlet注册信息。而后,将每一个应用中注册的servlet类都进行加载,并经过反射的方式实例化。(有时候也是在第一次请求时实例化)
在servlet注册时加上<load-on-startup>1</load-on-startup>若是为正数,则在一开始就实例化,若是不写或为负数,则第一次请求实例化。
21,JDBC访问数据库的基本步骤是什么?
(1),加载驱动
(2),经过DriverManager对象获取链接对象Connection
(3),经过链接对象获取会话
(4),经过会话进行数据的增删改查,封装对象
(5),关闭资源
22 ,说说preparedStatement和Statement的区别
(1),效率:预编译会话比普通会话对象,数据库系统不会对相同的sql语句不会再次编译
(2),安全性:能够有效的避免sql注入攻击!sql注入攻击就是从客户端输入一些非法的特殊字符,而使服务器端在构造sql语句的时候仍然可以正确构造,从而收集程序和服务器的信息和数据。
好比:“select * from t_user where userName = ‘” + userName + “ ’ and password =’” + password + “’”
若是用户名和密码输入的是’1’ or ‘1’=’1’ ; 则生产的sql语句是:
“select * from t_user where userName = ‘1’ or ‘1’ =’1’ and password =’1’ or ‘1’=’1’ 这个语句中的where 部分没有起到对数据筛选的做用。
23 ,说说事务的概念,在JDBC编程中处理事务的步骤。
(1) 事务是做为单个逻辑工做单元执行的一系列操做。
(2),一个逻辑工做单元必须有四个属性,称为原子性、一致性、隔离性和持久性 (ACID) 属性,只有这样才能成为一个事务
事务处理步骤:
(3),conn.setAutoComit(false);设置提交方式为手工提交
(4),conn.commit()提交事务
(5),出现异常,回滚 conn.rollback();
24 ,数据库链接池的原理。为何要使用链接池。
(1),数据库链接是一件费时的操做,链接池可使多个操做共享一个链接。
(2),数据库链接池的基本思想就是为数据库链接创建一个“缓冲池”。预先在缓冲池中放入必定数量的链接,当须要创建数据库链接时,只需从“缓冲池”中取出一个,使用完毕以后再放回去。咱们能够经过设定链接池最大链接数来防止系统无尽的与数据库链接。更为重要的是咱们能够经过链接池的管理机制监视数据库的链接的数量、使用状况,为系统开发,测试及性能调整提供依据。
(3),使用链接池是为了提升对数据库链接资源的管理
25 ,JDBC的脏读是什么?哪一种数据库隔离级别能防止脏读?
当咱们使用事务时,有可能会出现这样的状况,有一行数据刚更新,与此同时另外一个查询读到了这个刚更新的值。这样就致使了脏读,由于更新的数据尚未进行持久化,更新这行数据的业务可能会进行回滚,这样这个数据就是无效的。数据库的TRANSACTIONREADCOMMITTED,TRANSACTIONREPEATABLEREAD,和TRANSACTION_SERIALIZABLE隔离级别能够防止脏读。
26 ,什么是幻读,哪一种隔离级别能够防止幻读?
幻读是指一个事务屡次执行一条查询返回的倒是不一样的值。假设一个事务正根据某个条件进行数据查询,而后另外一个事务插入了一行知足这个查询条件的数据。以后这个事务再次执行了这条查询,返回的结果集中会包含刚插入的那条新数据。这行新数据被称为幻行,而这种现象就叫作幻读。
只有TRANSACTION_SERIALIZABLE隔离级别才能防止产生幻读。
27 ,JDBC的DriverManager是用来作什么的?
JDBC的DriverManager是一个工厂类,咱们经过它来建立数据库链接。当JDBC的Driver类被加载进来时,它会本身注册到DriverManager类里面
而后咱们会把数据库配置信息传成DriverManager.getConnection()方法,DriverManager会使用注册到它里面的驱动来获取数据库链接,并返回给调用的程序。
28,execute,executeQuery,executeUpdate的区别是什么?
(1),Statement的execute(String query)方法用来执行任意的SQL查询,若是查询的结果是一个ResultSet,这个方法就返回true。若是结果不是ResultSet,好比insert或者update查询,它就会返回false。咱们能够经过它的getResultSet方法来获取ResultSet,或者经过getUpdateCount()方法来获取更新的记录条数。
(2),Statement的executeQuery(String query)接口用来执行select查询,而且返回ResultSet。即便查询不到记录返回的ResultSet也不会为null。咱们一般使用executeQuery来执行查询语句,这样的话若是传进来的是insert或者update语句的话,它会抛出错误信息为 “executeQuery method can not be used for update”的java.util.SQLException。
(3),Statement的executeUpdate(String query)方法用来执行insert或者update/delete(DML)语句,或者 什么也不返回,对于DDL语句,返回值是int类型,若是是DML语句的话,它就是更新的条数,若是是DDL的话,就返回0。
只有当你不肯定是什么语句的时候才应该使用execute()方法,不然应该使用executeQuery或者executeUpdate方法。
29 ,SQL查询出来的结果分页展现通常怎么作?
Oracle:
select * from
(select *,rownum as tempid from student ) t
where t.tempid between ” + pageSize*(pageNumber-1) + ” and ” + pageSize*pageNumber
复制代码
MySQL:
select * from students limit ” + pageSize*(pageNumber-1) + “,” + pageSize;
复制代码
sql server:
select top ” + pageSize + ” * from students where id not in +
(select top ” + pageSize * (pageNumber-1) + id from students order by id) +
“order by id;
复制代码
30 ,JDBC的ResultSet是什么?
在查询数据库后会返回一个ResultSet,它就像是查询结果集的一张数据表。
ResultSet对象维护了一个游标,指向当前的数据行。开始的时候这个游标指向的是第一行。若是调用了ResultSet的next()方法游标会下移一行,若是没有更多的数据了,next()方法会返回false。能够在for循环中用它来遍历数据集。
默认的ResultSet是不能更新的,游标也只能往下移。也就是说你只能从第一行到最后一行遍历一遍。不过也能够建立能够回滚或者可更新的ResultSet
当生成ResultSet的Statement对象要关闭或者从新执行或是获取下一个ResultSet的时候,ResultSet对象也会自动关闭。能够经过ResultSet的getter方法,传入列名或者从1开始的序号来获取列数据