一年经验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

2.collection与collections的区别

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是重写,发生在子类当中,在重写时需注意的是,重写的方法必须方法名、参数个数、参数类型、返回需要一致,访问权限不能比被重写的方法更严格,重写的方法不能比被重写的方法抛出更多的异常;

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,同样是线程安全且性能优于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中会存在内存泄漏吗,请简单描述。

 

 

 

 

 

 

 

你可能感兴趣的:(一年经验Java常见的面试题及答案)