Java面试题集锦

一、Java基础部分

1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?

可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。


2、Java有没有goto?

java中的保留字,现在没有在java中使用。


3、说说&和&&的区别?

&&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false

&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,例如,对于if(str != null && !str.equals(“”))表达式,当strnull时,后面的表达式不会执行,所以不会出现NullPointerException如果将&&改为&,则会抛出NullPointerException异常。If(x==33 & ++y>0) y会增长,If(x==33 && ++y>0)不会增长

&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4bit位,例如,0x31 & 0x0f的结果为0x01

 

备注:这道题先说两者的共同点,再说出&&&的特殊之处,并列举一些经典的例子来表明自己理解透彻深入、实际经验丰富。

Java的位运算符详解——与(&)、非(~)、或(|)、异或(^


4、、在JAVA中如何跳出当前的多重嵌套循环?

Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break语句,即可跳出外层循环。例如,

ok:

for(inti=0;i<10;i++)

{

           for(intj=0;j<10;j++)

           {

                    System.out.println(“i=”+ i + “,j=” + j);

                    if(j== 5) break ok;

           }

}


5、switch语句能否作用在byte上,能否作用在long上,能否作用在String上?

switchexpr1)中,expr1只能是一个整数表达式或者枚举常量(更大字体),整数表达式可以是int基本类型或Integer包装类型,由于,byte,short,char都可以隐含转换为int,所以,这些类型以及这些类型的包装类型也是可以的。显然,longString类型都不符合switch的语法规定,并且不能被隐式转换成int类型,所以,它们不能作用于swtich语句中。


6short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

char型变量中能不能存贮一个中文汉字?为什么?

  java语言中算操作符的数运算,首先转换成大类型的在去计算。但是由于 +=java语言规定的运算符,java编译器会对它进行特殊处理。

对于short s1 = 1; s1 = s1 + 1;由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。

对于short s1 = 1; s1 += 1;由于 +=java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。


7、char型变量中能不能存贮一个中文汉字?为什么?

char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。

备注:后面一部分回答虽然不是在正面回答题目,但是,为了展现自己的学识和表现自己对问题理解的透彻深入,可以回答一些相关的知识,做到知无不言,言无不尽。


8、用最有效率的方法算出2乘以8等於几?

2 << 3

因为将一个数左移n位,就相当于乘以了2n次方,那么,一个数乘以8只要将其左移3位即可,而位运算cpu直接支持的,效率最高,所以,2乘以8等於几的最效率的方法是2 << 3


9、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?

使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。例如,对于如下语句:

 final StringBuffer a=new StringBuffer("immutable");
执行如下语句将报告编译期错误:

a=new StringBuffer("");
但是,执行如下语句则可以通过编译:

a.append(" broken!"); 

 


10、"=="和equals方法究竟有什么区别?

==是比较引用的,equals需要看他的实现,默认的Object里面是比较==的


11、静态变量和实例变量的区别?

静态变量:类加载器首先加载到方法区,方法区的内容是Class类共享的区域。

实例变量:在创建对象之后才会在堆中存在,是对象级别的。


12、是否可以从一个static方法内部发出对非static方法的调用?

static级别的信息都是类加载器首先加载到方法区,这时候对象还没有,而非static信息是对象级别的,需要现有对象 才能使用。

所以不能从static方法内部对非static调用。


13、Integer与int的区别?

intjava提供的8种原始数据类型之一。Java为每个原始类型提供了封装类,Integerjavaint提供的封装类。int的默认值为0,而Integer的默认值为null

Integer封装了很多操作数据的方法。


14、下面的代码有什么不妥之处?

1. if(username.equals(“zxx”){}:容易出现空指针异常

2.  int x = 1;

    returnx==1?true:false;:恒成立


15、请说出作用域public,private,protected,以及不写时的区别

这四个作用域的可见范围如下表所示。

说明:如果在修饰的元素上面没有写任何访问修饰符,则表示friendly

 

作用域    当前类  同一package    子孙类         其他package

public                                                        

protected                                                   ×

friendly                                      ×                ×

private               ×                        ×                ×

备注:只要记住了有4种访问权限,4个访问范围,然后将全选和范围在水平和垂直方向上分别按排从小到大或从大到小的顺序排列,就很容易画出上面的图了。


16、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

Overload:重载
  1.   方法名相同,参数列别不同
  2.   方法值可以不同,访问修饰符可以不同   
Overrid:重写
  1.          方法名、参数列表同父类
  2.         抛出的异常范围要比父类小
  3.         访问权限比父类大
  4.            静态、私有方法不能被覆盖


17、线程如何同步和通讯?

1、使用synchaonized关键字

2、共享变量和管道流


18、ClassLoader如何加载class ?

jvm里有多个类加载,每个类加载可以负责加载特定位置的类,例如,bootstrap类加载负责加载jre/lib/rt.jar中的类, 我们平时用的jdk中的类都位于rt.jar中。extclassloader负责加载jar/lib/ext/*.jar中的类,appclassloader负责classpath指定的目录或jar中的类。除了bootstrap之外,其他的类加载器本身也都是java类,它们的父类是ClassLoader。


19、java中hashcode方法的作用?

JDK中的解释:hashcode方法返回该对象的哈希码值。支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表。  

这里需要了解哈希表数据结构


20、构造器Constructor是否可被override?

构造器Constructor不能被继承,因此不能重写Override,但可以被重载Overload


21、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法?

接口可以继承接口。抽象类可以实现(implements)接口,抽象类可继承具体类。抽象类中可以有静态的main方法。

备注:只要明白了接口和抽象类的本质和作用,这些问题都很好回答,你想想,如果你是java语言的设计者,你是否会提供这样的支持,如果不提供的话,有什么理由吗?如果你没有道理不提供,那答案就是肯定的了。

 只有记住抽象类与普通类的唯一区别就是不能创建实例对象和允许有abstract方法。


22、面向对象的特征有哪些方面?

封装:封装属性,暴露方法

继承:继承父类特性或者覆盖父类方法

多态


23、java中实现多态的机制是什么?

动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。


24、abstract class和interface有什么区别?     


25、abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?

abstractmethod不可以是static的,因为抽象的方法是要被子类实现的,而static与子类扯不上关系!

native方法表示该方法要用另外一种依赖平台的编程语言实现的,不存在着被子类实现的问题,所以,它也不能是抽象的,不能与abstract混用。例如,FileOutputSteam类要硬件打交道,底层的实现用的是操作系统相关的api实现,例如,在windowsc语言实现的,所以,查看jdk的源代码,可以发现FileOutputStreamopen方法的定义如下:

private native void open(String name)throws FileNotFoundException;

如果我们要用java调用别人写的c语言函数,我们是无法直接调用的,我们需要按照java的要求写一个c语言的函数,又我们的这个c语言函数去调用别人的c语言函数。由于我们的c语言函数是按java的要求来写的,我们这个c语言函数就可以与java对接上,java那边的对接方式就是定义出与我们这个c函数相对应的方法,java中对应的方法不需要写具体的代码,但需要在前面声明native

关于synchronizedabstract合用的问题,我觉得也不行,因为在我几年的学习和开发中,从来没见到过这种情况,并且我觉得synchronized应该是作用在一个具体的方法上才有意义。而且,方法上的synchronized同步所使用的同步锁对象是this,而抽象方法上无法确定this是什么。


26、什么是内部类?Static Nested Class 和 Inner Class的不同?

内部类:在类中定义的类

静态内部类类似静态变量

内部类类似实例变量



27、内部类可以引用它的包含类的成员吗?有没有什么限制?

实例内部类能访问外部类所有的成员,静态内部类只能访问静态成员。


28、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?

可以继承其他类或实现其他接口。不仅是可以,而是必须


29、super.getClass()方法调用返回值

下面程序的输出结果是多少?

import java.util.Date;
public  class Test extends Date{
	public static void main(String[] args) {
		new Test().test();
	}
	
	public void test(){
		System.out.println(super.getClass().getName());
	}
}

由于getClass()Object类中定义成了final,子类不能覆盖该方法,所以,在

test方法中调用getClass().getName()方法,其实就是在调用从父类继承的getClass()方法,等效于调用super.getClass().getName()方法,所以,super.getClass().getName()方法返回的也应该是Test

如果想得到父类的名称,应该用如下代码:

getClass().getSuperClass().getName();


30、 jdk中哪些类是不能继承的?

不能继承的是类是那些用final关键字修饰的类。一般比较基本的类型或防止扩展类无意间破坏原来方法的实现的类型都应该是final的,在jdkSystem,String,StringBuffer等都是基本类型。


31、String是最基本的数据类型吗?

基本数据类型包括byteintcharlongfloatdoublebooleanshort

java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer


32、String s = "Hello";s = s + " world!";这两行代码执行后,原始的String对象中的内容到底变了没有?

没有。因为 String 被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。在这段代码中,s 原先指向一个 String 对象,内容是 "Hello",然后我们对 s 进行了+操作,那么 s 所指向的那个对象是否发生了改变呢?答案是没有。这时, s 不指向原来那个对象了,而指向了另一个 String 对象,内容为 "Hello world!",原来那个对象还存在于内存之中,只是 s 这个引用变量不再指向它了。


33、是否可以继承String类?

String类是final类故不可以继承。


34、String s = new String("xyz");创建了几个String Object? 二者之间有什么区别?

两个或一个,”xyz”对应一个对象,这个对象放在字符串常量缓冲区,常量”xyz”不管出现多少遍,都是缓冲区中的那一个。New String每写一遍,就创建一个新的对象,它一句那个常量”xyz”对象的内容来创建出一个新String对象。如果以前就用过’xyz’,这句代表就不会创建”xyz”自己了,直接从缓冲区拿。


35、String 和StringBuffer的区别?

String:final类型,底层是数组,不支持扩容

StringBuffer:底层是数组,支持扩容


36、StringBuffer与StringBuilder的区别?

  StringBuffer和StringBuilder类都表示内容可以被修改的字符串,StringBuilder是线程不安全的,运行效率高,如果一个字符串变量是在方法里面定义,这种情况只可能有一个线程访问它,不存在不安全的因素了,则用StringBuilder。如果要在类里面定义成员变量,并且这个类的实例对象会在多线程环境下使用,那么最好用StringBuffer。


37、如何把一段逗号分割的字符串转换成一个数组?

如果不查jdk api,我很难写出来!我可以说说我的思路:

1.       用正则表达式,代码大概为:String [] result = orgStr.split(“,”);

2.       StingTokenizer ,代码为:

     String str = "1,2,3";

    StringTokenizer  tokener = new StringTokenizer(str,",");

    String [] result = new String[tokener .countTokens()];

    int i=0;

    while(tokener.hasMoreTokens()){

        result[i++]=tokener.nextToken();

    }

   

    for (String s : result) {

        System.out.println(s);

    }


38、数组有没有length()这个方法? String有没有length()这个方法?

数组没有length()这个方法,有length的属性。String有有length()这个方法。



39、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?



本题答案请参阅:《深入Java虚拟机第二版》第十八章


40、final, finally, finalize的区别?

final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。

内部类要访问局部变量,局部变量必须定义成final类型

finally是异常处理语句结构的一部分,表示总是执行。

finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用


41、内部类要访问局部变量,局部变量必须定义成final类型,为什么?

内部类对象的生命周期会超过局部变量的生命期。当方法执行结束后,局部变量会弹栈,所以就不存在此值了,但是内部类只要还有对它的引用,就不会销毁,在堆中还存在,如果这时候内部类再去访问局部变量就出问题了,访问不到了。那么Java就对这个局部变量强制声明为final的,因为final是常量的,而常量的内容是存在方法区的,可以一直共享的。

本章内容参阅:《深入Java虚拟机第二版》第六章


42、运行时异常与一般异常有何异同?

异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。



43、error和exception有什么区别?

error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。


44、Java中的异常处理机制的简单原理和应用?

 运行时异常和变异异常。


45、请写出你最常见到的5个runtime exception?

NullPointerExceptionArrayIndexOutOfBoundsExceptionClassCastException、ClassNotFoundException、OutOfMemoryException。


46、JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?

JAVA有两种异常:

1、编译异常:必须手动处理,或者抛出给调用者处理

2、运行时异常:可以手动添加捕获异常,也可以让框架去处理

throws:抛出异常

throw:声明异常

try、catch:捕获异常

finally:释放资源等使用


47、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?

你可能感兴趣的:(java基础,Java面试题)