最新java面试题详细版讲解.docx
- 文档编号:26091283
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:43
- 大小:46.62KB
最新java面试题详细版讲解.docx
《最新java面试题详细版讲解.docx》由会员分享,可在线阅读,更多相关《最新java面试题详细版讲解.docx(43页珍藏版)》请在冰豆网上搜索。
最新java面试题详细版讲解
详解笔试面试题集
(1)下列各题ABCD四个选顼中,只有一个选项是正确的,请将正确选项填写在答题纸上
(1)下列关于栈的描述中错误的是(B)
A.栈是先进后出的线性表
B栈只能顺序存储
C栈具有记忆作用
D对栈的插入弓删除操作中,不需要改变栈底指针
正确答案:
B
分析:
栈是链式存储的
(2)对于长度为n的线性表,在最坏情况下,下列各排序法所对应的比较次数中正确的是()
A冒泡排序为n/2
B冒泡排序为n
C快速排序为n
D快速排序为n(n-l)/2
正确答案:
D
分析:
想想快速排序,每次都会选取线性表的轴值,随后以此轴值划分为两个子线性表再分别进行快排,在最坏情况下,也就是说每次选出的线性表轴值完全不能将这个线性表划分为两个子线性表。
那么此时快速排序退化为冒泡排序了。
那么第一趟排序时,轴值(线性表的中间位置)被选出,这个值绝对是这个线性表中最大的(不然也不能是最坏情况),其他值都比他小,那么线性表现在分为完全不对等的两段(一段是0,另一段是n-1),一段是这个值,一段是其他值。
同样第二趟排序在刚才剩下的值中选中间值(剩余值中最大的那个),又分为不对等两段,依次递推。
也就是说每次都比较了N-1个元素(轴值选出后都与它比较大小),那么肯定是比较了n-1次(如第一次先挑了个轴值,然后剩下n-1比较),n代表当前子线性表中元素个数
由此最白痴的数列问题出现了,如下
1+2+3+..........+n-2+n-1=n(n-1)/2
还有一种投机取巧的方法,在最垃圾情况下既然快排变为冒泡,那由时间复杂度知其必为o(n^2)的复杂度,答案中ABC都是线性时间复杂,显然错误
(3)下列对于线性链表的描述中正确的是()
A存储空间间不一定是连续,且各元素的存储顺序是任意的
B存储空间不一定是连续,且前件元素一定存储在后件元素的前面
C存储定间必须连续,且前件元素一定存储在后件元素的前面
D存储空间必须连续,且各元素的存储顺序是任意的
答案是A,分析链接存储并不要求存储空间连续,存储位置也不用有序
(4)为了使模块爆可能独立,要求()
A模块的内聚程度要尽量高,且各模块间的耦合程度要尽量强
B模块的内聚程度要尽量高,且各模块间的耦合程度要尽量弱
C模块的内聚程度要尽量低,且各模块间的耦合程度要尽量弱
D模块的内聚程度要尽量低,且各模块间的耦合程度要尽量强
答案:
B
分析:
高内聚,低耦合。
5)下列叙述中,正确的是()
AJava语言的标识符是区分大小写的
B源文件名与public类名可以不相同
C源文件扩展名为.jar
D源文件中public类的数目不限
答案:
A
6)下列属于合法的Java标识符是()
A_cat
B5books
C+static
D-3.14159
答案:
A
7)在Java中,表示换行符的转义字符是()
A\n
B\f
C‘n’
D\dd
答案:
A
(8)扯Java中,所有类的根类是()
A.java.lang.Object
B.java.lang.Class
C.java.applet.Applet
D.java.awt.Frame
答案:
A
(9).在Java+中,用Package语句说明一个包时,该包的层次结构必须是()
A与文件的结构相同
B与文件目录的层次相同
C与文件类型相同
D与文件大小相同
答案:
A
(10)在读字符文件Employee.dat时,使用该文件作为参数的类是()。
ABufferReader
BDatalnputStream
CDataOutoutStream
DFileInputStream
答案:
D
(11)在Java中,能实现多重继承效果的方式是()。
A内部类
B适配器
C接口
D同步
答案:
C
(12)char类型的取值范围是()。
A2-7~27-1
B0~216-1
C-215~215—1
D0~28-1
答案:
A
(13)下列方法中可以用来创建一个新线程的是()。
A实现java.lang.Runnable接口并重写start0方法
B实现java.iang.Runnable接口并重写run0方法
C继承java.lang.Thread类并重写run0方法
D继承java.lang.Thread类并重写start0方法
答案:
C
(14)下列关于线程优先级的说法中,正确的是()。
A.线程的优先级是不能改变的
B.线程的优先级是在创建线程时设置的
C.在创建线程后的任何时候都可以设置
D.B和C
答案:
C
(15)下列代码中,将引起一个编译错误的行是()。
1)publicclassTest{
2)intm,n;
3)publicTest(){}
4)publicTest(inta){m=a;)
5)publicstaticvoidmain(Stringargs0){
6)Testt1,t2;
7)intj,k;
8)j=0;k=0;
9)t1=newTest();
10)t2=newTest(j,k);
11)}
12)}
A.第3行
B.第5行
C.第6行
D.第10行
答案:
D
(16)阅读下列代码后
publicclassPerson{
intarr[]=newint[10];
publicstaticvoidmain(Stringargs[]){
System.out.println(arr[l]);
}
)
正确的说法是()。
A编译时将产生错误
B编译时正确,运行时将产生错误
C输出零
D输出空
答案:
A
(17)AIDL支持以下哪种数据类型?
l)string2)list3)map4)Allnativejavadatatype(){,
A.1,2和3
B.4
C.以上所有
D.都不支持
答案:
C
分析:
AIDL服务只支持有限的数据类型,如果用AIDL服务传递一些复杂的数据就需要做更一步处理,AIDL服务支持的数据类型如下:
1.Java的原生类型
2.String和CharSequence
3.List和Map,List和Map对象的元素必须是AIDL支持的数据类型;
以上三种类型都不需要导入(import)
4.AIDL自动生成的接口
需要导入(import)
5.实现android.os.Parcelable接口的类. 需要导入(import)。
二、多项选择题
下列各题A.、B.、C.、D.四个选项中,有一个或多个选项是正确的,
(l)下列说法正确的有()。
A.环境变量可在编译sourcecode时指定.
B.在编译程序时,所能指定的环境变盛不包括classpath
C.javac-次可同时编译数个Java源文件
D.javac.exe能指定编译结果要置于哪个目录(directory)
答案:
BCD
(2)不能用来修饰interface的有()
A.privateB.publicC.protectedD.static
答案:
ACD
(3)下列说法错误的有()
A.在类方法中可用this来调用本类的类方法
B。
在类方法中调用本类的类方法时可直接调用
C.在类方法中只能调用本类中的类方法
D.在类方法中绝对不能调用实例方法
答案:
ACD
请将正确选项填写在答题纸上
(4)下列说法错误的有()
A.Java面向对象语言容许单独的过程与函数存在
B.Java面向对象语言容许单独的方法存在
C.Java语亩中的方法属于类中的成员(member)
D.Java语言中的方法必定隶属于某…类(对象),调用方法与过程或函数相同
答案:
ABC
(5)下列说法错误的有()。
A.能被java.exe成功运行的javaclass文件必须有main()方法
B.J2SDK就是JavaAPI
C.Appletviewer.exe可利用jar选项运行Jar文件
D.能被Appletviewer成功运行的javaclass文件必须有main()方法
答案:
BCD
三、判断题
请将每空的正确答案写在答题纸上,答在试卷上不得分。
(1)Java程序中的起始类名称必须与存放该类的文件名相同。
(对)
(2)Unicode是用16位来表示一个字的。
(对)
(3)原生类中的数据类型均可任意转换。
(对)
三、填空题
请将每空的正确答案写在答题纸上【l】至【25】序号的横线上,答在试卷上不得分。
(l)某二叉树中度为2的结点有18个,则该二叉树中有【1】19个叶子结点。
二叉树的终端结点(叶子结点)数等于双分支结点数加1。
(2)在面向对象方法中,类的实例称为【2】对象
(3)诊断和改正程序中错误的工作通常称为【3】Debug
(4)在关系数据库中,把数据表示成二维表,每一个二维表称为【4】关系
(5)Java源文件中最多只能有一个【5】public类,其他类的个数不限。
(6)线程在生命周期中要经历5中状态,分别是新建状态(准备)、可运行状态(就绪)、运行状态(运行)。
【6】暂停(阻塞)状态和终止状态(死亡)。
(7)FileInputStream是字节流;BufferedWriter是字符流,ObjectOutputStream是【7】
对象序列化流
(8)当使用Threadt=newThread(r)创建一个线程时,表达式rinstanceofThread的值为【8】false。
rinstanceOfRunnable
1.抽象类和接口的区别?
抽象类:
1)抽象方法,只有行为的概念,没有具体的行为实现。
使用abstract关键字修饰,没有方法体。
子类必须重写这些抽象方法。
2)包含抽象方法的类,一定是抽象类。
3)抽象类只能被继承,一个类只能继承一个抽象类。
接口:
1)全部的方法都是抽象方法,属型都是常量
2)不能实例化,可以定义变量。
3)接口变量可以引用具体实现类的实例
4)接口只能被实现,一个具体类实现接口,必须实现全部的抽象方法
5)接口之间可以多实现
6)一个具体类可以实现多个接口,实现多继承现象
2.列举你所知道的线程同步的方法:
1)wait():
让线程等待。
将线程存储到一个线程池中。
2)notify():
唤醒被等待的线程。
通常都唤醒线程池中的第一个。
让被唤醒的线程处于临时阻塞状态。
3)notifyAll():
唤醒所有的等待线程。
将线程池中的所有线程都唤醒。
3.equals()方法和“==”操作符的区别是什么?
重写equals()方法的时候,我们还需要重写哪些方法?
为什么?
“==”比较的是一个对象在内存中的地址值,栈中的内容是否相同
equals()是针对引用的,比较的是引用类型的内容一样不一样,堆中的内容是否相同
重写equals()方法的时候,需重写hashcode方法,这样比较的时候,比较的是两个对象的hash值,不同对象的hash值不同。
7.写一个函数计算但参数为n(n很大)时的值1-2+3-4+5-6+7……+n。
(提示:
考虑程序执行效率)
privatestaticvoidjisuan(intn){
intsum=0;
if(n%2==0){
sum=-(n/2);
System.out.println(""+sum);
}else{
sum=-(n-1)/2+n;
System.out.println(""+sum);
}
}
(11)简述String和StringBuffer、ArrayList和LinkedList、HashMap和HashTable的特点及区别。
答:
String对象的长度一旦定义就固定就不可以改变,对于已经存在的String对象的修改都是创建一个新的对象,然后把新的值存进去,String类不能被继承。
StringBuffer是一个可变对象,当对它进行修改的时候不会像String那样重新建立对象。
它只能通过构造函数来建立对象。
另外StringBuffer还是一个线程安全的类。
ArrayList是实现了基于动态数组的数据结构用于,LinkedList基于连表的数据结构,二者都可以存储对象的引用。
对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。
对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,在只有一个线程访问的情况下,效率要高于Hashtable。
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。
因为contains方法容易让人引起误解。
Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Mapinterface的一个实现。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap就必须为之提供外同步。
Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。
就HashMap与HashTable主要从三方面来说。
一.历史原因:
Hashtable是基于陈旧的Dictionary类的,HashMap是Java1.2引进的Map接口的一个实现
二.同步性:
Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的
三.值:
只有HashMap可以让你将空值作为一个表的条目的key或value
求质数的多种优化方式
答:
一般我们求质数时都会去计算小于某一个数N的质数而不会不加限定,现在我们以求小于N的质数来说一说优化方式。
在我们求质数的过程中一般会用到两种方法试除法和筛选法两种,现在下来说一下试除法:
.判断小于N的数X是否是质数,就是从2一直尝试到X-1,这种做法效率最差,并不可取----->
如果X是质数,那么它如果不能被小于X/2的数整除即可,这样算法效率提高一些---->
除了2以外,所有的质数都只能是奇数,所以我们可以将数X先试除2,然后尝试从3一直到X/2的所有奇数----->
其实判断一个数是否是质数,只需判断一个数能不能被除了1之外小于
的数整除即可,----->
最后,我们可以利用前面求出来的质数来判断,我们只需判断X能不能被小于
的质数整除即可,这样效率是不是更高。
再说筛选法:
对于使用筛选法的优化主要是从空间上考虑
定义一个容器,将数据放入容器中,然后遍历其中的数据,将是合数的数据删除,最后剩余的就是质数了------>
我们可以定义一个布尔类型的数组容器,将其中的值都赋值为true,在筛选的过程中将不是质数的数作为数组的下标将对应元素的值改为false,最后取出值为true的元素的下标即可----->
构造定长的byte数组,数组的每个byte存储8个布尔值,这样性能是不是又有了提高呢。
(14)简述几种排序方式(至少四种,可以从以下各个方面来比较这几种算法,例如从时间复杂度和空间复杂度)
排序法
最差时间分析
平均时间复杂度
稳定度
空间复杂度
冒泡排序
O(n2)
O(n2)
稳定
O
(1)
快速排序
O(n2)
O(n*log2n)
不稳定
O(log2n)~O(n)
选择排序
O(n2)
O(n2)
稳定
O
(1)
二叉树排序
O(n2)
O(n*log2n)
不一定
O(n)
插入排序
O(n2)
O(n2)
稳定
O
(1)
堆排序
O(n*log2n)
O(n*log2n)
不稳定
O
(1)
希尔排序
O(n1.25)
不稳定
O
(1)
冒泡排序:
(BubbleSort)冒泡排序方法是最简单的排序方法。
这种方法的基本思想是,将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮。
在冒泡排序算法中我们要对这个“气泡”序列处理若干遍。
所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确。
如果发现两个相邻元素的顺序不对,即“轻”的元素在下面,就交换它们的位置。
显然,处理一遍之后,“最轻”的元素就浮到了最高位置;处理二遍之后,“次轻”的元素就浮到了次高位置。
在作第二遍处理时,由于最高位置上的元素已是“最轻”元素,所以不必检查。
一般地,第i遍处理时,不必检查第i高位置以上的元素,因为经过前面i-1遍的处理,它们已正确地排好序。
插入排序(InsertionSort)插入排序的基本思想是,经过i-1遍处理后,L[1..i-1]己排好序。
第i遍处理仅将L插入L[1..i-1]的适当位置,使得L[1..i]又是排好序的序列。
要达到这个目的,我们可以用顺序比较的方法。
首先比较L和L[i-1],如果L[i-1]≤L,则L[1..i]已排好序,第i遍处理就结束了;否则交换L与L[i-1]的位置,继续比较L[i-1]和L[i-2],直到找到某一个位置j(1≤j≤i-1),使得L[j]≤L[j+1]时为止。
选择排序(SelectionSort)选择排序的基本思想是对待排序的记录序列进行n-1遍的处理,第i遍处理是将[i..n]中最小者与位置i交换位置。
这样,经过i遍处理之后,前i个记录的位置已经是正确的了。
快速排序(QuickSort)快速排序是对冒泡排序的一种本质改进。
它的基本思想是通过一趟扫描后,使得排序序列的长度能大幅度地减少。
在冒泡排序中,一次扫描只能确保最大数值的数移到正确位置,而待排序序列的长度可能只减少1。
快速排序通过一趟扫描,就能确保某个数(以它为基准点吧)的左边各数都比它小,右边各数都比它大。
然后又用同样的方法处理它左右两边的数,直到基准点的左右只有一个元素为止。
一、专业知识
1、a0=1、a1=1、a2=a1+a0、a3=a2+a1,以此类推,请写代码用递归算出a30?
3、简述值类型和引用类型的区别
值类型包括简单类型、结构体类型和枚举类型,引用类型包括自定义类、数组、接口、委托等
他们两在内存中存储的方式不同,值类型以栈的方式存储的,引用类型以堆的方式;前者是真实的存储空间,后者只是存储地址的引用!
4、简述类中的静态成员和非静态成员的区别
静态变量使用static修饰符进行声明,在类被实例化时创建,通过类进行访问。
不带有static修饰符声明的变量称做非静态变量,在对象被实例化时创建,通过对象进行访问。
一个类的所有实例的同一静态变量都是同一个值,同一个类的不同实例的同一非静态变量可以是不同的值。
静态函数的实现里不能使用非静态成员,如非静态变量、非静态函数等。
5、什么是单例?
一个类中只有一个实例并且自行化向整个系统提供这个实例叫单例
下面程序段的输出结果是:
Voidcomplicatedex(){
intx=20,y=30;
booleanb;b=x>50&&y>60||x>50&&y<-6||x<-50&&y>60||x<-50&&y<-60;
system.out.println(b);
}
结果为:
fasle
super()和this()的区别
Super()指父类的无参构造方法,this()指当前类的无参构造方法,两者都必须写在构造方法的第一句
2、Java中public,private,protected,和默认的区别
a、private修饰词,表示成员是私有的,只有自身可以访问;
b、protected,表示受保护权限,体现在继承,即子类可以访问父类受保护成员,同时相同包内的其他类也可以访问protected成员。
c、无修饰词(默认),表示包访问权限(friendly,java语言中是没有friendly这个修饰符的,这样称呼应该是来源于c++),同一个包内可以访问,访问权限是包级访问权限;
d、public修饰词,表示成员是公开的,所有其他类都可以访问;
3、描述一下java的事件委托机制和垃圾回收机制
java事件委托机制:
一个源产生一个事件时,把他送到一个或多个监听器那里,在这种机制种,监听器只是等待,一旦收到事件,处理事件并返回;
Java垃圾回收:
是一种动态存储管理技术,它自动地释放不再被程序引用的对象,按照特定的垃圾收集算法来实现资源自动回收的功能。
当一个对象不再被引用的时候,内存回收它占领的空间,以便空间被后来的新对象使用,以免造成内存泄露。
什么是java序列化,如何事件java序列化
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。
可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。
序列化是为了解决在对对象流进行读写操作时所引发的问题。
publicclassCatimplementsSerializable{}
……
Try{
FileOutputStreamfos=newFileOutputStream("catDemo.out");
ObjectOutputStreamoos=newObjectOutputStream(fos);
System.out.println("1>"+cat.getName());
cat.setName("MyCat");
oos.writeObject(cat);
oos.close();
}catch(Exceptione){
……
}
……
overload和overrride的区别。
Overloaded的方法和是否可以改变返回值类型
override(重写,覆盖)
1、方法名、参数、返回值相同。
2、子类方法不能缩小父类方法的访问权限。
3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。
4、存在于父类和子类之间。
5、方法被定义为final不能被重写。
overload(重载,过载)
1、参数类型、个数、顺序至少有一个不相同。
2、不能重载只有返回值不同的方法名。
3、存在于父类和子类、同类中。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新 java 试题 详细 讲解