Java常见问题总结

一、Object有哪些公共方法?html

答:clone(),equals(),hashCode(),wait(), getClass(),finalize(),notify(),notifyAll(),toString()java

二、Object中finalize()的做用?数组

答:用于清理。finalize()方法不须要显示地调用, 在垃圾回收(GC)时会被自动先行调用的。安全

三、Java中四种引用方式?jsp

答:http://my.oschina.net/eager/blog/726428性能

四、hashCode()的做用?ui

答:hashcode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值。spa

        在 Java 应用程序执行期间,在对同一对象屡次调用 hashCode()时,必须一致地返回相同的整数,前提是将对象进行hashCode()比较时所用的信息没有被修改。.net

  • 若是两个对象根据hashCode()返回的整数值不等,则equals()获得的结果一定为false;
  • 若是两个对象根据equals()比较是相等的,那么调用两个对象的hashCode()必须返回相同的整数结果;
  • 若是两个对象根据equals()比较是不等的,则hashCode()不必定得返回不一样的整数。

详见:http://www.cnblogs.com/dolphin0520/p/3681042.html线程

五、ArrayList、LinkedList、Vector的区别?

线程安全性:

  • Vector、Stack:线程安全
  • ArrayList、LinkedList:非线程安全

实现方式:

  • LinkedList:双向链表
  • ArrayList,Vector,Stack:数组

扩容方式:

Stack继承自Vector,故不分开解释。

  • ArrayList扩容原来的50%(int newCapacity = (oldCapacity * 3)/2 + 1)
  • Vector缺省状况是原来的1倍(newCapacity  = oldCapacity * 2)

 其余详见:http://blog.csdn.net/a19881029/article/details/45533733

六、String、StringBuffer与StringBuilder的区别?

  • String类为final类型
  • StringBuffer线程安全的可变字符序列
  • StringBuilder线程不安全,JDK5.0新增
  • 在构造 StirngBuffer 或 StirngBuilder 时应尽量指定它们的容量。若是操做的字符串长度(length)不超过 16 个字符就不用了,缺省时默认构造一个容量为16的对象,不然不指定会下降性能

详见:http://blog.csdn.net/kingzone_2008/article/details/9220691

七、java.io 与 java.nio的区别?

主要区别以下表:

IO NIO
面向流 面向缓冲
阻塞IO 非阻塞IO
选择器

详见:http://my.oschina.net/eager/blog/729320

八、HashMap和Hashtable(注意 t 是小写的)的区别?

  • Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现;
  • Hashtable是线程安全的,HashMap是线程不安全的;
  • HashMap容许null做为Entry的key和value,Hashtable不容许;
  • Hashtable使用Enumeration,HashMap使用Iterator遍历;
  • Hashtable中hash数组默认大小是11,扩容的方式是 old*2+1,HashMap中hash数组的默认大小是16,扩容必定是2的指数。

九、HashMap和ConcurrentHashMap的区别?

  • HashMap是since JDK1.2,ConcurrentHashMap是since JDK1.5;
  • HashMap是线程不一样步的,ConcurrentHashMap是线程同步的;
  • HashMap本质是数组+链表,ConcurrentHashMap将数据分为多个segment,默认16个。

ConcurrentHashMap详见:http://www.cnblogs.com/dolphin0520/p/3932905.html

ConcurrentHashMap实现同步分析:http://blog.csdn.net/xuefeng0707/article/details/40834595

十、Hashtable和ConcurrentHashMap的区别?

  • Hashtable采起的是synchronized整个方法,ConcurrentHashMap采起的是synchronized代码块
  • Hashtable每次同步锁总体,ConcurrentHashMap只锁当前须要用到的segment

更多关于Map的详见:http://my.oschina.net/eager/blog/729795

十一、try{}里有一个return语句,finally{}里的代码还会执行吗?

会执行,在return以前执行。

public class Test {
	public static void main(String[] args) {
		int a = 1;
		System.out.println("a:"+a);
		System.out.println("result:"+getNum(a));
	}

	public static int getNum(int a) {
		try {
			a = 2;
			System.out.println("try-a:"+a);
			return a;
		} finally {
			a = 3;
			System.out.println("finally-a:"+a);
		}
	}
}

结果展现:

可能会以为很疑惑,从输出能够看出是执行了finally中的语句,但为何最终返回值是2。由于若是存在finally代码块,try中的return语句不会立马返回调用者,而是记录下返回值待finally代码块执行完毕以后再向调用者返回其值,因此在finally块中调用return,则会修改返回值,可是不建议这样作。

十二、Excption与Error包结构?

1三、OOM你遇到过哪些状况?SOF你遇到过哪些状况?

OOM(Out Of Memory):当JVM由于没有足够的内存来为对象分配空间而且垃圾回收器也已经没有空间可回收时,就会抛出这个Error(注:非Exception,由于这个问题已经严重到不足以被应用处理)。

  • 1)分配的少了,好比虚拟机自己可以使用的内存(通常经过启动时的JVM参数指定)太少。
  • 2)应用用的太多,而且用完没释放,浪费了,此时就会形成内存泄露或者内存溢出。
    • 内存泄露:申请使用完的内存没有释放,致使虚拟机不能再次使用该内存,此时这段内存就泄露了,由于申请者不用了,而又不能被虚拟机分配给别人用。
    • 内存溢出:申请的内存超出了JVM能提供的内存大小,此时称之为溢出。

常见内存溢出状况:

  • java.lang.OutOfMemoryError: Java heap space ------>java堆内存溢出,此种状况最多见,通常因为内存泄露或者堆的大小设置不当引发。对于内存泄露,须要经过内存监控软件查找程序中的泄露代码,而堆大小能够经过虚拟机参数-Xms,-Xmx等修改。
  • java.lang.OutOfMemoryError: PermGen space ------>java永久代溢出,即方法区溢出了,通常出现于大量Class或者jsp页面,或者采用cglib等反射机制的状况,由于上述状况会产生大量的Class信息存储于方法区。此种状况能够经过更改方法区的大小来解决,使用相似-XX:PermSize=64m -XX:MaxPermSize=256m的形式修改。另外,过多的常量尤为是字符串也会致使方法区溢出

SOF(Stack Over Flow):JAVA虚拟机栈溢出,通常是因为程序中存在死循环或者深度递归调用形成的,栈大小设置过小也会出现此种溢出。能够经过虚拟机参数-Xss来设置栈的大小。

详见:http://www.cnblogs.com/gaojing/archive/2012/10/30/2844938.html

 

未完待续,该博客会每一天进行更新。

相关文章
相关标签/搜索