Java开发基础笔试题(含详细答案解析)_第1页
Java开发基础笔试题(含详细答案解析)_第2页
Java开发基础笔试题(含详细答案解析)_第3页
Java开发基础笔试题(含详细答案解析)_第4页
Java开发基础笔试题(含详细答案解析)_第5页
已阅读5页,还剩3页未读, 继续免费阅读

下载本文档

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

文档简介

Java开发基础笔试题(含详细答案解析)适用人群:初级Java开发、应届生、实习生求职笔试题型说明:选择题(10题)、填空题(5题)、简答题(6题)、编程题(2题),内容贴合企业真实笔试,无空洞套话,答案通俗落地。一、单项选择题(每题2分,共20分)1.以下关于Java基本数据类型的说法,正确的是()A.char类型占用2个字节,存储的是ASCII码B.float类型默认值为0,double类型默认值为0.0C.boolean类型只有true、false两个值,不占用内存D.long类型赋值时,必须在数值后加L/l答案:D解析:A错误:char占用2字节,存储的是Unicode编码,并非ASCII;B错误:float默认值是0.0f,不是0;C错误:boolean在JVM中底层占用1字节内存,并非不占用;D正确:整数字面量默认是int,赋值给long必须加L(推荐大写,避免和数字1混淆)。2.下列关于==和equals()的区别,说法错误的是()A.==对于基本类型比较数值,引用类型比较内存地址B.equals()是Object类方法,默认比较对象地址C.String重写了equals(),用于比较字符串内容D.只要两个字符串内容相同,str1==str2一定为true答案:D解析:只有字符串常量池中的字符串,内容相同才会地址相同。如果是newString()创建的对象,内容相同但地址不同,==结果为false,equals结果为true。3.Java中接口和抽象类的区别,描述正确的是()A.抽象类可以有构造方法,接口不能有构造方法B.抽象类和接口都能被实例化C.抽象类只能有一个父类,接口只能继承一个接口D.抽象类中不能有普通成员方法答案:A解析:B错误:抽象类、接口都不能直接new实例化;C错误:接口可以多继承多个接口;D错误:抽象类可以包含普通实例方法、静态方法,只需包含至少一个抽象方法即可。4.以下关于final、finally、finalize的说法,正确的是()A.finally代码块一定会执行B.final修饰的变量,值绝对不能修改C.finalize()是Object类方法,用于垃圾回收前调用D.final可以修饰接口答案:C解析:A错误:如果执行System.exit(0)退出JVM,finally不会执行;B错误:final修饰引用类型变量,地址不可变,但对象内部属性可以修改;D错误:final不能修饰接口,接口默认是abstract。5.ArrayList和LinkedList的区别,场景描述正确的是()A.频繁增删元素用ArrayList,查询用LinkedListB.ArrayList底层是数组,随机访问速度快C.LinkedList底层是链表,支持随机索引访问D.ArrayList线程安全,LinkedList线程不安全答案:B解析:ArrayList底层动态数组,随机查询快、中间增删慢;LinkedList底层双向链表,增删快、随机查询慢。两者都是线程不安全,并发场景需用Vector或CopyOnWriteArrayList。6.下列关于Java异常的说法,错误的是()A.Error属于系统级异常,程序无需捕获B.Exception分为编译时异常和运行时异常C.NullPointerException是编译时异常D.try可以单独搭配finally,无需catch答案:C解析:空指针异常(NPE)属于RuntimeException运行时异常,编译阶段不会报错,运行时才会抛出。7.关于Java泛型,说法正确的是()A.泛型可以在运行时获取具体类型B.泛型只在编译期生效,存在类型擦除C.泛型支持基本数据类型D.泛型类不能定义多个泛型参数答案:B解析:Java泛型是伪泛型,编译后会发生类型擦除,运行时统一变为Object;泛型只支持引用类型,不支持基本类型;可以定义多个泛型参数。8.以下关于HashMap的说法,正确的是()A.HashMap线程安全,允许key、value为nullB.HashMap底层是数组+链表+红黑树(JDK1.8)C.HashMap默认初始容量是16,负载因子0.85D.HashMap可以保证元素有序答案:B解析:A错误:HashMap线程不安全;C错误:默认负载因子是0.75;D错误:HashMap无序,LinkedHashMap可保证插入有序。9.Java中重写(Override)和重载(Overload)的区别,正确的是()A.重写发生在同一个类中B.重载方法返回值必须一致C.重写要求方法名、参数列表完全一致D.重载可以改变方法修饰符范围答案:C解析:重载:同类中,方法名相同、参数列表不同,返回值、修饰符随意;重写:父子类中,方法名、参数、返回值必须一致,子类修饰符权限不能比父类更小。10.下列关于JVM内存区域的说法,正确的是()A.堆内存是线程私有的B.栈内存用于存储对象实例C.方法区存储类信息、常量、静态变量D.程序计数器会发生OOM内存溢出答案:C解析:堆、方法区线程共享;虚拟机栈、本地方法栈、程序计数器线程私有;对象存在堆中,局部变量存在栈中;程序计数器是唯一不会OOM的内存区域。二、填空题(每空2分,共20分)1.Java中__________关键字可以修饰常量,被修饰的引用类型变量__________不可变。答案:final、内存地址2.接口中的变量默认是__________、__________、final类型。答案:public、static3.JDK1.8之后,HashMap链表长度超过__________且数组容量大于__________时,会转为红黑树。答案:8、644.Java中线程的五大状态分别是新建、就绪、__________、阻塞、__________。答案:运行、终止5.异常体系中,__________是所有异常和错误的父类,__________是所有运行时异常的父类。答案:Throwable、RuntimeException三、简答题(每题6分,共36分)1.说说HashMap和HashTable的区别?答案解析:1.线程安全:HashMap线程不安全;HashTable线程安全,底层方法加了synchronized锁;2.null值支持:HashMap允许一个key为null、多个value为null;HashTable不允许key和value为null;3.初始容量:HashMap默认16,扩容2倍;HashTable默认11,扩容2倍+1;4.底层结构:JDK1.8后HashMap是数组+链表+红黑树,HashTable始终是数组+链表;5.效率:HashMap无锁,并发效率高;HashTable锁粒度大,效率极低,基本被淘汰。2.简述Java栈和堆的区别?答案解析:1.存储内容:栈存局部变量、方法参数、栈帧;堆存所有对象实例、数组;2.线程属性:栈是线程私有,每个线程独立栈空间;堆是线程共享,全局唯一;3.内存管理:栈内存自动分配、自动释放,速度快;堆需要JVM垃圾回收GC管理,速度慢;4.溢出异常:栈溢出报StackOverflowError,堆溢出报OutOfMemoryError。3.什么是线程安全?如何保证Java线程安全?答案解析:线程安全:多线程并发操作共享资源时,不会出现数据错乱、结果异常的情况。保证方式:1.synchronized:修饰方法或代码块,保证同一时间只有一个线程执行;2.Lock锁(ReentrantLock):可手动加锁、解锁,支持公平锁、可中断锁;3.使用线程安全集合:CopyOnWriteArrayList、ConcurrentHashMap;4.使用volatile关键字:保证可见性、禁止重排(不保证原子性);5.无锁设计:使用局部变量、不可变对象,避免共享资源。4.抽象类和接口的核心区别?答案解析:1.构造方法:抽象类有构造方法,用于子类初始化;接口无构造方法;2.成员变量:抽象类可以有普通变量、静态变量、常量;接口只能是publicstaticfinal常量;3.方法类型:抽象类可包含普通方法、静态方法、抽象方法;JDK1.8后接口有默认方法、静态方法,1.9有私有方法;4.继承规则:类只能单继承抽象类,可以多实现接口;5.设计思想:抽象类是模板复用,描述“是什么”;接口是行为规范,描述“能做什么”。5.说说JVM垃圾回收机制,哪些对象会被回收?答案解析:JVMGC是自动回收堆中无用对象内存,避免内存泄漏,主要回收新生代和老年代内存。会被回收的对象:1.没有任何引用指向的对象;2.引用链不可达的对象(GCRoots遍历不到的对象);3.重写finalize方法后,仍未被重新引用的对象。GC核心算法:标记清除、标记复制、标记整理、分代回收。6.String、StringBuilder、StringBuffer的区别?答案解析:1.可变性:String不可变,每次拼接都会生成新对象;StringBuilder、StringBuffer可变;2.线程安全:StringBuffer方法加synchronized,线程安全;StringBuilder线程不安全;3.效率:StringBuilder>StringBuffer>String;4.使用场景:少量字符串操作用String;单线程大量拼接用StringBuilder;多线程拼接用StringBuffer。四、编程题(每题12分,共24分)1.编程实现:去除字符串中重复字符,保持原有顺序(例如输入abacbd,输出abcd)参考答案(可直接运行):java

publicclassStringRepeat{

publicstaticStringremoveRepeat(Stringstr){

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

returnstr;

}

//利用LinkedHashSet保证去重+有序

StringBuildersb=newStringBuilder();

LinkedHashSet<Character>set=newLinkedHashSet<>();

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

set.add(str.charAt(i));

}

//拼接结果

for(Characterc:set){

sb.append(c);

}

returnsb.toString();

}

publicstaticvoidmain(String[]args){

System.out.println(removeRepeat("abacbd"));//输出abcd

}

}

解题思路:利用LinkedHashSet天然去重、保留插入顺序的特性,遍历字符串存入集合后拼接,简洁高效。2.编程实现:手写一个简单的单例模式(饿汉式+懒汉式双重校验锁)参考答案:①饿汉式(线程安全,简单常用)java

//饿汉式:类加载时初始化,天然线程安全

publicclassSingletonHungry{

//私有静态常量实例

privatestaticfinalSingletonHungryINSTANCE=newSingletonHungry();

//私有构造方法,禁止外部new

privateSingletonHungry(){}

//对外提供获取实例方法

publicstaticSingletonHungrygetInstance(){

returnINSTANCE;

}

}

②懒汉式双重校验锁(DCL,高效线程安全)java

//双重校验锁懒汉式:延迟加载、线程安全、效率高

publicclassSingletonLazy{

//volatile禁止指令重排,避免半初始化对象

privatestaticvolatileSingletonLazyinstance;

//私有构造

privateSingletonLazy(){}

publicstaticSingletonLazygetInstance(){

//第一次校验:避免每次加锁,提升效率

if(instance==null){

synchronized(SingletonLazy.class)

温馨提示

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

评论

0/150

提交评论