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值尽可能的少重复
6、HashMap和Hashtable有什么区别?
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迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。这条同样也是Enumeration和Iterator的区别。
5.由于HashMap非线程安全,在只有一个线程访问的情况下,效率要高于HashTable7、Hibernate中Session的load和get方法的区别是什么?
① 如果没有找到符合条件的记录,get方法返回null,load方法抛出异常。
② get方法立即加载,load方法默认延迟加载。
③ 在Hibernate 3之前,get方法只在一级缓存中进行数据查找,如果没有找到对应的数据则越过二级缓存,直接发出SQL语句完成数据读取;load方法则可以从二级缓存中获取数据;从Hibernate 3开始,get方法不再是对二级缓存只写不读,它也是可以访问二级缓存的。更详细的介绍 和解锁
①若为true,则首先在Session缓存中查找,看看该id对应的对象是否存在,不存在则使用延迟加载,返回实体的代理类对象(该代理类为实体类的子类,由CGLIB动态生成)。等到具体使用该对象(除获取OID以外)的时候,再查询二级缓存和数据库,若仍没发现符合条件的记录,则会抛出一个ObjectNotFoundException。
②若为false,就跟Hibernate的get方法查找顺序一样,只是最终若没发现符合条件的记录,则会抛出一个ObjectNotFoundException,所说的load方法抛异常是指在使用该对象的数据时,数据库中不存在该数据时抛异常,而不是在创建这个对象时。
8、Hibernate中Query接口的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文件 有重名的会影响 程序