2025年java基础题库及答案_第1页
2025年java基础题库及答案_第2页
2025年java基础题库及答案_第3页
2025年java基础题库及答案_第4页
2025年java基础题库及答案_第5页
已阅读5页,还剩7页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

2025年java基础题库及答案Java中基本数据类型char可以存储中文吗?为什么?可以。Java中char类型使用Unicode编码,占2个字节,而Unicode编码涵盖了中文(如常见的UTF-16编码)。中文字符在Unicode中的码点通常位于U+4E00到U+9FA5之间,这些码点可以用2字节的UTF-16表示,因此char类型可以直接存储大部分常用中文字符。但需要注意,某些生僻字或扩展字符可能使用UTF-16的代理对(需要两个char),此时单个char无法存储完整字符。简述Java中==和equals()方法的区别。==对于基本数据类型比较的是值是否相等;对于引用类型比较的是内存地址是否相同(是否指向同一个对象)。equals()方法是Object类的方法,默认实现与==相同(比较地址),但通常被重写以比较对象的内容是否相等。例如String类重写了equals(),比较两个字符串的字符序列是否一致。需要注意,重写equals()时通常需要同时重写hashCode(),以保证哈希集合(如HashMap)的正确性。解释Java中的自动装箱和拆箱,举例说明可能的性能问题。自动装箱是将基本数据类型转换为对应的包装类对象(如int→Integer),拆箱是将包装类对象转换为基本数据类型(如Integer→int),这一过程由编译器自动完成(通过调用valueOf()和intValue()等方法)。性能问题常见于循环中频繁装箱,例如在for循环中使用Integer类型累加:Integersum=0;for(inti=0;i<10000;i++){sum+=i;}每次sum+=i会触发拆箱(Value())和装箱(Integer.valueOf()),产生大量临时对象,降低性能。此时应使用基本类型int代替。Java中String、StringBuilder和StringBuffer的区别是什么?适用场景如何?String是不可变类,内部使用finalchar[]存储字符,任何修改操作(如拼接)都会提供新的String对象,适合字符串不频繁修改的场景。StringBuilder是可变类,非线程安全,内部通过动态扩容的char[]存储字符,拼接操作直接修改原对象,效率高,适合单线程下字符串频繁修改的场景。StringBuffer与StringBuilder类似,但方法使用synchronized修饰,线程安全,适合多线程下字符串频繁修改的场景。分析以下代码的输出结果:inta=5;intb=a+++++a;System.out.println("a="+a+",b="+b);a的最终值为7,b的值为12。执行a++时,先取a的当前值5参与运算,然后a自增为6;接着执行++a时,a先自增为7,再取7参与运算。因此b=5+7=12,最终a=7。Java中break和continue的区别是什么?在嵌套循环中如何跳出外层循环?break用于终止当前所在的循环或switch语句,执行循环后的代码;continue用于跳过当前循环的剩余语句,直接进入下一次循环。在嵌套循环中,可通过标签(Label)跳出外层循环。例如在外层循环前定义标签outer:,然后在内层循环中使用breakouter;即可终止外层循环。简述面向对象的三大特性及其含义。封装:将对象的属性和方法隐藏在内部,仅通过公开接口访问,提高安全性和可维护性(如通过private修饰属性,public方法访问)。继承:子类继承父类的属性和方法,可扩展新功能,实现代码复用(Java中类只能单继承,但接口可多实现)。多态:同一行为在不同对象上表现不同的形态,通过继承(或实现接口)和方法重写实现(如父类引用指向子类对象,调用重写方法时执行子类逻辑)。抽象类和接口的主要区别有哪些?Java8后接口有哪些新特性?区别:抽象类可包含普通方法、抽象方法、构造方法和成员变量(可为任意访问修饰符);接口在Java8前只能包含抽象方法和publicstaticfinal常量。抽象类只能单继承,接口可多实现。抽象类用于定义“是不是”的关系(如Person抽象类),接口用于定义“能不能”的能力(如Fly接口)。Java8后接口支持默认方法(default修饰,可被实现类重写)和静态方法(static修饰,直接通过接口调用),Java9后支持私有方法(private修饰,供接口内方法调用)。方法重载(Overload)和方法重写(Override)的区别是什么?重载发生在同一类中,方法名相同但参数列表不同(参数类型、数量或顺序不同),与返回值类型无关,是编译时多态的体现(编译器根据实参类型选择调用方法)。重写发生在子类与父类(或接口实现类)之间,方法名、参数列表和返回值类型(或协变返回类型)完全相同,访问修饰符不能比父类更严格,抛出异常不能比父类更宽泛,是运行时多态的体现(运行时根据实际对象类型调用方法)。Java中异常分为哪几类?受检异常(CheckedException)和非受检异常(UncheckedException)的区别是什么?异常分为Error(错误,如OutOfMemoryError,程序无法处理)、Exception(异常,程序可处理)。Exception又分为RuntimeException(运行时异常,如NullPointerException,非受检)和其他Exception(受检异常,如IOException)。受检异常必须显式处理(捕获或声明抛出),否则编译报错;非受检异常(包括RuntimeException及其子类和Error)无需显式处理。简述try-with-resources的作用和使用条件。try-with-resources是Java7引入的语法糖,用于自动关闭实现了AutoCloseable或Closeable接口的资源(如文件流、数据库连接)。使用时,资源对象在try括号中声明,代码块执行完毕后会自动调用close()方法(优先执行,即使发生异常),避免资源泄露。资源类需实现AutoCloseable(Java7)或其子接口Closeable(Java1.5,close()方法声明了IOException),且在try块中声明的资源会被自动关闭(顺序与声明相反)。分析HashMap在Java7和Java8中的底层实现差异。Java7中HashMap使用“数组+链表”结构,数组是Entry<K,V>[],链表用于解决哈希冲突(不同键的hash值相同)。Java8中改为“数组+链表+红黑树”结构,当链表长度≥8且数组长度≥64时,链表转换为红黑树(查询时间复杂度从O(n)降为O(logn));当红黑树节点数≤6时,退化为链表(避免频繁转换)。此外,Java8的hash计算优化为(h=key.hashCode())^(h>>>16)(高位参与运算,减少哈希冲突),插入方式从头插法(Java7)改为尾插法(避免多线程扩容时的循环链表问题)。ArrayList和LinkedList的区别是什么?分别适用于什么场景?ArrayList基于动态数组实现,随机访问(get/set)时间复杂度O(1),但插入/删除(非尾部)需移动元素,时间复杂度O(n);默认初始容量10,扩容时新容量为原容量的1.5倍。LinkedList基于双向链表实现,插入/删除(任意位置)时间复杂度O(1)(需先找到节点),随机访问需遍历链表,时间复杂度O(n);同时实现了Deque接口,可作为队列或栈使用。ArrayList适合频繁随机访问、较少插入删除的场景;LinkedList适合频繁插入删除、较少随机访问的场景(如队列操作)。synchronized关键字的底层实现是什么?Java6后做了哪些优化?synchronized的底层通过JVM的Monitor锁实现。对象头(MarkWord)中存储了锁状态信息,锁的获取与释放通过Monitor的enter和exit指令完成。Java6引入了锁优化机制:偏向锁(记录第一个获取锁的线程ID,减少无竞争时的开销)、轻量级锁(通过CAS尝试获取锁,适用于短时间竞争)、重量级锁(升级为操作系统互斥锁,适用于长时间竞争);此外还有锁消除(JIT编译时消除不可能被共享的锁)和锁粗化(扩大锁的范围,减少频繁加锁解锁的开销)。Java中线程的生命周期有哪些状态?如何切换?线程状态包括:NEW(新建,调用start()前)、RUNNABLE(可运行,包括运行中和等待CPU调度)、BLOCKED(阻塞,等待监视器锁)、WAITING(无限等待,调用wait()、join()无超时参数)、TIMED_WAITING(定时等待,调用sleep()、wait(long)、join(long))、TERMINATED(终止,线程执行完毕或异常终止)。状态切换:start()→RUNNABLE;获取不到synchronized锁→BLOCKED;获取锁→RUNNABLE;调用wait()→WAITING(被notify()/notifyAll()唤醒→BLOCKED,重新竞争锁);调用sleep(long)→TIMED_WAITING(超时或被中断→RUNNABLE);线程执行结束→TERMINATED。简述volatile关键字的作用和适用场景。volatile保证变量的可见性(多线程中修改后,其他线程能立即看到最新值)和禁止指令重排序(通过内存屏障实现),但不保证原子性。适用场景:状态标志(如booleanisRunning,避免线程无法感知其他线程的修改)、单例模式的双重检查锁定(防止指令重排导致其他线程获取到未初始化的对象)。例如:privatevolatilestaticSingletoninstance;publicstaticSingletongetInstance(){if(instance==null){synchronized(Singleton.class){if(instance==null){instance=newSingleton();//禁止重排,避免其他线程看到半初始化对象}}}returninstance;}Java反射的核心类有哪些?如何通过反射调用私有方法?反射核心类包括Class(表示类的字节码)、Method(表示方法)、Field(表示字段)、Constructor(表示构造方法)。调用私有方法步骤:1.获取目标类的Class对象(如Class<?>clazz=Target.class;);2.获取Method对象(Methodmethod=clazz.getDeclaredMethod("methodName",paramTypes););3.调用method.setAccessible(true);(关闭访问检查);4.调用method.invoke(targetInstance,args);(targetInstance为方法所属对象,静态方法传null)。需处理IllegalAccessException(setAccessible失败)和InvocationTargetException(方法执行异常)。Lambda表达式的语法是什么?函数式接口的定义要求有哪些?Lambda表达式语法为(参数列表)->{方法体},若方法体只有一条语句可省略大括号和return(返回值类型需匹配)。函数式接口是仅包含一个抽象方法的接口(可通过@FunctionalInterface注解标记,编译器会检查),允许有默认方法、静态方法和Object类的方法(如equals())。例如Runnable(voidrun())、Comparator<T>(intcompare(To1,To2))都是函数式接口。Lambda表达式通过类型推断匹配接口的抽象方法,参数类型、数量和返回值需与抽象方法一致。JavaIO中字节流和字符流的区别是什么?缓冲流(BufferedInputStream/BufferedReader)的作用是什么?字节流(InputStream/OutputStream)以字节(8位)为单位读写数据,适合处理二进制文件(如图片、视频);字符流(Reader/Writer)以字符(16位,基于Unicode)为单位读写数据,内部使用编码表(如UTF-8)转换字节与字符,适合处理文本文件。缓冲流内部维护缓冲区(默认8192字节),减少直接与底层设备(如磁盘)的IO次数,提高读写效率。例如BufferedReader的readLine()方法基于缓冲区读取整行文本,比逐字符读取更高效。分析以下代码的输出结果(涉及静态代码块、构造代码块、构造方法的执行顺序):classParent{static{System.out.println("Parentstaticblock");}{System.out.println("P

温馨提示

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

评论

0/150

提交评论