常见面试题

1.JDK和JRE的区别是什么

Java运行时环境(JRE)是将要执行Java程序的Java虚拟机。

Java开发工具包(JDK)是完整的Java软件开发包,包含了JRE,编译器和其他的工具(比如:JavaDoc,Java调试器),可以让开发者开发、编译、执行Java应用程序。



2.简述Java中的方法覆盖(Overriding)和方法重载(Overloading)的区别



3、概括的解释下线程的几种状态

4、什么是线程死锁(deadlock)


5、为什么重写equals()方法之前通常都先重写hashcode()

equals()相等的两个对象,hashcode()一定相等,hashcode()值不同,equals()一定不同。

因为先重写hashcode()能够提供equals方法的判断效率,hashcode()不同不再进行equals()比较

但需注意:equals()方法不相等的两个对象,hashCode()有可能相等。

HashMap的数据结构:

重写hashCode()的原则:保证hashcode值尽可能的少重复


6HashMapHashtable有什么区别

HashMAp:

     HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。

      HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap。

      HashMap 实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆。

hashtable

    Hashtable同样是基于哈希表实现的,同样每个元素是一个key-value对,其内部也是通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。

      Hashtable也是JDK1.0引入的类,是线程安全的,能用于多线程环境中。

      Hashtable同样实现了Serializable接口,它支持序列化,实现了Cloneable接口,能被克隆。

可以用这5点来回答:

1.Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Mapinterface的一个实现。

2.HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。

 

3.HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap就需要手动上锁。

4.另一个区别是HashMap的迭代器(Iterator)fail-fast迭代器,而Hashtableenumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。这条同样也是EnumerationIterator的区别。

5.由于HashMap非线程安全,在只有一个线程访问的情况下,效率要高于HashTable

7HibernateSessionloadget方法的区别是什么?

① 如果没有找到符合条件的记录,get方法返回null,load方法抛出异常。

② get方法立即加载,load方法默认延迟加载。

③ 在Hibernate 3之前,get方法只在一级缓存中进行数据查找,如果没有找到对应的数据则越过二级缓存,直接发出SQL语句完成数据读取;load方法则可以从二级缓存中获取数据;从Hibernate 3开始,get方法不再是对二级缓存只写不读,它也是可以访问二级缓存的。

更详细的介绍 和解锁

(1)Hibernate的get方法,会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查询数据库,数据库中没有就返回null。
(2)Hibernate的load方法加载实体对象的时候,根据映射文件上类级别的lazy属性的配置(默认为true):
①若为true,则首先在Session缓存中查找,看看该id对应的对象是否存在,不存在则使用延迟加载,返回实体的代理类对象(该代理类为实体类的子类,由CGLIB动态生成)。等到具体使用该对象(除获取OID以外)的时候,再查询二级缓存和数据库,若仍没发现符合条件的记录,则会抛出一个ObjectNotFoundException。 
②若为false,就跟Hibernate的get方法查找顺序一样,只是最终若没发现符合条件的记录,则会抛出一个ObjectNotFoundException,所说的load方法抛异常是指在使用该对象的数据时,数据库中不存在该数据时抛异常,而不是在创建这个对象时。


8HibernateQuery接口的list方法和iterate方法有什么区别 

简单来说:

Query的两个方法,list() 和 iterate() , 两个方法都是把结果集列出来, 他们有3点不一样,
1:返回的类型不一样,list()返回List, iterate()返回Iterator,

list()中返回的List中每个对象都是原本的对象, iterate()中返回的对象是代理对象.(debug可以发现)


2: 获取数据的方式不一样,list()会直接查数据库, iterate()会先到数据库中把id都取出来,然后真正要遍历某个对象的时候先到缓存中找,如果找不到,以id为条件再发一条sql到数据库,这样如果缓存中没有数据,则查询数据库的次数为n+1。

3:iterate会查询2级缓存, list只会查询一级缓存。
4.  ①list()方法是立即加载,iterator是延迟加载 

延迟加载在关联查询时会产生N+1问题,也就是多次向数据库服务器发送sql语句

list()方法不会引起N+1查询问题,而iterate()方法可能引起N+1查询问题



9、简述连接查询和子查询的区别

①. 连接查询是将两个或多个的表按某个条件连接起来,从中选取需要的数据,连接查询是同时查询两个或两个以上的表时使用。

连接查询可分为内连接和外连接 

②.子查询是将一个查询语句嵌套在另外一个查询语句中,内层查询语句的查询结果,可以为外层查询语句提供查询条件。 

③.表连接都可以用子查询替换,但不是所有子查询都能用表连接替换,子查询比较灵活,方便,形式多样,适合用于作为查询的筛选条件,而表连接更适合与查看多表的数据  


10、SpringMVC如何对静态资源进行放行?

方案一:在web.xml中配置defaultServlet来处理静态文件

 <servlet-mapping>  

    <servlet-name>default</servlet-name> 

    <url-pattern>*.js</url-pattern> 

    <url-pattern>*.css</url-pattern>

  <!-- <url-pattern>*.html</url-pattern>-->

    <url-pattern>/images/*</url-pattern> 

 </servlet-mapping>

 

方案二:在spring-mvc.xml中使用mvc:resources:

<!--对静态资源文件的访问--> 

<mvc:resourcesmapping="/images/**"location="/images/" />  

<mvc:resources mapping="/js/**"location="/js/" />  

<mvc:resourceslocation="/WEB-INF/jsp/"mapping="/WEB-INF/jsp/**"></mvc:resources>


11.jsp include 和 <%@page %>有什么区别  

jsp include  经编译后 是两个.java文件 有重名的id不影响  

<%@page %>  编译后合成一个.java文件  有重名的会影响 程序


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值