Java笔试面试题(四)

每日一句:我既不悲观,也不乐观,只是每天早上睁开眼睛迎接新的一天,一个人努力过下去

1. 下面这条语句一共创建了多少个对象:String s = "a"+"b"+"c"+"d";

对于如下代码:

String s1 = "a";
String s2 = s1 + "b";
String s3 = "a" + "b";
System.out.println(s2 == "ab");
System.out.println(s3 == "ab");

第一条语句打印的结果为false,第二条语句打印的结果为true,这说明javac编译可以对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连接的结果。
题目中第一行代码被编译器在编译时优化后,相当于直接定义了一个"abcd"的字符串,所以,上面的代码应该只创建了一个String对象。写如下两行代码:

String s = "a"+"b"+"c"+"d";
System.out.println(s == "abcd");

最终打印结果为true.

2. final, finally, finalize 的区别。
final 用于声明属性、方法和类,分别表示属性不可变、方法不可覆盖、类不可继承。内部类要访问局部变量,局部变量必须定义为final类型。
finally 是异常处理语句结构的一部分,表示总是执行。
finalize 是Object类的一个方法,在垃圾收集器执行的时候会调用被收回对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用。
3. 运行时异常与一般异常有什么异同?
异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。
4. error和exception有什么区别
error表示恢复不是不可能但是很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。exception表示一种设计或实现问题。也就是说,它表示如果程序能运行正常,从不会发生的情况。
5. Java语言如何进行异常处理,关键字 throws,throw,try,catch,finally 分别代表什么意义?在try块中可以抛出异常吗?
java的异常处理是通过以上5个关键字来实现的,一般情况下使用try来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这个时候你可以通过它的类型来捕获(catch)它,或者最后(finally)由缺省处理器来处理。用try来指定一块预防所有“异常”的程序,紧跟在try后面应该包含一个catch子句,来指定你要捕获的异常类型。
throw语句用来明确的抛出一个异常。
throws用来标明一个成员函数可能抛出的的各种异常。
finally为确保一段代码不管发生什么异常都被执行的一段代码。
6. java中有几种方法实现线程?
两种:分别是继承Thread类与实现Runnable接口。
用synchronize关键字修饰同步方法。
反对使用stop(),因为它不安全。suspend() 方法用以发生死锁。
7. sleep() 和 wait() 有什么区别?
网络答案:sleep()是线程类(Thread)的方法,导致此线程暂停执行指定时间,把执行机会给其他线程,但是监控状态依然保持,到时候会自动恢复。调用sleep()不会释放对象锁。wait()是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
8. 同步和异步有什么异同,在什么情况下分别使用它们?
如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待的方法返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。
9. 多线程有几种实现方法?同步有几种实现方法?
多线程分别是继承Thread类和实现Runnable接口两种方法实现。
同步的实现也有两种方法:分别是synchronize,wait和notify。
wait() :使一个线程处于等待状态,并且释放所持有对象的lock。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕获InterrupedException异常。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由jvm确定唤醒哪个线程,而且不是按优先级。
notifyAll():唤醒所有处于等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
10. 启动一个线程使用run() 还是 start() ?
启动一个线程是调用start()方法,使线程就绪状态,以后就可以被调度为运行状态了,一个线程必须关联一些具体的执行代码,run()方法是该线程所关联的执行代码。
11. 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可以进入此对象的其他方法?
(1)其他方法前是否加了synchronized关键字,如果没加,则能。
(2)如果这个方法内部调用了wait(),则可以进入其他synchronized方法。
(3)如果其他方法都加了synchronized关键字,并且内部没有调用wait(),则不能。
(4)如果其他方法是static,它用的同步锁是当前类的字节码,与非静态的方法不能同步,因为非静态的方法用的是this。
12. List和Map的区别?
List存储的是单列数据的集合,Map是存储键和值这样的双列的数据集合,List中存储的数据是有顺序的并且允许重复;Map中存储的数据是没有顺序的,其键不可重复,但值可以重复。
13. List,Set,Map是否继承自Collection接口?
List,Set是,Map不是。
14. HashMap和HashTable的区别?
HashMap是HashTable的轻量级实现(非线程安全的实现),HashTable是基于陈旧的Dictionary类的,HashMap是Java1.2引进的Map接口的实现;
HashMap允许空(null)键值(key),由于线程安全,在只有一个线程访问的情况下,效率高于HashTable;
HashMap允许将null作为一个entry的key或者value,而HashTable不允许;
HashMap是HashTable的contains方法去掉了,换成containsValue和containsKey。
HashTable的方法是synchronize的,而HashMap不是,在多个线程访问HashTable时,不需要自己为它的方法实现同步,而HashMap就必须为之提供外同步。
15. Collection和Collections的区别?
Collection是集合类的上级接口,继承于它的接口主要有Set和List;
Collections是针对集合类的一个帮助类,它提供一系列静态方法对各种集合的搜索、排序、线程安全化等操作。
16. 两个对象值相同(a.equals(b) == true),但却有不同的hash code,这句话对不?
对。
17. 简单描述一下JVM加载class文件的原理机制?
JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。
18. heap和stack有什么区别?
java的内存分为两类,一种是栈内存,一种是堆内存。栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个栈中的变量也将随之释放。
堆是栈作用的不同内存,一般用于存放不在当前方法栈中的那些数据,例如:使用new创建一个对象都放在堆里,所以,他不会随着方法的结束而消失。方法中的局部变量使用final修饰后,放在堆中而不是栈中。
19. GC是什么? 为什么要有GC?
GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者是错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC机制可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显式操作方法。
20. 写出单例模式(Singleton)

//第一种 :饿汉模式

public class SingleTon{
    private SingleTon(){}
    //实例化放在静态代码块里可提高程序的执行效率,但也可能占用更大的空间
    private final static SingleTon instance = new SingleTon();
    public static SingleTon getInstance(){
        return instance;
    }
}

//第二种:懒汉模式

publi class SingleTon{
    private SingleTon(){}
    private static instance = null;
    public static synchronized SingleTon getInstance(){
        if(instance == null){
            instance = new SingleTon();
        }
        return instance;
    }
}

猜你喜欢

转载自blog.51cto.com/13003060/2151295