JAVA企业面试题简答题 及答案.docx
《JAVA企业面试题简答题 及答案.docx》由会员分享,可在线阅读,更多相关《JAVA企业面试题简答题 及答案.docx(19页珍藏版)》请在冰豆网上搜索。
JAVA企业面试题简答题及答案
第一部分Java的类
1、请解释Java语言的跨平台特性。
Java的跨平台特性也被称为可移植性。
他的意思就是如果用Java语言编写一个应用,那么就可以在不同平台上运行,而不需要为不同平台单独运行开发。
之所以能实现跨平台的特性。
主要得益于Java虚拟机(JVM),JVM解释器在运行Java应用时根据当前平台进行解释,解释成符合当前平台规范的机器码,所以可以实现同样的应用在不同平台上都能运行。
2、请列举JAVA语言的主要特点
JAVA语言有很多特点,主要包括①跨平台性:
一个应用可以不经过修改直接运行到不同的平台上。
②面向对象:
JAVA语言是一门面向对面的语言,可以使用对象的属性和行为,可以使用面向对象的思想进行分析设计,并实现整个应用。
③解释执行JAVA应用时,JVM中的解释器将解释类文件,生成符合当前平台的字节码。
④自动回收:
JAVA应用中的垃圾回收是自动进行的,JVM中的后台线程将监视内存中数据的使用,当内存中的数据不再被引用时,将被作为垃圾回收,而不需要程序员动手回收。
3.请说明一个JAVA类中主要包含哪几个元素?
并说明每种元素的作用。
JAVA类中主要包含属性、方法、构造方法、块以及内部类。
属性用来定义对象的数据;方法用来定义对象的行为;构造方法可以用来创建对象;块能够用来在类加载时执行操作或者在每次实例化前执行通用操作;内部类作为类的一个成员存在,能够访问外部类的属性和方法。
4、请说明构造方法的作用和特征
构造方法的作用是用来创建对象,使用new关键字调用。
构造方法的名字必须与类的名字相同,并且大小写敏感,同时构造方法不能声明返回值类型,可以使用任意一种访问修饰符,但是不能使用其他修饰符进行修饰,如static、final、abstract等修饰符都可以修饰构造方法。
5、什么事方法重载(overload)?
方法重载指的是在一个类中可以声明多个相同名字的方法,而方法的形式参数有区别。
调用这些同名的方法时,JVM会根据实际参数的不同绑定到不同的方法。
6、请列举Java语言中的权限访问修饰符,并说明每种权限的含义。
Java语言中有四种权限访问修饰符,即public、protected、同包以及private.
public表示公共权限,即任何包中都可以访问:
protected表示受保护权限,即同包中可以访问,不同包中的子类可以访问:
同包权限是默认权限,即不显示指明权限修饰符的时候就是同包权限,表示只有同包中可以访问:
private是私有权限,表示只能在本类中访问。
7、请列举Java语言中的八种基本数据类型,并说明每种数据类型的含义及长度。
Java语言的八种基本数据类型有:
byte字节型,8位长度:
short短整型,16位长度,int整型,32位长度:
long长整型,64位长度:
float单精度浮点型。
32位长度:
double双精度浮点型,64位长度:
char字符型,16位长度:
boolean型,表示逻辑值,有true和false两个值,分别表示真和假。
8.什么叫引用类型,引用类型和基本数据类型有什么区别?
Java语言中除了基本数据类型之外的类型,都称为引用类型。
引用类型就是类的类型,所有的对象都是引用类型,包括数组对象。
引用类型必须使用new调用构造方法进行赋值,引用类型的变量拥有自己的属性和方法,可以使用圆点调用自己的属性和方法。
基本数据类型直接使用=号进行赋值,且没有自己的属性和方法,往往都在声明属性或方法时使用。
9.对于String对象,可以使用“=”赋值,也可以使用new关键字赋值,两种方式有什么区别?
使用“=”赋值不一定每次都创建一个新的字符串,而是从“字符串实例池”中查找字符串。
使用new进行赋值,则每次都创建一个新的字符串。
10.String类是一个“不可变类”,请解释“不可变类”的含义。
所谓的不可变类,就是当字符串初始化后,就不能够被改变。
11.String类和StringBuffer类有什么区别?
String类是不可变类,即字符串值一旦初始化后就不可能改变。
StringBuffer是可变字符串类,类似String的缓冲区,可以修改字符串的值。
12.StringBuffer和StringBuilder类有什么区别?
StringBuffer是线程安全的字符串缓冲,而StringBuilder不是线程安全的。
13.包装器类型包括哪些类,有什么作用?
包装类器包括Byte、Short、Integer、Long、Float、Double、Character、Boolean等类,主要用来对byte、short、integer、long、float、double、character、boolean这八种基本数据类型进行包装,使其成为引用类型。
14.请说明Java语言中的值传递规则。
基本数据类型传递的是值,引用类型传递的是引用,即虚地址。
15.使用static修饰属性或方法后,属性和方法有什么特征?
static修饰属性或方法后,属性和方法不在属于某个特定的对象,成为类对象,被所有此类的实例所共享,在类加载时就被初始化。
Static修饰的属性或方法,可以直接使用类名调用,而不用先实例化对象再调用。
16.使用final修饰属性后,属性有什么特征?
final修饰属性后,属性就成为一个常量。
常量只要被赋值,就不能被改变。
17.请说明操作符==的作用。
==可以用来比较基本类型或者引用类型。
比较基本类型时,==用来比较二进制的值,比较引用类型时,用来比较对象的虚地址。
18请说明&&与&的区别和联系
&&会发生短路问题,当第一个表达式的值为false时,将直接返回结果为false而不会判断第二个表达式的值。
而&不会发生短路问题,即使第一个表达式的值是false,会判断第二个表达式的值。
19.break语句能在什么场景使用。
break语句可以再循环体中使用,也可以在switch的case语句中使用。
20.for循环中的break语句和continue语句的使用。
break可以用来中断循环,continue可以用来继续下一次循环。
21请说明一个JAVA类中主要包含哪几个元素并说明每种元素的作用。
JAVA类中主要包含属性、方法、构造方法、块以及内部类。
属性用来定义对象的数据,方法用来定义对象的行为,构造方法可以用来创建对象,块能够用来在类加载时执行操作或者在每次实例化前执行通用操作,内部类作为类的一个成员存在,能够访问外部类的属性和方法。
第二部分类之间的关系
1、用代码表示A类关联B类的情况。
ClassA{
PrivateBb;
PublicvoidsetB(Bb){
This.b=b;
}
}
2、请说明Java语言中数组的基本概念,数组的作用,以及数组的声明创建方式。
数组是相同元素的集合,作为数据容器使用。
声明创建一个int型数组:
int[]x=newint[3];其中3是数组的长度,该数组能够存储3个int型变量。
3、使用代码,创建一个长度为5的String型数组,并使用增强for循环迭代数组打印出数组中的元素。
String[]sArray=newString[5];
For(Strings:
sArray){
System.out.println(s);
}
4、说明Arrays类的作用。
Arrays类是java.util包中的一个类,类中所有的方法都是static方法,这些方法都是数组对象的工具方法,能够对数组进行处理,如sort方法可以对数组元素进行排序。
5、请使用简单代码展示A类依赖B类的含义。
依赖关系指的是一种瞬间的关系。
如果A依赖B,一般指的是A类的某个行为,需要B类对象作为参数。
ClassA{
Publicvoidf(Bb)
}
6、请说明依赖关系和关联关系的区别。
依赖关系是一种瞬时关系,A依赖B,指的是A的某个行为的参数是B的类型,也就是说,A要想实现这个行为,必须依赖B的实例。
A关联B,是一种长久的关系。
是B作为A的属性存在,只要实例化一个A的对象,就会为这个A的对象实例化一个B的对象,作为它的属性使用,可以在A中任何需要使用B的地方使用B。
7、继承有什么作用,Java语言中的继承有什么特点?
继承主要为了能够重复使用父类中的成员,提高代码的重用率
Java语言中的继承是单继承,也就是说一个类最多只能继承一个父类。
8、什么是方法覆盖(override)?
并说明方法覆盖与方法重载(overioad)的区别。
覆盖是发生在继承关系的子类中,当子类要修改从父类继承的某个方法的方法体时,就可以在子类中声明一个与父类同名、同参数并且同返回值类型的方法,这就是方法覆盖。
而重载与继承没有关系,指的是在一个类中可以同时声明多个同名但不同参数的方法,称为重载。
9、请说明什么是抽象类?
抽象类有什么作用?
抽象类是不能实例化的类,使用abstract修饰。
抽象类往往用来做父类使用,定义一些子类的共同属性或行为。
10、请说明抽象方法的含义,并说明抽象类与抽象方法的关系。
抽象方法是没有办法体的方法,使用abstract修饰。
抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类。
11、super关键字的两种用法。
如super():
表示调用父类中的每一参考的构造方法:
又如super(10);表示调用父类中的具有一个整型参数的构造方法。
第二种用法是在子类中调用父类中的成员,如super.f();意思是调用父类中的f()方法。
12、final类与final方法有什么作用?
final类是不能够被继承的类,称为终极类,如String类就是final类,不能有子类。
final修饰方法后,是终极方法,不能被子类覆盖,但是可以被子类继承使用。
13、什么是多态函数?
多态函数有什么用?
多态函数就是参数的类型是某个父类类型,具体为这个参数赋值的不同以使用该父类的任意子类的对象。
使用多态参数,可以使程序的扩展性更好,即使%%%%的子类方法不需要任何修改,就能接受子类类型进行处理。
14、Object类有什么特点?
Object类是多有类的直接或间接的父类。
15、Object类中的toString方法有什么用?
toString方法可以把对象作为字符串返回。
16、Object类中的equals方法和hashCode方法。
Oject类中的equals方法用来比较两个引用值,hashCode用来返回引用的内地址的十六进制数值。
在Set以及Map集合中,判断两个元素是否重复时,往往需要使用这两个方法。
这两个方法往往被子类覆盖,覆盖的规则是:
如果存在x和y两个对象,调用x.equals(y)返回true时,那么调用hashCode方法的返回值也该相同;如果x.equals(y)返回false时,那么调用hashCode方法返回的值可能相同,也可能不同。
17、接口有什么特点,与抽象类有什么区别?
口的特点是不能定义变量,而且所有方法都是抽象方法。
而抽象类中可以有变量,也不强制必须有抽象方法。
18、类继承父类与类实现接口,有什么区别?
类继承父类只是单继承,也就是一个子类最多只有一个父类;而类实现接口可以多实现,就是一个子类可以同时实现多个接口,并覆盖所有接口中的所有抽象方法。
19、Comparable接口有什么作用
Comparable接口定义了compareTo(Objecto)方法,可以用来实现对象的比较逻辑,这个接口常常在其他API中强制使用,用来规范对象的比较逻辑。
第三部分异常处理
1、什么是异常?
异常和错误有什么区别?
异常是一些不正常的事件,能够中断程序的正常执行例如才除0计算就是异常。
和错误不同,异常是可以被处理的,而错误往往是不能够处理的,如内存溢出错误。
2、nullPointException是什么异常?
什么情况发生该异常?
NullPointerExcepiton是空指针异常,当一个引用没哟被赋值,就是一null值如
果这种情况下,使用该引用调用其属性或者方法,就会发生NullPointerException异常。
3、说明try/catch/finally语句块的作用
try语句块用来包含可能发生异常的语句,catch块用来捕获异常,finally用来包含必须执行的语句。
4.如何使用语句抛出异常,抛出异常后如何处理?
使用throw语句就可以抛出异常,如thrownewXXXException()。
抛出异常时一般情况下会在声明方法处使用throws声明该类型的异常,调用该方法是编译器将提示异常。
5、throws关键字和throw关键字有什么区别和联系?
throw用来在方法体内抛出异常,而throws用来在方法声明处声明异常。
这两个关键字有着一定的联系。
如果一个方法中使用了throw关键字抛出了异常,那么要么立即用try/catch语句进行捕获,要么就是用throws进行声明,否则将出现编译错误。
然而,
并不是只有使用了throw关键字之后才能使用throws关键字,语法上来说,任何一个方法都可以直接使用throws关键字,抽象方法也可以使用。
6、什么是自定义异常类?
为什么要自定义异常类?
自定义异常类区别于API中的标准异常类,指的是开发人员自己创建的异常类。
只要继承API中某个异常类就可以自定义一个异常类,常常集成Exception类。
自定义异常类主要是为了标记业务逻辑中非正常事件流,避免与API中的标准异常混淆。
第四部分核心API
1、请画出Java集合框架的主要接口和类的继承关系。
2、Collection接口和Map接口分别定义了什么集合类型?
有什么区别?
Collection接口是传统的集合接口,可以把单个对象存储进来。
而Map接口是映射接口,存储的是键值对。
3、用简单代码演示创建一个泛型类为Customer类的List对象,并使用增强for循环迭代集合。
ArrayListlist=newArrayList();
For(Customerc:
list){
}
4、List和Set集合有什么区别?
List实现了列表类型的集合,List中的元素是有序(ordered)的,每个元素根据放入集合的顺序而对应一个索引值,可以根据这个索引值返回集合原宿。
而Set实现了不重复元素集合,即Set中的元素不能够重复,重复的元素将无法添加到集合中。
5、List接口有哪几个实现类?
分别说明其特征
List接口中有以下几个常用实现
1ArrayList:
实现了动态数组的特征。
2LinkedList:
实现了链表的数据结构,LinkedList也可以用作栈或者队列。
3Vector:
向量。
4ArrayListVector类的功能ArrayList都可以实现,区别在于Vector是现行同步的。
6、Collectioin和Collections有什么区别?
Collection是一个接口的名字,定义了集合类型的共同特征。
而Collections是一个类的名字,是集合类型的工具类,类中定义了大量的静态方法,能够操作及和对象。
7、如何将一个Collection转换成数组?
Collection接口中定义了toArray(T[]a)方法来将集合转换为数组,其中T是泛型类型。
8、集合的作用?
集合是可以存储一批类型不同的对象,针对集合的实现类有很多,作用都是一样的,即存储、传输数据,但存储的数据结构不一样,其速度、安全性也不一样。
9、HashMap和TreeMap在性能上有什么样的差别呢?
你比较倾向于使用哪一个?
一个平衡树的性能是O(logn)。
Java里的TreeMap用一个红黑树来保证key/value的排序。
红黑树是平衡二叉树。
保证二叉树的平衡性,使得插入,删除和查找都比较快,时间复杂度都是O(logn)。
不过它没有HashMap快,HashMap的时间复杂度是O
(1),但是TreeMap的优点在于它里面键值是排过序的,这样就提供了一些其他的很有用的功能。
使用无序的HashSet和HashMap,还是使用有序的TreeSet和TreeMap,主要取决于你的实际使用场景,一定程度上还和数据的大小以及运行环境有关。
比较实际的一个原因是,如果插入和更新都比较频繁的话,那么保证元素的有序可以提高快速和频繁查找的性能。
如果对于排序操作(例如产生一个报表合作者运行一个批处理程序)的要求不是很频繁的话,那么把数据以无序的方式存储,然后在需要排序的时候用Collections.sort(…)来进行排序,会比用有序的方式来存储可能会更加高效。
这个只是一种可选的方式,没人能给你一个确切的答案。
即使是复杂度的理论,例如O(n),成立的前提也是在n足够大的情况下。
只要在n足够小的情况下,就算是O(n)的算法也可能会比O(logn)的算法更加高效。
另外,一个算法可能在AMD处理器上的速度比在Intel处理器上快。
如果你的系统有交换区的话,那么你还要考虑磁盘的性能。
唯一可以确定的性能测试途径是用大小合适的数据来测试和衡量程序的性能和内存使用量。
在你所选择的硬件上来测试这两种指标,是最合适的方法。
10、什么是Iterator
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。
迭代器通常被称为“轻量级”对象,因为创建它的代价小。
Java中的Iterator功能比较简单,并且只能单向移动:
(1)使用方法iterator()要求容器返回一个Iterator。
第一次调用Iterator的next()方法时,它返回序列的第一个元素。
注意:
iterator()方法是java.lang.Iterable接口,被Collection继承。
(2)使用next()获得序列中的下一个元素。
(3)使用hasNext()检查序列中是否还有元素。
(4)使用remove()将迭代器新返回的元素删除。
Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。
11、什么是HaspMap和Map?
map是一个接口
hashmap是一个实现了map接口的类
接口不能new
12、Java集合框架都有哪些最佳实践呢?
如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。
如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一个类,应该使用同步的类。
在除需要排序时使用TreeSet,TreeMap外,都应使用HashSet,HashMap,因为他们的效率更高。
要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。
容器类仅能持有对象引用(指向对象的指针),而不是将对象信息copy一份至数列某位置。
一旦将对象置入容器内,便损失了该对象的型别信息。
尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。
这就是针对抽象编程。
13、ArrayList和Vector的区别。
就ArrayList与Vector主要从二方面来说.
一.同步性:
Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的。
二.数据增长:
当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半。
14、ArrayList、Vector、LinkedList的区别?
ArrayList、Vector:
以线性表的方式存储,查、改快,增删慢 。
Vector:
是线程安全,方法是同步方法。
ArrayList:
是线程不安全,方法是非同步方法
LinkedList:
单链表,查、改慢,增删快。
15、Map的接口和特点?
:
键名+键值,键名不可以重复,键值可以重复,通过键名取键值。
HashMap:
线程不安全。
Hasttable:
线程安全。
jsp中的作用域对象(session、request、application、page)属于map这个体系。
16、Collection及Collections的区别?
Collection是一个接口的名字,定义了集合类型的共同特征。
而Collections是一个类的名字,是集合类型的工具类,类中定义了大量的静态方法,能够操作及和对象。
17、假设存在文本文件etc.doc,请用代码展示将文件按行读出,并打印输出到控制台。
Filefile=newFile(“etc.doc”);
try{
FileReaderfr=newFileReader(File);
BufferedReaderbr=newBufferedReader(fr);
Stringline=br.readLine();
while(line==null){
System.out.println(line);
Line=br.readLine();
}
}catch(FileNotFoundExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
};
18、使用java语言如何创建线程对象?
请列出常用的两种方法。
Java语言中经常使用两种方法创建线程。
①创建Thread类的子类,在子类中覆盖Thread类的run方法,实现线程的运行体,只要创建该子类对象就是线程对象。
②创建Runable接口的实现类,在实现类中覆盖接口中的run方法,实现线程的运行体。
使用Thread(Runable)构造方法可以创建线程对象,参数是Runable接口实现类的实例。
19、关键字synchronized有什么作用?
用简单代码展示synchronized的方法。
synchronized可以将某个代码块或者某个方法进行线程同步,被同步的代码块在一个时刻只能被一个线程访问,只有当前线程处理结束后,方能被其他线程访问。
例如:
publicvoidrun(){
for(inti=0;i<50;i++){
synchronized(this){
System,out,println(Thread.currentThread().getName()+”:
x=”+x);
X++;
}
}
}
20、线程之间通信的方法有哪几个?
分别起到什么作用?
线程通信的方法有三个,在Object类中定义。
①wait方法:
使得线程进入等待状态。
②notify方法:
随意通知等待池中的某一个线程。
③notifyAll方法:
通知等待池中所有线程。
第五部分其他特性
1、什么是泛型?
泛型有什么作用?
2、请声明一个简单的泛型类,说明泛型的作用
3、下述代码是否有编译错误,如果有,请指出错误。
ListIs=newArrayList();
List
4、