--说说ArrayList,Vector,LinkedList的存储性能和特性。

--ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,他们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法,线程安全的,通常性能上较ArrayList差。

而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后相即可,所以插入的速度较快。

LinkedList也是线程不安全的,LinkedList提供一些方法,使得LinkedList可以被当做堆栈和队列来使用。

 

--List和Map的区别。

--一个是存储单列数据的集合,另一个是存储键值对这样的双列的数据的集合,List中存储的数据是有顺序并且允许重复,Map中存储的数据是没有顺序的,其键不能重复,值是可以重复的。

注意:List中的顺序不是指那种按年龄,按大小,按价格之类的排序。

当我们调用add(Object o)方法时,每次加入的对象就像火车站买票有排序顺序一样,按先来后到的顺序。有时候也可以插队,即add(int index,Object o)方法,就可以指定当前对象在集合中的存放位置。一个对象可以被反复存储进List中,每调用一此add方法,这个对象就被插入进集合中依次。

其实,并不是这个对象本身存储进了集合,而是在集合中用了一个索引变量指向这个对象,当这个对象被add多次,即相当于集合中有多个索引指向了这个对象,List除了可以以iterator接口取得所有的元素,还可以调用get(index i)来明确说明取第几个。

补充:List和Set具有相似性,他们都是单列元素的集合,所以他们有一个公共的父接口,Collection。List以特定次序来持有元素,可以有重复元素。Set无法拥有重复元素,内部排序。Map保存key-value值,value可以多值。

 

--Collection和Collections的区别。

--Collection是集合类的上级接口,继承他的接口主要有Set和List。

Collections是针对集合类的一个帮助类,他提供了一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

 

--什么是java序列化?符合实现java序列化?或者请解释Serializable接口的作用。

--我们有时候将一个java对象变成字节流的形式传出去或者从一个字节流中恢复java对象。

例如,要将java对象存储到硬盘或者传送给网络上的其他计算机,这个过程我们可以自己写一段代码去把一个java对象变成某个格式的字节流再传输,但是jre本身就提供了这种支持,我们可以调用OutputStream的writeObject方法来做,如果要让java帮我们做,需要被传输的java对象实现Serializable接口,这样,javac编译时就会进行特殊处理,编译的类才可以被writeObject方法操作,这就是所谓的序列化。

该接口没有需要实现的方法,只是为了标注该对象是可被序列化的。

例如:在web开发中,如果对象被保存在了Session中,tomcat在重启时要把Session对象序列化到硬盘,这个对象就必须实现了Serializable接口。

 

--heap和stack有什么区别?

--java的内存分为两类,一类是栈内存,一类是堆内存。

  栈内存是指程序进入一个方法时,会为这个方法单独分配一块存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个栈中的变量也将随之释放。

  堆是与栈作用不同的内存,一般用于存放不在当前方法栈中的那些数据,例如,new创建的对象都放在堆里,所以,他不会随方法的结束而消失。方法中的局部变量使用final修饰后,放在堆中而不是栈里。