首页 > 技术文章 > java面试题1

dummyly 2019-02-27 13:02 原文

Java 中 sleep 方法和 wait 方法的区别?

两者都是用来暂停当前运行的线程,sleep只是短暂的暂停,它不会释放锁,而wait需要释放锁,

因为wait意味着条件等待,只有释放锁了,其他等待的线程才能满足条件时获取到该锁。

 3*0.1 == 0.3 将会返回什么?true 还是 false?

false,因为有些浮点数不能完全精确的表示出来。

Int 和 Integer 哪个会占用更多的内存?

Integer 对象会占用更多的内存。Integer 是一个对象,需要存储对象的元数据。但是 int 是一个原始类型的数据,所以占用的空间更少。

代码中如何实现多态?

接口的实现,子类继承父类重写方法,同一类中进行方法重载。

静态变量和实例变量的区别?

静态变量存储在方法区,属于类所有。实例变量存储在堆当中,其引用存在当前线程栈。

switch中能否用String做参数?

在idk 1.7之前,switch只能支持byte, short, char, int或者其对应的封装类以及Enum类型。从idk 1.7之后switch开始支持String。

java当中的四种引用

强引用,软引用,弱引用,虚引用。不同的引用类型主要体现在GC上:

  1. 强引用:如果一个对象具有强引用,它就不会被垃圾回收器回收。即使当前内存空间不足,JVM也不会回收它,而是抛出 OutOfMemoryError 错误,使程序异常终止。如果想中断强引用和某个对象之间的关联,可以显式地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象。

  2. 软引用:在使用软引用时,如果内存的空间足够,软引用就能继续被使用,而不会被垃圾回收器回收,只有在内存不足时,软引用才会被垃圾回收器回收。

  3. 弱引用:具有弱引用的对象拥有的生命周期更短暂。因为当 JVM 进行垃圾回收,一旦发现弱引用对象,无论当前内存空间是否充足,都会将弱引用回收。不过由于垃圾回收器是一个优先级较低的线程,所以并不一定能迅速发现弱引用对象。

  4. 虚引用:顾名思义,就是形同虚设,如果一个对象仅持有虚引用,那么它相当于没有引用,在任何时候都可能被垃圾回收器回收。

a=a+b与a+=b有什么区别吗?

+=操作符会进行隐式自动类型转换,此处a+=b隐式的将加操作的结果类型强制转换为持有结果的类型,而a=a+b则不会自动进行类型转换。如:
byte a = 127; 
byte b = 127; 
b = a + b; // error : cannot convert from int to byte 
b += a; // ok 
(译者注:这个地方应该表述的有误,其实无论 a+b 的值为多少,编译器都会报错,因为 a+b 操作会将 a、b 提升为 int 类型,所以将 int 类型赋值给 byte 就会编译出错)

& 和 &&的区别

首先记住&是位操作,而&&是逻辑运算符。另外需要记住逻辑运算符具有短路特性,而&不具备短路特性。

final, finalize和finally的不同之处

final 是一个修饰符,可以修饰变量、方法和类。如果 final 修饰变量,意味着该变量的值在初始化后不能被改变。

finalize 方法是在对象被回收之前调用的方法,给对象自己最后一个复活的机会,但是什么时候调用 finalize 没有保证。

finally 是一个关键字,与 try 和 catch 一起用于异常的处理。finally 块一定会被执行,无论在 try 块中是否有发生异常。

深拷贝和浅拷贝的区别

两者都是被复制的对象的所有变量都含有与原来的对象相同的值,浅拷贝两个对象的引用都指向原来的对象,深拷贝被复制的对象的引用指向新的拷贝的对象。

final有哪些用法

1.被final修饰的类不可以被继承 
2.被final修饰的方法不可以被重写 
3.被final修饰的变量不可以被改变。如果修饰引用,那么表示引用不可变,引用指向的内容可变。
4.被final修饰的方法,JVM会尝试将其内联,以提高运行效率 
5.被final修饰的常量,在编译阶段会存入常量池中。

struts2和springMVC有什么区别?

1.springMVC是基于方法开发的,注解开发中使用requestMapping将url和方法进行 映射,如果根据url找到controller类的方法生成一个handler处理器对象(只包括一个method).

struts2是基于类开发的,每个请求过来创建一个action实例,实例对象中有若干个方法.

开发中建议使用springmvc,springmvc方法更类似service业务方法.

2.struts2通过在action类中定义成员变量接收参数,(属性驱动和模型驱动),它只能使用多例模式管理action.

 springmvc通过在controller方法中定义形参接收参数,springmvc可以使用单例模式管理controller.

3.springmvc入口是一个servlet前端控制器(DispatcherServlet),struts2入口是一filter过滤器(StrutsPrepareAndExecuteFilter).

4.Struts2有自己的拦截Interceptor机制,SpringMVC这是用的是独立的Aop方式,这样导致Struts2的配置文件量还是比SpringMVC大。

5.springMVC实现了零配置。  

SpringMVC流程

1、  用户发送请求至前端控制器DispatcherServlet。

2、  DispatcherServlet收到请求调用HandlerMapping处理器映射器。

3、  处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

4、  DispatcherServlet调用HandlerAdapter处理器适配器。

5、  HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。

6、  Controller执行完成返回ModelAndView。

7、  HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。

8、  DispatcherServlet将ModelAndView传给ViewReslover视图解析器。

9、  ViewReslover解析后返回具体View。

10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。

11、 DispatcherServlet响应用户。

hibernate和mybatis的区别

相同点:Hibernate与MyBatis都可以是通过SessionFactoryBuider由XML配置文件生成SessionFactory,然后由SessionFactory 生成Session,最后由Session来开启执行事务和SQL语句。其中SessionFactoryBuider,SessionFactory,Session的生命周期都是差不多的。

  • Hibernate和MyBatis都支持JDBC和JTA事务处理。

Mybatis优势

  • MyBatis可以进行更为细致的SQL优化,可以减少查询字段。
  • MyBatis容易掌握,而Hibernate门槛较高。

Hibernate优势

  • Hibernate的DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。
  • Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。
  • Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
  • Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。

拦截器与过滤器的区别 :

1.拦截器是基于java的反射机制的,而过滤器是基于函数回调。

2.拦截器不依赖与servlet容器,过滤器依赖与servlet容器。

3.拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。

4.拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。

5.在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

struts2是如何进行前后台交互的?

Ajax的作用?

AJAX最根本原理就是在不刷新页面的情况下访问服务器处理数据,并根据数据的处理结果按你想要的方式对页面作出即时更改。

原生态的Ajax执行流程?

1.创建XMLHttpRequset对象

2.注册回调函数

3.设置连接信息

4.发送数据,与服务器开始交互

5.接收服务器的返回数据

ArrayList,Vector和LinkedList有何区别?

ArrayList和vector是基于动态数组的数据结构,LinkedList是基于链表的数据结构;对于随机访问get和set,ArrayList较优,Vector由于使用了synchronized方法-线程安全,所以性能上比ArrayList要差一些,因为LinkedList要移动指针;

对于新增和删除操作add和remove,LinkedList较优,因为ArrayList要移动数据。

HashMap和Hashtable的区别?

1.hashmap是允许空键值,hashtable不允许;

2.hashmap继承于AbstractMap类,hashtable继承于Dictionary类,两者都实现了Map接口;

3.hashmap的方法是不同步的,hashtable的方法是同步的。

Iterater和ListIterator之间有何区别?

1.我们可以使用Iterator来遍历Set和List集合,而ListIterator只能遍历List。

2.Iterator只可以向前遍历,而LIstIterator可以双向遍历。

3.ListIterator从Iterator接口继承,然后添加了一些额外的功能,比如添加一个元素、替换一个元素、获取前面或后面元素的索引位置。

什么是死锁?

两个或两个以上线程都在等待对方执行完毕才能继续往下执行的时候会发生死锁。结果是这些线程都陷入了无限等待中。

创建线程的方式?

1.继承Thread类

2.实现Runnable接口

3.使用Executor框架创建线程池

 JDBC编程的步骤?

1.注册驱动

2.获取连接对象Connection

3.创建statement对象

4.运行sql语句

5.处理结果

6.关闭连接,释放资源

事务的ACID是什么?事务并发会发生什么问题?

ACID表示事务的特性:原子性,一致性,隔离性,持久性

事务并发发生的问题:脏读,幻读,不可重复读。

接口和抽象类的区别是什么

抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。

接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。

类可以实现很多个接口,但是只能继承一个抽象类。

java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。

Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。

 

推荐阅读