⼀年经验Java常见的⾯试题及答案
1.public、private、protected和friendly的区别
都是访问类型修饰符关键字,在于访问范围不⼀样。
访问范围如下:
本类      同package  ⼦类    ⾮同package
public            o            o                o              o
protected      o            o                o              x
friendly          o            o                  x              x
private          o            x                  x              x
collection是⼀个java.util.*下的⼀个集合接⼝,继承接⼝主要有List、Set。
collections是java.util.*下的⼀个类,collections提供许多针对集合类的静态⽅法,例如collections.sort(list),还有reverse()等。
3.String s=new String(‘xyz’);创建了⼏个object对象
若在此之前未创建过“xyz”字符串,则在这创建了两个object对象,⼀个是new创建的string对象,另⼀个是“syz”字符串对象。
4.short s1;s1=s1+1;是否有错?
有错,在这⾥s1有声明,但却没有进⾏初始化,在进⾏s1 = s1+1;的操作时,会报是s1未初始化的错误。
5.Overriding和Overloading区别
overriding是重写,发⽣在⼦类当中,在重写时需注意的是,重写的⽅法必须⽅法名、参数个数、参数类型、返回需要⼀致,访问权限不能⽐被重写的⽅法更严格,重写的⽅法不能⽐被重写的⽅法抛出更多的异常;
java面试题及答案2020
overloading是重载,发⽣在同⼀个类中,重载只需要满⾜,⽅法名⼀样,参数个数或参数类型或参数顺序不⼀样即可。
6.Set⾥⾯的元素不能重复,⽤什么⽅法区分重复与否。
⽤equals()来判断是否有重复元素。
为什么不⽤“==”呢?若对于基本类型,“==”可以⽐较两个变量的值是否相等,也就是⽐较内存中所存储的数值。
⽽set中存储的是对象,对象涉及到两块内存,⼀个是对象本⾝占⽤⼀块内存(堆内存),变量也占⽤⼀块内存。
string a = new string("abc");
string b = new string("abc");
a和b所指向的对象不⼀样,所以a和b内存中所存储的数值是不⼀样的,⽤“==”将返回false,⽽我们要⽐较的是两个对象的内容是否⼀样,若⽤equals将返回true,因为a和b都是abc。
7、给出⼀个常见的runtime exception。
NullPointerException 空指针异常;
ClassCastException 强制转换类型异常;
IndexOutOfBounsExcption 下标越界异常;
NumberFormatException 数字格式异常;
8、error和exception区别。
error是系统中的错误,程序员是⽆法改变处理的,是在编译是发⽣的错误,只能通过修改程序才能改正。⼀般与虚拟机相关,如虚拟机错误、系统崩溃、内存空间不⾜等问题。对于这类错误导致的应⽤程序中断,仅靠程序本⾝是⽆法恢复的。
exception表⽰的是程序可以处理的异常,可以捕获且可能恢复,遇到这类异常应该对异常进⾏捕获处理,使程序恢复运⾏。
exception⼜可以分为checkedException和uncheckedException。
checkedException是我们常⽤try--catch捕获的异常,程序在编译时系统会强制我们对异常进⾏try--catch或者throws。
uncheckedException⼜称为runtimeException,是程序在运⾏时出现的异常,我们⽆法捕获,常见的有空指针异常,下标越界等
9、List和Set是否继承⾃Collection接⼝。
是的。List和Set接⼝都是继承于collection。
10、abstract class和interface 的区别。
abstract是抽象类,在抽象类中可以定义构造⽅法,普通成员变量、静态⽅法、⾮抽象⽅法,抽象⽅法访问类型可以是public、protected。
interface是接⼝,可以说是abstract中的特例。接⼝不可以有构造⽅法,成员变量必须是静态的,不可以定义⾮抽象⽅法、静态⽅法,⽅法的访问类型只能是public abstract。
抽象类和接⼝都可以定义静态成员变量,但是抽象类中静态成员变量的访问类型可以是任意的,⽽接⼝只能是public。在Java中,⼀个类只能继承⼀个抽象类,但是可以实现多个接⼝。
11.是否可以继承String类。
在Java中,string类的修饰符是final,这意味着string类是不可继承和修改的。
12、try{}⾥有⼀个return语句,紧跟在try后的finally⾥的code会不会被执⾏,什么时候执⾏,return前执⾏还是return后执⾏。
try⾥⾯有return语句,⽆论try⾥⾯是否有捕获异常。finally中的代码都会执⾏,并且是在return前执⾏,如果finally也有return语句的话,程序会在finally直接return,⽽不会在try⾥⾯return。
13、最有效率的⽅法算2*8等于⼏
⽤位运算的⽅法计算最有效率。
应写成:
Java代码
int i = 2;
int j = i << 3;
汇编指令:
mov    dword ptr [ebp-4],2              把2放⼊内存中 SS:[ebp-4]
mov    eax,dword ptr [ebp-4]          把 SS:[ebp-4] 整数传送到eax寄存器中
shl      eax,3                                    对eax中的数据左移3位
mov    dword ptr [ebp-8],eax          再把移位后的结果存到内存 SS:[ebp-8]中
14、两个对象值相同,x.equal(y)==true,但是却可有不同的hashcode,这句话对不对。
不对,两个对象如果equal的值为true,那么他们的hashcode⼀定是相同的。但是hashcode相同,他们的equal未必⼀定为true。
例如在hashmap中,key值是不重复的,在往hashmap中put对象的时候,会有⼀个判断是否有相同的key,⾸先⽐较的是hashcode,如果hashcode相同则需要进⼀步使⽤equal进⾏判断,如果hashcode不相同,则这两个对象则是不相同的,这也可以提⾼效率。
15、值传递和引⽤传递
值传递:对象被值传递,相当于传递了对象的副本,若修改了对象副本的值将不会影响源对象的值。
引⽤传递:对象被引⽤传递,并不是传递了实际的对象,⽽是对象的引⽤,所有对引⽤对象的修改都会影响到源对象。
16、switch是否作⽤在byte、long、string上。
switch的内容为整数和枚举常量,⽽byte、short、char、int和integer都可以默认转换为整型,⽽string和long不可以,所以byte可以作⽤在switch上,long和string是不可以的。
17、ArrayList和Vector区别,HashMap和Hashtable区别(了解这⼏个类的底层jdk中的编码⽅式)。
ArrayList和Vector都是以数组的形式存储。ArrayList可以存null值,Vector是不可以的,vector是线程安全的,ArrayList是线程不安全的,但是可以⽤collections.sychronizedList()实现线程同步,ArrayList在容器充满时会⾃动扩容50%,⽽vector则扩容
100%,ArrayList则更节省空间;
hashMap:key和value可以为null值,⾮线程安全,继承abstractMap接⼝,重新计算hash值
hashTable:key和value不能为null值,线程安全,继承dictionary接⼝,hash值直接使⽤key.hashCode()
现在推荐使⽤concurrentHashMap替代hashTable,因为concurrentHashMap使⽤的是局部锁技术,吧map分为多个segment,⽽hashtable锁的机制是对整个对象的加锁,concurrenthashmap的性能优于hashTable。
18、GC是什么,为什么要有GC,简单介绍GC。
GC是垃圾回收,内存处理是开发⼈员容易出现问题的地⽅,错误或忘记内存回收都可能会使得系统不稳定或者崩溃。⽽Java就提供了⼀个垃圾回收功能,可以监测对象是否超过作⽤域或者说是不可达的状态,从⽽达到⾃动回收内存的⽬的。
垃圾回收可以有效的防⽌内存泄漏,垃圾回收器是⼀个单独的低优先级的线程,在不可预知的情况对已经死亡或者很久没有使⽤的对象进⾏回收,程序是不能实时的调⽤垃圾回收器对某个对象进⾏回收。
垃圾回收的实现有很多⽅法,其中有⼀种是⽤分代回收算法实现的。分代回收是将堆空间划分为三个区:年轻代、年⽼代和永久代。年轻代和年⽼代存储的是动态产⽣的对象,⽽永久代存储的是类的信息,包括解析到的⽅法、变量等,永久带⼏乎是不参与垃圾回收的。
年轻代⼜分为三个区,⼀个eden区,两个相同的survivor区,这样分主要是为了让⽣命周期短的对象尽量留在年轻代。新创建的对象都会先存放到eden区,直到eden申请不到空间时,进⾏minorGC,将存活的对象拷贝到survivor区,年⽼代⼀般存储的是⽣命周期⽐较长的对象。
垃圾回收过程如下:
1.在eden区完成内存分配
2.eden区满了再创建对象时,会因为申请不到空间⽽出发minorGC,对eden+1survivor进⾏垃圾回收
3.minorGC时,将eden区不能回收的对象拷贝到空的survivor区,另⼀个survivor中不能回收的对象也会放到这个空的survivor区,最后会清空eden区并保证⼀个survivor是空的
4.执⾏到第3步的时候,若survivor满的,则这些对象会被拷贝到年⽼代(old)区,或者是survivor并没有满,但有些对象⾜够old,则这些对象会被放到年⽼代区
5.当年⽼代满了以后,会进⾏fullGC
19、float f=3.4是否正确。
不正确。在Java中,没有⼩数点的默认是int型,有⼩数点的默认是double型,若要定义⼀个float型的数应该强制转换类型,或者在数字后⾯加个“f”。
20、介绍Java中的Collection framework。
collection framework是Java的集合框架,是Java提供的⼯具包,包括了常⽤的数据结构:集合、数组、链表、队列、栈和映射等。
Java的集合主要划分为四个部分:list列表、set集合、map映射和⼯具类(collections、arrays等)。
collection主要的实现接⼝有list和set。
list是⼀个队列,根据下标索引,从0开始,实现类主要有linklist、ArrayList、vector、stack。list是有序的队列,可以存放重复值。
set是⼀个集合,set的值是唯⼀的,也就是说set当中不能存放重复值,list去重的问题可以把list转换成set,set的实现类主要有treeset和hashset,其中treeset是有序的。
map是⼀个接⼝,以键值对的形式存储,map中的每⼀个元素包含⼀个key和⼀个key对应的值value。abstractMap实现了map中⼤部分的api,⽽hashmap、treemap都是继承于abstractMap
21、Collection框架中实现⽐较⽅法
Collection框架中实现⽐较要实现Comparable 接⼝和 Comparator 接⼝。
22、String和Stringbuffer的区别
string和stringbuffer都是对字符串操作的类,⽽string类被final修饰,意味着string类不可被继承,对象⼀旦被创建则不可再修改,⽽我们实际中修改的string对象其实都是新创建的,⽽不是真的修改。stringbuffer时⼀个长度可变的,可以通过append函数对字符串进程追加,并且是线程安全的,⽬前还有⼀个stringbuilder替代stringbuffer,因為stringbuilder是線程不安全的,所以性能优于stringbuffer。
23、final、finally、finalize区别
final是Java中的⼀个修饰符关键字,被final修饰的类不可被继承,被修饰的变量不可被修改,被修饰的⽅法不能被重写。
finally是try--catch异常处理块中的⼀部分,⽆论try中是否捕获了异常,finally部分都会被执⾏,除⾮down机,⼀般⽤于资源关闭。
finalize是object中的⼀个⽅法,这个⽅法会在gc垃圾回收时才会调⽤到。
24、⾯向对象的特征
封装:将类私有化,将代码和处理数据绑定在⼀起,不受外部⼲扰
继承:⼦类继承⽗类,保留⽗类的属性也可以开扩新的东西。
多态:重写和重载可以提现⾯向对象的多态
25、String是最基本的数据类型吗。
string不是最基本的数据类型,它是⼀个被final修饰的类。在Java中有8种基本数据类型:
字符型:byte、char
基本整型:short、int、long
浮点型:float、double、
布尔型:boolean
26.说出ArrayList、Vector、Linkedlist的存储性能和特性
三者都是继承于list接⼝,Linklist是以链表的形式存储在内存中,适合⽤于经常要进⾏指定插⼊、删除操作的场景。
ArrayList和vector都是以数组的形式存储在内存中,适合⽤在查,不适合指定位置插⼊和删除;ArrayList可以存储Null值,但是线程不安全,可以使⽤collections.synchronized()实现线程同步,当元素填满容器时会⾃动扩容50%的空间;vector不可存储null值,线程安全,当元素填满容器时会⾃动扩容100%的空间,相⽐较之下,ArrayList更节省空间
27、heap和stack区别
stack的存取速度会快于heap,可以共享存储数据,但是数据的⼤⼩和⽣存期必须在运⾏期确定;
heap是运⾏时可动态分配的数据区,存储数据不共享,数据的⼤⼩和⽣存期可以在运⾏时确定;
new关键字运⾏时创建的对象存储在heap⾥⾯;
28.描述⼀下JVM加载Class⽂件的原理和机制
Java所有的类都需要加载到jvm中才能运⾏,在写程序的时候,我们⼏乎不⽤关⼼类的加载,因为这些都是隐式装载的。除⾮⽤了特殊的⽅法,例如反射,这需要显式的加载需要的类。
Java的类加载是动态的,他不会⼀次就把所有的类加载完再运⾏,⽽是将保证程序运⾏的基础类完全加载到jvm,其他的类需要的时候再加载。
Java的类加载器有三个,对应Java的三种类:1系统类,2扩展类,3⾃⼰定义的类
Java加载类的时候,会先请⽰其parent(即上⼀层加载器),在其搜索路径载⼊,如果过不到再从⾃⼰当前的搜索路径载⼊,顺序其实就是⾃顶向下,因为加载类必须要保证基础类的加载。
加载步骤如下:
1.装载:查和导⼊class⽂件
2.连接:
检查:检查class⽂件数据的正确性
准备:为静态变量分配内存空间
解析:将符号引⽤转换成直接引⽤
3.初始化:初始化静态变量,静态代码块
29.排序的⼏种⽅法,了解。
排序的算法实现有很多种,常见的排序算法有冒泡排序,交换排序,堆排序,快速排序等。
30.Java语⾔如何进⾏异常处理,throws,throw,try catch finally代表什么意义,try块中可以抛出异常吗
throws是⽤来声明⼀个⽅法中的异常,不做任何处理的往上传,哪个⽅法调⽤它就由哪个⽅法来处理。⽤在⽅法声明后⾯,后⾯接异常类,可以跟多个异常类名,⽤逗号隔开。
throw是⼀个⽤来抛出异常的⽅法,⽤在⽅法体⾥⾯,只能抛出⼀个异常,并由⽅法体内的语句处理。
try catch finally是⼀个⽤来处理异常的异常处理器,当编译器强制我们对异常处理的时候,可以使⽤try-catch来进⾏处理,将可能会出现异常的代码放到try语句块中,catch中则是捕获到异常后执⾏的语句,finally则是⽆论是否有捕获到异常都会执⾏的语句块,⼀般⽤于资源关闭。
31.⼀个’.java’源⽂件是否可以包括多个类,有什么限制。
Java源⽂件中可以有多个类,但是只能有⼀个public类,并且类名要和⽂件名⼀致
32.Java中有⼏种类型流,jdk为每种类型的流提供了⼀些抽象类以供继承,请分别说出它们是哪些类。
Java中有两种类型的流,分为为字节流和字符流,每种流都由输⼊和输出,共有四种抽象类以供继承,分别为
InputStream,OutputStream,Reader,Writer。
字节流可以⽤来处理任何对象,包括⼆进制对象,⽽字符流只能⽤来处理字符
字符流处理的单元为两个字节的Unicode字符,⽽字节流处理的单元为⼀个字节。
33.Java中会存在内存泄漏吗,请简单描述。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。