Java工程师上机笔试真题(含详细答案解析)_第1页
Java工程师上机笔试真题(含详细答案解析)_第2页
Java工程师上机笔试真题(含详细答案解析)_第3页
Java工程师上机笔试真题(含详细答案解析)_第4页
Java工程师上机笔试真题(含详细答案解析)_第5页
已阅读5页,还剩5页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java工程师上机笔试真题(含详细答案解析)适用岗位:初级/中级Java开发工程师考试时长:120分钟满分:100分考试说明:本试卷分为选择题、填空题、简答题、编程题四个部分,所有题目独立作答,编程题需保证代码可正常编译运行,逻辑完整。一、单项选择题(共10题,每题2分,共20分)1.以下关于Java基本数据类型的说法,正确的是()A.byte类型取值范围是-128~128B.float类型数值可以直接赋值给double类型变量C.char类型可以存储中文汉字D.boolean类型可以赋值为0和12.下列关于String、StringBuilder、StringBuffer的描述,错误的是()A.String是不可变字符序列B.StringBuffer线程安全,效率较低C.StringBuilder线程不安全,效率较高D.频繁字符串拼接场景,优先使用String3.Java中接口和抽象类的核心区别,说法错误的是()A.抽象类可以有构造方法,接口没有构造方法B.抽象类可以包含普通成员变量,接口只能有常量C.一个类只能继承一个抽象类,可实现多个接口D.抽象类和接口都能被实例化4.以下集合中,线程安全的是()A.ArrayListB.HashMapC.VectorD.HashSet5.关于Java异常机制,说法正确的是()A.Error属于可捕获异常B.Exception分为编译时异常和运行时异常C.运行时异常必须手动try-catch捕获D.finally代码块一定会执行,哪怕有return语句6.HashMap的底层数据结构在JDK1.8之后是()A.单纯数组B.数组+链表C.数组+链表+红黑树D.数组+红黑树7.以下关键字中,不能修饰局部变量的是()A.finalB.staticC.volatileD.transient8.Java中重写(override)和重载(overload)的区别,说法正确的是()A.重写方法参数列表可以不同B.重载方法返回值类型必须一致C.重写发生在父子类之间,重载发生在同一个类中D.重写方法权限修饰符范围必须更小9.关于Java泛型,说法错误的是()A.泛型可以避免类型强制转换B.泛型只在编译期生效,运行期会被擦除C.可以使用基本数据类型作为泛型参数D.通配符?可以匹配任意类型10.以下关于IO流的说法,正确的是()A.FileReader属于字节输入流B.字节流适合处理文本文件,字符流适合处理二进制文件C.BufferedReader可以高效读取文本行数据D.IO流使用完毕无需手动关闭,JVM会自动回收二、填空题(共8空,每空2分,共16分)1.Java中多态的实现前提是:继承、________、________。2.synchronized关键字可以修饰________、________和代码块。3.List集合特点是________,Set集合特点是________。4.Java线程的五大状态分别是:新建、就绪、运行、________、________。三、简答题(共4题,每题6分,共24分)1.简述==和equals()方法的区别?2.简述HashMap和ConcurrentHashMap的区别?3.简述Java中final、finally、finalize的区别?4.简述线程池的核心参数及核心作用?四、编程题(共3题,共40分)1.基础编程:字符串反转(12分)需求:编写Java方法,实现对任意输入字符串的反转,不使用JDK自带的反转工具类,考虑空字符串、null、单字符边界场景。2.集合编程:数组去重排序(14分)需求:给定一个乱序且包含重复元素的int数组,编写代码实现两个功能:①去除数组中重复元素;②对去重后的数组进行升序排序;③最终返回新数组。禁止直接使用Arrays.sort和集合去重的快捷方法,手动实现核心逻辑。3.多线程编程:交替打印数字和字母(14分)需求:创建两个线程,线程1打印1-5的数字,线程2打印A-E的大写字母,两个线程交替执行,最终输出结果为:1A2B3C4D5E,保证线程执行顺序不乱序。参考答案及详细解析一、单项选择题答案及解析1.答案:C解析:A选项byte取值范围-128~127;B选项float是单精度,不能直接赋值给double,需要强制转换;D选项boolean类型只有true/false两个值;char类型占2字节,可存储中文汉字。2.答案:D解析:String字符串不可变,每次拼接都会生成新对象,频繁拼接效率极低,优先使用StringBuilder/StringBuffer。3.答案:D解析:抽象类和接口都属于抽象结构,不能直接实例化,只能通过子类实现、实例化子类对象。4.答案:C解析:ArrayList、HashMap、HashSet均为线程不安全集合;Vector是线程安全的动态数组,底层加了synchronized锁。5.答案:B解析:A选项Error是系统级严重错误,无法捕获;C选项运行时异常无需手动捕获,可自动抛出;D选项若代码中执行System.exit(0)退出JVM,finally不会执行。6.答案:C解析:JDK1.7及以前HashMap底层是数组+链表;JDK1.8优化为数组+链表+红黑树,链表长度大于8且数组长度大于64时转为红黑树,提升查询效率。7.答案:B解析:static修饰静态成员,属于类级别,局部变量是方法级别,不能用static修饰。8.答案:C解析:重写要求方法名、参数列表、返回值完全一致;重载要求方法名一致、参数列表不同;重写权限修饰符范围只能更大或相等。9.答案:C解析:泛型只能使用引用类型,不支持byte、int、char等基本数据类型。10.答案:C解析:A选项FileReader是字符输入流;B选项字节流处理二进制文件,字符流处理文本文件;D选项IO流必须手动关闭,否则会造成资源泄漏。二、填空题答案及解析1.方法重写、向上转型解析:Java多态三大核心前提:继承关系、子类重写父类方法、父类引用指向子类对象(向上转型)。2.静态方法、普通方法解析:synchronized三种修饰场景:静态方法(锁类)、实例方法(锁对象)、代码块(自定义锁)。3.有序可重复、无序不可重复解析:List(ArrayList、LinkedList)元素存入顺序和取出顺序一致,允许重复元素;Set(HashSet、TreeSet)不允许重复元素,无序存储。4.阻塞、终止解析:Java线程完整生命周期:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)、终止(Terminated)。三、简答题答案解析1.==和equals()方法的区别①作用不同:==是运算符,可用于基本数据类型和引用类型;equals()是Object类的方法,仅用于引用类型。②比较规则不同:基本类型中==比较数值大小;引用类型中==比较对象的内存地址;equals()默认比较对象地址,重写后(如String、Integer)比较对象内容。③特殊说明:自定义类若未重写equals(),默认和==效果一致,比较内存地址。2.HashMap和ConcurrentHashMap的区别①线程安全:HashMap线程不安全,多线程并发操作会出现数据覆盖、死循环问题;ConcurrentHashMap是线程安全的并发集合。②锁机制:JDK1.8中ConcurrentHashMap采用CAS+synchronized分段锁,只锁住当前操作的链表/红黑树节点,并发效率高;HashMap无锁机制。③适用场景:HashMap适用于单线程场景;ConcurrentHashMap适用于多线程并发读写场景。3.final、finally、finalize的区别①final:是修饰符,可修饰类、方法、变量。final类不可继承,final方法不可重写,final变量不可二次赋值。②finally:是异常处理关键字,搭配try-catch使用,代码块中的代码无论是否异常都会执行,用于释放资源。③finalize:是Object类的废弃方法,JVM垃圾回收前会调用该方法,用于对象资源回收,目前已被废弃,不推荐使用。4.线程池的核心参数及核心作用线程池核心参数共7个,核心4个参数作用如下:①核心线程数:线程池常驻线程数,即使空闲也不会被回收;②最大线程数:线程池允许创建的最大线程数量,任务爆满时扩容;③空闲超时时间:非核心线程的空闲存活时间,超时无任务则被回收;④任务队列:存储等待执行的任务,核心线程满负荷后,新任务进入队列排队。其余参数为线程工厂、拒绝策略、超时时间单位,用于自定义线程创建规则和任务爆满后的处理逻辑。四、编程题答案解析(可直接运行)1.字符串反转代码实现java

publicclassStringReverse{

//字符串反转方法

publicstaticStringreverse(Stringstr){

//处理边界场景:null、空字符串

if(str==null||str.length()<=1){

returnstr;

}

//手动反转字符

char[]chars=str.toCharArray();

intleft=0;

intright=chars.length-1;

while(left<right){

//交换左右指针字符

chartemp=chars[left];

chars[left]=chars[right];

chars[right]=temp;

left++;

right--;

}

returnnewString(chars);

}

publicstaticvoidmain(String[]args){

//测试用例

System.out.println(reverse("abc123"));//321cba

System.out.println(reverse(""));//空字符串

System.out.println(reverse("A"));//单字符A

System.out.println(reverse(null));//null

}

}解析:通过双指针法手动交换字符,覆盖所有边界场景,不依赖任何工具类反转方法,效率较高。2.数组去重+升序排序代码实现java

publicclassArrayDeal{

publicstaticint[]distinctAndSort(int[]arr){

//处理空数组

if(arr==null||arr.length==0){

returnnewint[0];

}

//1.手动去重

int[]temp=newint[arr.length];

intindex=0;

for(inti=0;i<arr.length;i++){

booleanisRepeat=false;

//遍历已存入的元素,判断是否重复

for(intj=0;j<index;j++){

if(arr[i]==temp[j]){

isRepeat=true;

break;

}

}

if(!isRepeat){

temp[index++]=arr[i];

}

}

//截取有效长度数组

int[]newArr=newint[index];

System.arraycopy(temp,0,newArr,0,index);

//2.手动冒泡升序排序

for(inti=0;i<newArr.length-1;i++){

for(intj=0;j<newArr.length-1-i;j++){

if(newArr[j]>newArr[j+1]){

intt=newArr[j];

newArr[j]=newArr[j+1];

newArr[j+1]=t;

}

}

}

returnnewArr;

}

publicstaticvoidmain(String[]args){

int[]oldArr={2,5,2,1,3,5,4,1};

int[]resArr=distinctAndSort(oldArr);

//输出结果:[1,2,3,4,5]

for(intnum:resArr){

System.out.print(num+"");

}

}

}解析:双层循环手动去重,冒泡排序实现升序,完全手动实现核心逻辑,不依赖JDK工具类,符合题目要求。3.多线程交替打印数字字母代码实现java

publicclassAlternatePrint{

//定义锁对象

privatestaticfinalObjectlock=newObject();

//标记位,控制线程切换

privatestaticbooleanflag=true;

//打印数字线程

staticclassNumThreadimplementsRunnable{

@Override

publicvoidrun(){

for(inti=1;i<=5;i++){

synchronized(lock){

//等待字母线程执行

while(!flag){

try{

lock.wait();

}catch(InterruptedExceptione){

e.printStackTrace();

}

}

System.out.print(i);

//切换标记位,唤醒字母线程

flag=false;

lock.notify();

}

}

}

}

//打印字母线程

staticclassCharThreadimplementsRunnable{

@Override

publicvoidrun(){

char[]chars={'A','B','C','D','E'};

for(charc:chars){

synchronized(lock){

//等待数字线程执行

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论