面试准备&总结-Java基础篇

  在vps的服务器到期了,在hw又不能访问,直接在博客园写笔记了。


 基础篇

1. 集合类的继承关系,源码实现原理,初始大小和如何增长。

- list类初始大小10,加载因子为1,扩容到1.5+1。底层是个Object数组,调用 System.arraycopy进行拷贝。

- Vector同上,扩容倍数是两倍,是同步的,线程安全。

- HashMap初始大小16,加载因子0.75f,扩容到2倍。底层是数组+链表,调用resize()调整位置。ConcurrentHashMap分段锁,相当于若干个hashtable。

  -散列冲突:开放定址法,链地址法,最坏情况下如何优化。

- HashTable初始大小11,加载因子0.75f,扩容到2倍+1。同步,线程安全。Hashtable不允许空key空value

- TreeMap. 底层红黑树,能够保持有序,效率略低。

-阻塞队列LinkedBlockingQueue,非阻塞队列ConcurrentLinkedQueue,常用在线程pipe上。

指定大小可以提高性能。可能还会问Collections和Arrays中常用的方法。

2.  interface和abstract class的区别

-接口可以多重实现,抽象类不能多重继承。

-抽象类中可以有attribute,接口只能有method。

-接口的方法必须没有实现,抽象类可以有实现的方法。

-接口中的方法默认且必须是public的,抽象类可以protected。

 3. 实例化一个未加载过的类的过程。 class.forName,classLoader 加载类卸载类,

- 先加载类时触发父类静态域初始化、然后触发子类静态域,再调用父类构造函数,再调用子类构造函数。

- Class.forName:http://www.cnblogs.com/zabulon/p/5826610.html

- ClassLoader模型,使用:http://www.cnblogs.com/eoss/p/5992499.html 

4.错误Error和异常Exception的分类,throws和throw的区别,return和finally的执行顺序。

Java的异常(包括Exception和Error)分为 checked exceptions 和 unchecked exceptions :

-checked exceptions :除了RuntimeException及其子类以外,其他的Exception类及其子类。Java编译器会检查它,并强制要求处理。

-unchecked exceptions:包括运行时异常(RuntimeException与其子类)和错误(Error)。

 

还有ArrayIndexOutofBoundsException、SecurityException等。

 5.Object有哪些方法?

-toString,hashCode,equals

-clone(浅复制),finalize,getClass

-wait,notify,notifyAll

6. ==、equals、hashCode的关系。有可能配合String问,有可能配合set问。

- ==对基本类型比较值,对引用类型比较地址。

- equals对于基本类型比较值,默认对引用类型也比较地址,(String重写了equals方法)。

- hashCode默认返回地址,通常需要与equals一起重写。

- String a= "abc"; String b = new String("abc"); String c = "ab"+"c";

 下面这些表达式的值为真: a!=b; a==c;  a.equals(b); a.equals(c);

 

7.基本数据类型占的空间和范围是多少,int大小和JVM的位宽有关系吗?

-boolean、byte、char、short、int、long

-float、double

无关。

8.列举一些你用过的类、包、异常,新特性。

10.volatile关键字的作用?

 防止编译器优化,保证cache一致性。

11.乐观锁悲观锁,公平所不公平锁,原子类,原理实现方法。

乐观锁:只在提交操作时检查是否违反数据完整,java中的实现为cas

悲观所:读写全部加锁。

12线程协作,wait、notify、notifyAll,锁和while条件检查的位置,如何实现生产者消费者模式。

通常把synchronized放在while外面,防止信号丢失。

synchronized(syncObject){
    while(condition){
        suncObject.wait();
    }
}    

还可以使用lock、await和signal实现线程协作。见:http://www.cnblogs.com/alphablox/archive/2013/01/20/2868479.html

还可以使用blockingqueue实现。

实现生产者消费者模式,见:https://zhuanlan.zhihu.com/p/20300609

13.线程状态转换图,异常的处理。

 -图不贴了,比较简单。。

-线程产生的异常需要在线程内补获,set异常处理器。

14.string、stringbuilder、stringbuffer区别。

String是final的,所以修改效率不高,StringBuilder是线程安全的。

16IO和获取锁的阻塞操作能被interrupt么?

 不能抛出异常,但是会记录下,通过isInterrupted查看。

17 BIO NIO AIO的区别

 http://blog.csdn.net/anxpp/article/details/51512200

 

19编码UTF-8 和GBK和ANSI的区别?

 UTF-8:它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码,通用性强.

GBK:不论中、英文字符均使用双字节来表示.

转码使用unicode作为中转。如 String str1 = "hello"; 

byte[] bytes = str1.getBytes("utf-8"); //可以将unicode的string转码成{"utf-8"}编码模式下的二进制编码

String gbk = new String(bytes , "utf-8"); //将二进制编码按{"utf-8"}规则转为String。

20.异步回调的实现。

基于com.google.common.util.concurrent.ListenableFuture;

redisFuture.addListener(Runnable );

21对象序列化。

ObjectOutoutStream.writeObjet(),

22.

原文地址:https://www.cnblogs.com/kuracola/p/7440844.html