Java面试题,java试题
Java面试题,java试题
1 . JDK ,JRE 和JVM的关系
JDK是java的开放工具,它包含JRE和一些其他的编译运行环境。
JRE是java的运行工具,它包含了JVM和java的系统类库。
JVM是java的虚拟机,是java的.class文件的运行环境。
2 .Java支持多继承么?
Java中类不支持多继承,只支持单继承(即一个类只有一个父类。因为父类中的方法可能是有实现内容的,如果多继承了, 子类就可能继承多个同样名称的方法,而且方法的功能不同,调用子类的该方法时时,不知道该调用谁而产生错位。)。
但是java中的接口支持多继承,,即一个子接口可以有多个父接口。(接口的作用是用来扩展对象的功能,一个子接口继承多个父接口,说明子接口扩展了多个功能,当类实现接口时,类就扩展了相应的功能。接口中的方法都是抽象方法,要调用该方法都必须重写该方法,随便调用谁都不会出现调用错误)。
3.解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法。
通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用JVM中的栈空间;而通过new关键字和构造器创建的对象则放在堆空间,堆是垃圾收集器管理的主要区域,由于现在的垃圾收集器都采用分代收集算法,所以堆空间还可以细分为新生代和老生代,再具体一点可以分为Eden、Survivor(又可分为From Survivor和To Survivor)、Tenured;方法区和堆都是各个线程共享的内存区域,用于存储已经被JVM加载的类信息、常量、静态变量、JIT编译器编译后的代码等数据;程序中的字面量(literal)如直接书写的100、”hello”和常量都是放在常量池中,常量池是方法区的一部分,。栈空间操作起来最快但是栈很小,通常大量的对象都是放在堆空间,栈和堆的大小都可以通过JVM的启动参数来进行调整,栈空间用光了会引发StackOverflowError,而堆和常量池空间不足则会引发OutOfMemoryError。
4.接口和抽象类的区别
从设计层面来说,抽象类是对事物(类)的抽象,是一种模板设计,是对整个类整体进行抽象,包括属性、行为。接口是行为的抽象,是一种行为的规范。
接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
类可以实现很多个接口,但是只能继承一个抽象类
类可以不实现抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
抽象类可以在不提供接口方法实现的情况下实现接口。
Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。
Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。
接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。
5.单列模式
单例饿汉模式:饿汉式单例类.在类初始化时,已经自行实例化 (饿了,当然是马上就吃,不等调用,类初始化时就实例化 了)
public class Singleton1 {
//私有的默认构造子
private Singleton1() {}
//已经自行实例化
private static final Singleton1 single
= new Singleton1();
//静态工厂方法 ,调用此方法前此类已经被实例化了
public
static Singleton1 getInstance() {
return
single;
}
}
懒汉模式: 懒汉式单例类.在第一次调用的时候实例化 (懒汉当然是被调用时才实例化,不催不干活)
public class Singleton2 {//私有的默认构造子
private Singleton2() {}
//注意,这里没有final
private static Singleton2 single=null;
//静态工厂方法 ,调用此方法时才实例化此类
public synchronized static Singleton2 getInstance() {
if (single == null) {
single = new Singleton2();
}
return single;
}
}
6 .工厂模式:
//先定义一个工厂借口
interface MyFactory{
//返回值类型是需要的类的类型
public MyProduct createProduct();
}
//再用一个类去实现这个借口 ,重写方法
Class Factory implements MyFactory{
public MyProduct createProduct(){
//返回要获得的类的实例
return new MyProduct();
}
}
//使用方法:
Public class Client{
Public Static void main (String [] args){
MyFactory factory=new Factory();
MyProduct product=factory.createProduct();
product.ProductMethod();
}
}
7.String和StringBuilder、StringBuffer的区别?
Java平台提供了两种类型的字符串:String和StringBuffer/StringBuilder,它们可以储存和操作字符串。其中String是只读字符串,也就意味着String引用的字符串内容是不能被改变的。而StringBuffer/StringBuilder类表示的字符串对象可以直接进行修改。StringBuilder是Java 5中引入的,它和StringBuffer的方法基本相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer要高,当然也没有StringBuffer安全。
8.Array和ArrayList有何区别?什么时候更适合用Array?
Array可以容纳基本类型和对象,而ArrayList只能容纳对象。
Array是指定大小的,而ArrayList大小是固定的。
Array没有提供ArrayList那么多功能,比如addAll、removeAll和iterator等。尽管ArrayList明显是更好的选择,但也有些时候Array比较好用。
(1)如果列表的大小已经指定,大部分情况下是存储和遍历它们。
(2)对于遍历基本数据类型,尽管Collections使用自动装箱来减轻编码任务,在指定大小的基本类型的列表上工作也会变得很慢。
(3)如果你要使用多维数组,使用Array比ArrayList好。
9 . hashCode和equals方法的关系
equals相等,hashcode必相等(同一个人,必然是同一个名字);
hashcode相等,equals可能不相等(同一个名字,不一定就是同一个人)。
10.自动装箱与拆箱
装箱:将基本类型用它们对应的引用类型包装起来;
拆箱:将包装类型转换为基本数据类型;
Java使用自动装箱和拆箱机制,节省了常用数值的内存开销和创建对象的开销,提高了效率,由编译器来完成,编译器会在 编译期根据语法决定是否进行装箱和拆箱动作。
11 . Java中的集合类及关系图
List和Set继承自Collection接口。
Set无序不允许元素重复。HashSet和TreeSet是两个主要的实现类。
List有序且允许元素重复。ArrayList、LinkedList和Vector是三个主要的实现类。
Map也属于集合系统,但和Collection接口没关系。Map是key对value的映射集合,其中key列就是一个集合。key不能重复,但是value可以重复。HashMap、TreeMap和Hashtable是三个主要的实现类。
SortedSet和SortedMap接口对元素按指定规则排序,SortedMap是对key列进行排序。
12.多线程的实现方式
继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。
13.线程的状态转换
14. 什么是线程安全
线程安全就是多线程访问同一代码,不会产生不确定的结果。
15.如何保证线程安全
对非安全的代码进行加锁控制;
使用线程安全的类;
多线程并发情况下,线程共享的变量改为方法级的局部变量。
16.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本身提供的缓存机制不佳。
- Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
他人总结
- Hibernate功能强大,数据库无关性好,O/R映射能力强,如果你对Hibernate相当精通,而且对Hibernate进行了适当的封装,那么你的项目整个持久层代码会相当简单,需要写的代码很少,开发速度很快,非常爽。
- Hibernate的缺点就是学习门槛不低,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡取得平衡,以及怎样用好Hibernate方面需要你的经验和能力都很强才行。
- iBATIS入门简单,即学即用,提供了数据库查询的自动对象绑定功能,而且延续了很好的SQL使用经验,对于没有那么高的对象模型要求的项目来说,相当完美。
- iBATIS的缺点就是框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。
17 .SpringMVC与Struts2区别与比较总结 http://blog.csdn.net/chenleixing/article/details/44570681
相关文章
- 暂无相关文章
用户点评