面试心得与总结-——答案整理_1 持续更新

      最近各种看面经,无意间发现一篇对面试总结得比较全面,自己好好看了一遍,笔者真实很用心,写得太全面了,后来一google,发现各大论坛和网站都在转发该篇面经,我试图搜索一下作者,一搜一大片的复制粘贴,也没有写出处,也无从感谢作者了,
现在将一个链接奉上,可以好好看看,对面试有很大帮助.
http://www.360doc.com/content/16/0216/00/26211242_534899333.shtml

     当我该篇面经的时候,自己也很激动,感觉发现了新大陆,心情异常的兴奋,因此决定按照他提供的思路进行面试准备,断断续续对其在面试中遇到的问题进行整理,希望在面试中对自己有帮助,现在拿出来给大家分享,答案是自己根据查资料自己理解手敲的,理解得不对的希望大家指正,谢谢。


J2SE基础

1. 九种基本数据类型的大小,以及他们的封装类。
Long(64),Integer(32),Short(16),Double(64),Float(32),Character(16),Byte(8),
Boolean(1),void
为什么java能做到基本类型大小与平台无关:因为java是运行在jvm虚拟机上的,基本类型占用的类型大小是按占用的字节的个数多少来决定的,像64位就占用8个字节,因此能做到与平台无关性。
扩展:java类型分为基本类型和引用类型:引用类型:class type,interface type,
Array type,null type;


2. Switch能否用string做参数?
在java7之前是不可以的,只能用char,int,byte,short,和enum类型
在java7之后就可以使用string类型作为参数。


3. equals与==的区别。
equal比较的是对象的是否相等,而==号是比较地址。


4. Object有哪些公用方法?
Wat(),notify(),notifyAll(),hascode(),toString(),equals(),getClass(),clone(),getClass(),
finalize()
各个方法关键内容:
1:wait(),notify(),notifyall():在并发编程中,他们都是针对同一个对象的,也就是同一个object调用notify()或者是调用notifyAll()方法唤醒的是同一个object()中wait()的线程,而不是别的线程。Wat()和sleep()的区别区别是wait()会放弃当前持有的锁,而sleep()不会放弃当前持有的锁。
2:hashCode()与equals()方法:
1:判读两个对象是否相等的规则:equals()方法是先比较一个对象的hashCode是否相等,然后在判读对象是否相等(一般是成员变量比较)。
2:为什么要重写equals()方法:Object默认的equals()方法是比较两个对象默认的引用是否相等(public boolean equals(Object obj) {return (this == obj);}),如过你要判读两个对象的值是否相等,则需要重写equals()方法。
3:一般地方不要求重写hashCode(),但是当对象要存入hashMap,hashTable或者hashSet(value本身就是key)中作为key的时候,如过重写equal方法,则要求重写hashCode()方法。在hashMap中,会采用hashCode()来计算该对象的hash值,然后决定存入哪一个槽位,当用get方法获取该对象时,则会通过该对象(key)的hashCode()计算其存储的槽位,然后通过equal()方法来确定该槽位中对应的entry的key是否与寻找的的key值是否相等 (get方法中源代if(e.hash==hash&&((k=e.key)== key||key.equals(k)))。equal相等,在要求hashCode不相等(则在hash中找不到对应的值),如过put进hash表的和get的hash表的key的hashcode不一致,始终是找不到key值的,所以要求两个hashCode要相等(所以说一般要求重写equals方法),不想等会造成内存泄漏。Hashcode相等,则不要求equals相等。自己可以举例子
4:在使用hashMap的时候,一般用不可变对象作为key值,因为他们中都复写了equal方法和hashCode()方法,自己写对象作为key则要重写equals和hashCode,实践中曾用身份证作为对象来当作key(不要将,问的时候再说,了解下应用场景)
3.toString()方法没啥好说的。复写很简单。
4.Clone()方法使用:
1:clone()方法用来复制一个对象,自己创建一个对象,然后调用对象clone()方法,就会在堆中在重新分一个区域,来存放该对象的备份,并建立一个新的引用指向该内存区域。同时,要是一个对象要被复制,必须要实现Clonesabel接口(只是一个标志接口,跟serializable一样,内部用obj instance of Conesabel来验证),
2:同时两个内存里面的东西是复制,也就是一样的,因此obj.clone().getClass()==obj.getClass()。也就是对象实例相等,但是引用是不相等的。
3:同时有一点就是要要注意:clone()方法只是简单的复制一个对象,因此如果一个对象中有一个引用作为变量,那么该应用也直接复制,这样就导致两个两个内存区域的引用指向同一个对象,因此这叫浅引用。
4:Class.forName(),getClass()和类名.class,都已可以获得一个Class对象,但是class是静态属性,不需要创建对象,而getClass()需要创建一个对象才可以用。此外,Class.forName()和getClass()是在运行时加载;Class.class是在编译器加载,即.class是静态加载,.getClass()是动态加载。但是最终功能没什么区别,主要用于反射。
5:finalize()方法:这个java虚拟机垃圾回收有关,两次标记(finailize()方法):即使经过可达性分析以后该对象不可到达,不代表该对象非死不可,是否死亡要经历两次标记,这还有由之后的动作决定:1:如果对象在进行可达性分析以后和gc roots没有直接或者间接的相连,此时会进行第一次标记,筛选的条件:当finalize()方法没有被覆盖或者finalize()方法被调用过,则这次标记的对象被回收。
第二次标记:如果一个对象覆盖了finalize()方法,那么该对象将被放在一个叫F-queue的队列中,之后虚拟机会自动触发该队列中的finalize()方法的执行(虚拟机只是触发,并不会等到其执行完,如果等待容易造成阻塞),如果在执行finalize()方法的时候,如果该对象没有重新与gc roots建立连接(将this赋值给某个静态变量就和gc ro ots建立联系了),他就会被垃圾回收器回收。所以收对象可以在finalize()方法中拯救自己


5.Java的四种引用,强弱软虚,用到的场景。
1:Java中四种引用是强引用,弱应用,软引用,虚引用。强引用:用new关键字创建的对象,只要引用还存在,gc就不会回收
软引用:就是一些还有用但是非必需的对象;在系统即将发生内存溢出之前,才会把这些对象进行回收
弱引用:比软引用的强度要若的对象,他能生成到下一次垃圾回收器回收之前,下一次垃圾回收器就会把他收回去,不管发不发生内存溢出。
虚引用:为对象设置一个虚引用的目的就是为了在垃圾回收时收到一条系统通知,不能通过虚引用获得一个对象。

2:四种引用为什么存在的原因:如过我们使用hashMap来存储对象的时候,当里面装入大量数据的时候,如过我们不手动clear(将所有value设置为null),那么就会一直存在,知道发生内存溢出。因此引入弱引用和软引用的目的就是将回收的问题交给java虚拟机,我们自己不直接管理,如过HashMap中数据过多,则垃圾回收器自行回收。
3:应用场景:像弱引用和软引用的引用场景就是cache啦,因为cache是不能保证绝对的可靠,因此我们可以用WeakHashMap来当缓存,这样垃圾回收器会自动进行回收。如果一些重要的数据,则不能用weakHashMap。


6. Hashcode的作用。
1:HashCode的作用主要是用来配合基于散列的集合的,如HashMap,hashTable,hashSet之类的。用于计算散列值,然后决定存储的槽位。
2:为什么需要hashCode,只用equals()方法不就可以吗?假如在hash表中(非链式hash表)如过将每一个对象都进行equals的话,如过是比较一个对象,里面有很多字段,我们要逐一比较,消耗是比较大的,有了hashcode,我们就能大大减轻的比较的消耗,(hashcode默认是地址,但是我们重写的时候一般是地址和字段进行配合得出),
3:hashcode和equal有一个规则: 就是hashCode相等,则equals可能不相等,(因为hashCode可能不是一个地址生成,即使默认用地址生成,他指向的对象可能也会发生改变)。如过equals相等,则hashCode一定相等。所以如果只用hashCode的话,它可以用来判断一个对象不相等,而不能用来判断一个对象相等,因此它可以提高查找的速率。


7. ArrayList、LinkedList、Vector的区别。
1:ArrayList,Vector采用的数组的形势来存储数据,两个都继承List,因此数组在查找的时候是很快的,但是在删除和插入的时候效率,比较低,因为要改变插入元素或删除后面所有序号,但是Vector是线程安全的,在很多方法中都加了一个synchronized,将方法锁起来,因此效率比较低。(细节的话还有就是他们扩容因子不一样,Vector默认扩容是原来的2倍,而ArrayList是原理的1.5倍)
2:LinkedList是采用双向链表来实现的,他继承(List和Queue两个接口)因此查找的时候速度会稍微低一些,但是在插入或者删除的时候速度会很快。由于LinkedList继承了Queue接口,他还可以当队列来使用(add方法相当于addLast())
3:set和List都继承了Collection接口,但是List都是有序的,一般用链表或者数组实现,而set一般都是无序且唯一的,一般采用hash表接口(HashMap采用的链式hash表,hash表有很多种)
4:而且arraylist和vector采用数组,就存在resize的问题(扩容),重写细算数据大小,将原来数组拷贝到新数据中,因此比较耗费时间,而linkedList采用链表形式,没有resize,因此对于增长较快的,应该采用linkedList;


8. String、StringBuffer与StringBuilder的区别。
1:String类型是不可变的,体现在两个方面:1.该类的实现实际上是采用char[]实现的,其中char[]数组变量是不可变,所以说该类是不可变的,而不是说该类用final修饰,然后不可变,final修饰只能说是不可覆盖。2。同时String类是不可变的,也就是每一次操作的都会返回一个新数组对象(return new String(buf))。
2:而StringBuffer和StringBuilder是可变的,1:他们的操作过后每一返回的都是该字符串本身(return this)。2:而StringBuilder和StringBuffer都继承了AbstractStringBuilder,在AbstractStringBuilder中,char[]类型的数组变量没有用final修饰,这一体现出了他们的可变特性。
3:StringBuffer是线程安全的,而StringBuilder是线程不安全的,也就是StringBuffer的很多方法中都加了synchronized对方法进行加锁。
4:包装了Integer,Character之类也是不可变的,因为他们除了用final修饰类本身,他们也用final修饰了内部的int和char基本类型的变量
5:由于String在进行连接操作时,会用String字符串创建一个StringBuilder对象,然后调用StringBuilder的append()方法来连接两个字符串,因此在进行大量的连接操作的时候,要使用StringBuilder或者StringBuffer,节省资源损耗 


9. Map、Set、List、Queue、Stack的特点与用法。
Map特点:以键值对形式存入数据,而且键可以是null值,但是只能为一个null值,后面的null值会覆盖前面的。
Set特点:继承Collection接口,放入数据没有顺序,像HashSet其实就是采用HashMap的key值来来存放Set的value;不能放入重复值,可以存入null值
List,继承Collection接口,可以放入重复值,可以存入null值,放入的是有顺序的
Stack:是栈,先进后出,LinkedList也是可以实现栈,但是在java中并没哟让LinkedList继承Stack类,而是有一默认的Stack类。Java.util包中的栈继承了Vector,因此Stack类是用数组实现的,而且是线程安全的。
Queue:队列,先进后出,LinkedList及继承了接口,因此可以用LinkedList创建queue;


10. HashMap和HashTable的区别。
1:HashMap是不是线程安全的,HashTable是线程安全的,HashMap允许key或者value为null,而hashTable不允许key或者value为null,同时HashTable继承Dictionary类,而hashMap,继承AbstractMap类,但是都实现类Map接口
2:原因:hashMap的put()方法一开始就有一个if(key==null){return putForNullKey(value)},因此可知key可以为null。而HashTable中put()方法是if(value==null){throw new NullpointerException()},而且下面要调用key.hashCode(),因此如过key或者value为null,则会发生异常。
3:如过HashMap要实现同步,则可以采用Collection.sychronbizedMap(HashMap),这样就能够达到HashTable的效果

猜你喜欢

转载自fjding.iteye.com/blog/2319515