Java基础面试题及答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Java基础⾯试题及答案
JAVA基础部分-选择题
(单选)1.在Java语⾔中,字符串“Java程序员”在内存中所占⽤的字节数是:()。
A.10
B.7
C.13
D.14
2. (单选)下列表达式中,可以得到精确结果的是()。
A.double d1 = 3.0 - 2.6;
B.double d4 = 2.5 * 1.5;
C.double d2 = 30/300;
D.double d3 = 1/2 + 0.5;
3.(多选)所谓“⽔仙花”数是⼀个整数等于各位数字⽴⽅的和,例如:153 = 111+555+333,下⾯的程序⽤于输出2~1000内的⽔仙花数:
下列选项中,空⽩处可以填⼊的代码是:()。
A.int s = 0, n1 = n; while (n1 > 0) { int t = n1 % 10; s += t * t * t; n1 /= 10; }
B.int s = 0, n1 = n; while (n1 > 0) { int t = n1 / 10;s+= t * t * t; n1 %= 10; }
C.int s = 0; for(int n1 = n; n1>0; n1 /= 10) { int t = n1%10; s += t * t * t; }
D.int s = 0; for(int n1 = n; n1>0; n1 %= 10) { int t = n1 / 10; s += t * t * t; }
4.下列语句序列执⾏后,k 的值是 ( )
A.60
B.5
C.0
D.54
5.设 a = 8,则表达式 a >>> 2 的值是:(⽆符号右移动)( )
A.1
B.2
C.3
D.4
6.下列程序
在程序中插⼊下列哪⼀⾏代码可以编译通过: A static void doSomething(int[] args){}
B static void doSomething(int... args){}
C static coid doSomething(int...args,int x){}
D static void doSomething(int x,int...args){}
简答题
1.现有⼀个长度为20的数组,数组内的数字0-9之间的任意数字,统计出数组中每个元素出现的次数?现有⼀个字符串"fdasafdasfdasa",现统计出⼦串"as"出现的次数.
2.请描述冒泡排序算法的基本思想。
3.⼀个数组中只有0,1两种数字,进⾏排序,0全部在前,1全部在后OOP部分
1.(单选)关于下列代码说法正确的是:
A.该类编译失败
B.输出:1
C.输出:3
D.输出:0
2.试图编译和运⾏以下代码,将获得什么结果(JAVA)
A RType.amethod -1 RType.amethod -1
B RType.amethod 99 RType.amethod -1
C 99 RType.amethod 99
D 编译时错误(Compile time error)
3、下边程序运⾏的结果是? ( )
A.Base
B.BaseBase
C.程序编译失败.
D.程序运⾏但没有任何输出
4.指出下列程序运⾏的结果
A.good and abc
B.good and gbc
C.test ok and abc
D.test ok and gbc
OOP部分-简答题
1.抽象类和接⼝的区别
2.静态变量和实例变量的区别?
3.String s = new String("xyz");创建了⼏个String Object ?
4.字符串连接时为什么推荐使⽤StringBuffer⽽不是直接⽤String+String的⽅式,请简述原因?
5.final, finally, finalize的区别。
6.线程
继承Thread类如果某个类继承了Thread类,那么此时这个类就是⼀个线程类,如果要创建此类的线程对象 A extends Thread A a = new A(); a.start()
实现Runnable接⼝如果某个类实现了Runnable接⼝,此时这个类不是线程类,这个类中只有将线程要执⾏的任务写好了
⽣命周期:5种状态
新建,就绪,运⾏,阻塞,死亡
多线程并发问题:
脏数据:污染了数据 -前提条件:多个线程访问同⼀个对象
如何避免脏数据的产⽣:线程同步 - synchronized
可以⽤来修饰⽅法,代码块:本质是给对象加锁
如果修饰⽅法:给调⽤⽅法的对象(this)加锁
如果修饰代码块: sychronized(要加锁的对象){} ⼀般情况下,加锁的对象都为this 线程间的通信 - 线程间要交流
⽣产者消费者
Object类下的⼏个⽅法来实现了线程间的通信
wait() :⼀定出现在sychronized的⽅法中
notify() notifyAll()
线程池:
Excutors.newFixedThreadPool(int nThread) - ExcutorService
execute()
ThreadLocal:将数据绑定到当前线程上,那么在整个线程过程中都可以使⽤该数据IO流: RandomAccessFile:随机访问流(任意访问流)
特殊之处:
1.这个流既可以读⽂件,也可以写⽂件
2.可以定位到⽂件的任意位置,⽽且可以获取当前的偏移量
RandomAccessFile(File dest,String mode)
read() write() - 按照字节
seek(long pos)
getFilePointer() - long
数据库部分-选择题
1.当在执⾏过程中,如果QUANTITY的值是空的话,哪个语句将显⽰⼀个0?
A.SELECT id_number,100/quantity FROM inventory;
B.SELECT id_number,NVL(100/quantity,0) FROM inventory;
C.SELECT id_number,NULL(100/quantity,0) FROM inventory;
D.SELECT id number,TO CHAR(100/quantity,0) FROM inventory;
2.分析下⾯SQL语句,在什么情况下引起这个语句失败?STUDEN表结构:ID NUMBER(9) FIRST NAME VARCHAR2(25) LAST NAME VARCHAR2(25)
A.在数据表中没有学⽣的名字是Kate Henry
B.数据表中学⽣的名字叫Kate的多于⼀个
C.数据表中的学⽣的名字叫Kate Henry的多于⼀个
D.FIRST NAME和LAST NAME的值在数据库中是⼩写的
3.分析下⾯的SQL语句,这个语句为什么会出现⼀个错误?
A.⼀个⼦句丢失
B.⼀个关键字丢失
C.where⼦句不能应⽤在创建表上
D.数据类型在新表中不需要被定义
4.在SQL语⾔中,关于主键描述正确的是()(多选)
A 只能包含⼀列
B 可以包含两列
C 可以包含⼀列或者多列
D 以上都不正确
数据库简答题
1.写SQL语句显⽰员⼯表中⼯资超过平均⼯资的员⼯。
2.假如订单表orders⽤来存储订单信息,cid代表客户编号,money代表单次订购额,现要查询每个客户的订购次数和每个客户的订购总⾦额?
统计单笔消费超过50元的⽤户总共的消费次数以及消费总⾦额,总⾦额>2000 3. 表PERSONNEL 的结构如下:
在这⾥, 部门的管理者也看作是雇员,写出SQL语句查询每个雇员的姓名以及管理者的姓名
4.ORACLE数据库有哪⼏种约束类型?
5.请分别写出mysql与oracle的分页查询语句(查询第3-第7条数据)
6.写⼀个查询,来查询出挣到佣⾦(comm)的雇员姓名ename,部门名称,和部门所处的位置loc。
(有employ表和dept表)
7.写⼀个查询,查出在名字⾥⾯有⼀个"A"的所有雇员姓名ename和其所在的部门loc的名称。
8.显⽰所有薪⾦⾼于各⾃部门平均薪⾦的⼈?
9.查询平均成绩⼤于60分的同学的学号和平均成绩;
Servlet部分
1.JSP九⼤内置对象,Servlet域对象以及各⾃的作⽤范围
2.说出Servlet的⽣命周期?
5.请简述mvc架构。
同时说明在⾃⼰熟悉的架构中mvc分别对应什么?
框架部分
1.请描述⼀下spring MVC⼯作原理。
2.Spring的核⼼是什么?
JAVA基本部分-选择题
1.D
2.B
解析:此题考查java的浮点运算的精度问题,浮点数是以⼆进制得形式存储得,如0.5 = 2得-1次⽅
选项A 返回结果0.3999999999999999
选项B 返回结果3.75
选项C 返回结果0.0 因为30和300都是整数,只要把任何⼀个定义成浮点型数据,数据会更精确
选项D 返回结果0.5 原理同选项C
3.AC
解析:固定算法,只是⽤while循环或for循环
4.D
解析:switch分⽀结构如果在case的语句体中添加break;语句,那么只要找到对应的case 的常量,就执⾏对应case常量后的语句,如果没有break语句就继续执⾏后⾯所有case 后的语句如果最后有default也会执⾏。
5.B
解析:Java中的位运算符: \int类型占4个字节,⼀个字节占8位,所以⼀个int数字占⽤32位。
>>表⽰右移,如果该数为正,则⾼位补0,若为负数,则⾼位补1; >>>表⽰⽆符号右移,也叫逻辑右移,即若该数为正,则⾼位补0,⽽若该数为负数,则右移后⾼位同样补0。
6.BD
解析:根据题意,⽅法名称不变,参数的个数可变,解决⽅案是⽤可变参数类型...类型名称⽐如:int... args 可变参数其本质是⼀个数组,且必须放在⽅法参数的最后⼀个位置,可以接受零个或多个参数,在⽅法中使⽤数组⽅式来访问,⽐如:args[0] args[1]..... 简答:
1.
2.答案:
1.冒泡排序的基本思想冒泡排序是交换排序中⼀种简单的排序⽅法。
它的基本思想是对所有相邻记录的关键字值进⾏⽐效,如果是逆顺(a[j]>a[j+1]),则将其交换,最终达到有序化。
其处理过程为:(1)将整个待排序的记录序列划分成有序区和⽆序区,初始状态有序区为空,⽆序区包括所有待排序的记录。
(2)对⽆序区从前向后依次将相邻记录的关键字进⾏⽐较,若逆序将其交换,从⽽使得关键字值⼩的记录向上"飘浮"(左移),关键字值⼤的记录好像⽯块,向下“堕落”(右移)。
每经过⼀趟冒泡排序,都使⽆序区中关键字值最⼤的记录进⼊有序区,对于由n个记录组成的记录序列,最多经过n-1趟冒泡排序,就可以将这n个记录重新按关键字顺序排列。
2.原始的冒泡排序算法对由n个记录组成的记录序列,最多经过(n-1)趟冒泡排序,就可以使记录序列成为有序序列,第⼀趟定位第n个记录,此时有序区只有⼀个记录;第⼆趟定位第n-1个记录,此时有序区有两个记录;以此类推,算法框架为: for(i=n;i>1;i--) { 定位第i个记录; }
若定位第i个记录,需要从前向后对⽆序区中的相邻记录进⾏关键字的⽐较,它可以⽤如下所⽰的语句实现。
下⾯给出完整的冒泡排序算法: for(int i=0;i
for(int j=0;j
if(arr[j]>arr[j+1]){ int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp; } } }
3.答案:
OOP部分-选择题
1.A
2.B
3.B
7.B
解析:数组和对象在作为数的参数传递的时候,是引⽤传递,如果在⽅法中对其做过修改,则真的会影响原始数据
OOP部分-简答题
1.
2.答案:
在语法定义上的区别:
静态变量前要加static 关键字,⽽实例变量前则不加。
在程序运⾏时的区别:
实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使⽤这个实例变量。
静态变量不属于某个实例对象,⽽是属于类,所以也称为类变量,只要程序加载了类的字节码,不⽤创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使⽤了。
总之,实例变量必须创建对象后才可以通过这个对象来使⽤,静态变量则可以直接使⽤
类名来引⽤。
3.答案:
只要是new,都是重新分配堆空间,如果不区分栈和堆,这⾥创建了1个String Object。
如果是从jvm⾓度来说的话,它是创建了两个对象,String s是在栈⾥创建了⼀个变量,new String("xyz")是在堆⾥创建了⼀个对象并被s引⽤到。
如果是String s = "xyz",那就要看常量池⾥有没有"xyz",如果有直接引⽤,如果没有则创建再引⽤这⾥"xyz"本⾝就是pool中的⼀个对象,⽽在运⾏时执⾏new String()时,将pool中的对象复制⼀份放到
heap中,并且把heap中的这个对象的引⽤交给s持有。
ok,这条语句就创建了2个String对象。
难度等级:中
4.
答案:
每次String+String都会⽣成⼀个新的String,⽽使⽤StringBuffer则不会出现此种情况,可以减少String对象的实例化次数。
5.
(1)final为关键字;可以修饰类,⽅法,变量
(2)finalize()为⽅法;由JVM进⾏调⽤,⽤于对对象进⾏垃圾回收
(3)finally:⽤于标识代码块,与try{}进⾏配合,不论try中的代码执⾏完或没有执⾏完(这⾥指有异常),该代码块之中的程序必定会进⾏;通常⽤于释放资源 A demoGC = new A();
demoGC = null;
System.gc();
System.out.println("gc was runed ");
public class A { @Override
protected void finalize() throws Throwable {。