java面试基础篇(三)
1、Q:ArrayList 和 LinkedList 有什么区别?
A:ArrayList查询快!LinkedList增删快。ArrayList是基于索引的数据接口,它的底层是数组。空间占用相对小一些
LinkedList是链表结构,LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。
对于查询速度,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 对于插入或移除操作,LinedList比较占优势,因为ArrayList要移动数据(只限于在中间插入或移除,在末尾插入或移除效率是一样,
还有可能ArrayList效率更高)。ArrayList和LinkedList中的操作都是线程不安全的!所以,建议在单线程中才使用ArrayList,而在多线程中可以选择Vector或者CopyOnWriteArrayList。Vector的底层是向量数组,其实和ArrayList差不多。
2、Q:list,map,set的对比。
A:Set和List有一个共同的父类,就是Collection,Set中不能包含重复的元素,内部是无序的,List中可以包含重复数据,内部是有序的,可以直接通过角标来获取对应的值。
Map为独立接口,Set下有HashSet,LinkedHashSet,TreeSet;List下有ArrayList,Vector,LinkedList;Map下有Hashtable,LinkedHashMap,HashMap,TreeMap。
3、Q:String和StringBuilder、StringBuffer的区别
A:先别着急说String是不可变的,StringBuffer是可变的,我们先来看一段代码。
public static void main(String[] args) { String a = "A1"; System.out.println(a); a = a + "2"; System.out.println(a); }
该代码没有编译错误,运行也是没有错误的。我稍后为你解答,我们为什么总说String是不可变的。
这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面。
运行速度:在这方面运行速度快慢为:StringBuilder > StringBuffer > String
我们来看一下为什么String为什么会慢,String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。
这下自相矛盾了,刚才还说可变,这次又说不可变,我们来具体看一下代码和原因。如果运行这段代码会发现先输出“A1”,然后又输出“A12”,好像是a这个对象被更改了,其实,这只是一种假象罢了,JVM对于这几行代码是这样处理的,首先创建一个String对象a,并把“A1”赋值给对象a,然后在第三行中,其实JVM又创建了一个新的对象也名为a,然后再把原来的a的值和“2”加起来再赋值给新的对象a,而原来的a就会被JVM的垃圾回收机制(GC)给回收掉了,所以,a实际上并没有被更改,也就是前面说的String对象一旦创建之后就不可更改了。所以,Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。
再从线程安全的角度来说:如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。
总结一下String:适用于少量的字符串操作的情况,StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况,StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
4、Q: '==' 和 'equals' 的区别
A:对于基础数据类型,使用“=="比较值是否相等;
复合数据类型,当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。
对于equals方法,注意:equals方法不能作用于基本数据类型的变量,equals继承Object类,比较的是是否是同一个对象
如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。
5、Q:Java Error和Exception区别
A:Error和Exception都继承自Throwable;
二者不同之处:
Exception:
1.可以是可被控制(checked)或者不可控制(unchecked);
2.表示一个由程序员导致的错误;
3.应该在应用程序级被处理;
Error:
1.总是不可控制的(unchecked);
2.经常用来表示系统错误或者底层资源错误;
3.如果可能的话,应该在系统级被捕捉;
java 中定义了两类异常:
1) Checked exception: 这类异常都是Exception的子类 。异常的向上抛出机制进行处理,假如子类可能产生A异常,那么在父类中也必须throws A异常。可能导致的问题:代码效率低,耦合度过高。
2) Unchecked exception: 这类异常都是RuntimeException的子类,虽然RuntimeException同样也是Exception的子类,但是它们是非凡的,它们不能通过client code来试图解决,所以称为Unchecked exception 。