java基础面试题整理

未分类 发表评论

1.JDK和JRE的区别是什么?

答:Java运行时环境(JRE)是将要执行Java程序的Java虚拟机。它同时也包含了执行applet需要的浏览器插件。Java开发工具包(JDK)是完整的Java软件开发包,包含了JRE,编译器和其他的工具(比如:JavaDoc,Java调试器),可以让开发者开发、编译、执行Java应用程序。

2.Java中的方法重写(Overriding)和方法重载(Overloading)是什么意思?

答:

1:Java中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。

2:方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限制它所覆盖的方法的访问。

3:概括的解释下线程的几种可用状态? 

答:

线程在执行过程中,可以处于下面几种状态:

1就绪(Runnable):线程准备运行,不一定立马就能开始执行。

2运行中(Running):进程正在执行线程的代码。

3等待中(Waiting):线程处于阻塞的状态,等待外部的处理结束。

4睡眠中(Sleeping):线程被强制睡眠。

5I/O阻塞(Blocked on I/O):等待I/O操作完成。

6同步阻塞(Blocked on Synchronization):等待获取锁。

7死亡(Dead):线程完成了执行。

 

4:.什么是死锁(deadlock)

答:两个进程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是两个进程都陷入了无限的等待中。

5:hashCode()和equals()方法的重要性体现在什么地方

答:

 equals()相等的两个对象,hashcode()一定相等,equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。换句话说,equals()方法不相等的两个对象,hashCode()有可能相等。

6:HashMap和Hashtable有什么区别

答:

Java中的HashMap是以键值对(key-value)的形式存储元素的。HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。HashMap的一些重要的特性是它的容量(capacity),负载因子(load
factor)和扩容极限(threshold resizing)。

  1. HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)。
  2. HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。
  3. 另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。
  4. 由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。
  5. HashMap不能保证随着时间的推移Map中的元素次序是不变的。
  6. 原文链接: Javarevisited 翻译: ImportNew.com – 唐小娟
    译文链接: http://www.importnew.com/7010.html

7:Hibernate中Session的load和get方法的区别是什么

答:

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

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

8: Query接口的list方法和iterate方法有什么区别?

① list()方法无法利用一级缓存和二级缓存(对缓存只写不读),它只能在开启查询缓存的前提下使用查询缓存;iterate()方法可以充分利用缓存,如果目标数据只读或者读取频繁,使用iterate()方法可以减少性能开销。 
② list()方法不会引起N+1查询问题,而iterate()方法可能引起N+1查询问题

9: Spring中自动装配的方式有哪些

– no:不进行自动装配,手动设置Bean的依赖关系。

– byName:根据Bean的名字进行自动装配。
– byType:根据Bean的类型进行自动装配。 
– constructor:类似于byType,不过是应用于构造器的参数,如果正好有一个Bean与构造器的参数类型相同则可以自动装配,否则会导致错误。 
– autodetect:如果有默认的构造器,则通过constructor的方式进行自动装配,否则使用byType的方式进行自动装配。

 10:如何在Web项目中配置Spring MVC?

<web-app> <servlet> <servlet-name>example</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>example</servlet-name>
<url-pattern>*.html</url-pattern> </servlet-mapping> </web-app>

11:mybatis 如何实现mysql 数据库分页

1:<select id=”findAll” parameterType=”java.util.Map” resultType=”com.wangmeng.entity.Emp”>
select * from emp limit #{index},#{pageSize}
</select>

2:其中map 封装index 起始页数,pagesize 是一页显示多少条

12:mybatis 如何实现oralce 数据库分页

select * from (

select t1.* from (

       select rownum rn, t.factory_id,t.full_name,t.factory_name,t.contacts,t.phone,t.mobile,t.fax, t.cnote,t.inspector

from FACTORY_C t where 1=1

   order by  t.factory_id desc   

  </if>

) t1 where t1.rn <![CDATA[ <=]]>  #{end}

) t2 where t2.rn <![CDATA[ >=]]> #{start}

  

13:Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?说明具体原因

答:

(1) 不同的Xml映射文件,如果配置了namespace,那么id可以重复; 

(2) 如果没有配置namespace,那么id不能重复;毕竟namespace不是必须的;

(3) 原因就是namespace+id是作为Map。

 

14:什么是ORM

ORM,即Object-Relational Mapping,它的作用就是在关系型数据库和对象之间做了一个映射。从对象(Object)映射到关系(Relation),再从关系映射到对象。

 

15:简述SpringIoC和DI

答:SpringIoC:

SpringIoC:对象创建的控制权转移到Spring中。

SpringIoC容器:存放各种JavaBean(Java对象的容器)/Spring Bean工厂。

DI: 

property标签实现DI:默认会去调用set方法

bean class:默认调用无参构造,调用有参使用constructor-arg

 

16:写出Spring的常见注解(至少5个)

答:

@Component@Repository@Service@Controller@Autowired

 

17:简述JSON+Ajax实现步骤

答:

1) 页面发送Ajax请求。

2) Action或者Servlet或者SpringMVC的控制器接收该请求。

3) Ajax请求一般不需要配置逻辑视图:

Action的方法无返回值,且不需要配置result。

4) 把处理结果以JSON字符串的形式进行返回。

5) 页面通过JSON.parse(JSON字符串):把JSON字符串解析成JSONObject/JSONArray

18:谈谈你mvc的理解

答:

(1) 它是基于组件技术的.全部的应用对象,无论控制器和视图,还是业务对象之类的都是java组件。并且和Spring提供的其他基础结构紧密集成。

(2) 不依赖于Servlet API(目标虽是如此,但是在实现的时候确实是依赖于Servlet的)

(3) 可以任意使用各种视图技术,而不仅仅局限于JSP

(4) 支持各种请求资源的映射策略

(5) 它是易于扩展的

19: 访问修饰符public,private,protected,以及不写(默认)时的区别?

修饰符

当前类

同 包

子 类

其他包

public

protected

×

default

×

×

private

×

×

×

 

 

 

20、Hibernate中Session的load和get方法的区别是什么

答: 

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

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

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

21、Hibernate中Query接口的list方法和iterate方法有什么区别?

① list()方法是立即加载,iterator是延迟加载 

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

22:简述连接查询和子查询的区别

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

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

 

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

 

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

23.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:resources mapping=”/images/**” location=”/images/” />   

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

<mvc:resources location=”/WEB-INF/jsp/” mapping=”/WEB-INF/jsp/**”></mvc:resources>

24 JSP有哪些内置对象,作用是什么?

名称

作用

request

包含用户端请求的信息

response

包含服务器传回客户端的响应信息

session

与请求有关的会话期

pageContext

管理网页属性

application

服务器启动时创建,服务器关闭时停止,为多个应用程序保存信息

out

向客户端输出数据

config

servlet的架构部件

page

指网页本身

exception

针对错误页面才可使用

四种会话跟踪技术作用域

1)page:一个页面

2)request::一次请求

3)session:一次会话

4)application:服务器从启动到停止。

25 forward和redirect的区别

1)从地址栏显示来说 

forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送

的内容从哪里来的,所以它的地址栏还是原来的地址.redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是

新的URL.

2)从数据共享来说 

forward:转发页面和转发到的页面可以共享request里面的数据.

redirect:不能共享数据.

3)从运用地方来说 

forward:一般用于用户登陆的时候,根据角色转发到相应的模块.

redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.

4)从效率来说 

forward:高.

redirect:低

26 RequestSession的取值区别

request可以通过getAttribute()方法直接取值,也可通过getParameter()取值

Session需要通过request.getSession().getAttribute()才能取值

Request是针对一次请求,Session是针对整个会话

27 常见http状态码
1XX,2XX,3XX,4XX,5XX的含义

1XX

Informational

信息性状态码,表示接受的请求正在处理

2XX

Success

成功状态码,表示请求正常处理完毕

3XX

Redirection

重定向状态码,表示需要客户端需要进行附加操作

4XX

Client Error

客户端错误状态码,表示服务器无法处理请求

5XX

Server Error

服务器错误状态码,表示服务器处理请求出错

28 short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?解释含义。

对于short s1 = 1; s1 = s1 + 1;由于1是int类型,因此s1+1运算结果也是int 型,需要强制转换类型才能赋值给short型。而short s1 = 1; s1 += 1;可以正确编译,因为s1+= 1;相当于s1 = (short)(s1 + 1);其中有隐含的强制类型转换。

29 try{}里有一个return语句,那么紧跟在这个try后的finally{}里的代码会不会被执行,什么时候被执行,在return前还是后?

答:会执行,在方法返回调用者前执行。

30 阐述final、finally、finalize的区别。

final:修饰符(关键字)有三种用法:如果一个类被声明为final,意味着它不能再派生出新的子类,即不能被继承,因此它和abstract是反义词。将变量声明为final,可以保证它们在使用中不被改变,被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取不可修改。被声明为final的方法也同样只能使用,不能在子类中被重写。
– finally:通常放在try…catch…的后面构造总是执行代码块,这就意味着程序无论正常执行还是发生异常,这里的代码只要JVM不关闭都能执行,可以将释放外部资源的代码写在finally块中。
– finalize:Object类中定义的方法,Java中允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在销毁对象时调用的,通过重写finalize()方法可以整理系统资源或者执行其他清理工作。

发表评论

邮箱地址不会被公开。 必填项已用*标注

昵称 *