List是一个接口,而ListArray是一个类。
ListArray继承并实现了List。
因此List不能被构造,但能够向上面那样为List建立一个引用,而ListArray就能够被构造。
List list; //正确 list=null;
List list=new List(); // 是错误的用法
List list = new ArrayList();这句建立了一个ArrayList的对象后把上溯到了List。此时它是一个List对象了,有些ArrayList有可是List没有的属性和方法,它就不能再用了。
而ArrayList list=new ArrayList();建立一对象则保留了ArrayList的全部属性。
这是一个例子:
import java.util.*;
public class TestList{
public static void main(String[] args){
List list = new ArrayList();
ArrayList arrayList = new ArrayList();
list.trimToSize(); //错误,没有该方法。
arrayList.trimToSize(); //ArrayList里有该方法。
}
}
编译一下就知道结果了。
若是这个样子:
List a=new ArrayList();
则a拥有List与ArrayList的全部属性和方法,不会减小
若是List与ArrayList中有相同的属性(如int i),有相同的方法(如void f()),
则a.i是调用了List中的i
a.f()是调用了ArrayList中的f();
---------------------------------------------------------------
问题的关键:
为何要用 List list = new ArrayList() ,而不用 ArrayList alist = new ArrayList()呢?
问题就在于List有多个实现类,如今你用的是ArrayList,也许哪一天你须要换成其它的实现类,如 LinkedList或者Vector等等,这时你只要改变这一行就好了:
List list = new LinkedList(); 其它使用了list地方的代码根本不须要改动。
假设你开始用 ArrayList alist = new ArrayList(), 这下你有的改了,特别是若是你使用了 ArrayList特有的方法和属性。
地区用 List arr = new ArrayList();定义;行业用 ArrayListarr = new ArrayList();定义;则说明,行业里用到了ArrayList的特殊的方法.
另外的例子就是,在类的方法中,以下声明:
private void doMyAction(List list){}
这样这个方法能处理全部实现了List接口的类,必定程度上实现了泛型函数.
java
若是开发的时候以为ArrayList,HashMap的性能不能知足你的须要,能够经过实现List,Map(或者Collection)来定制你的自定义类.数据结构
java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap Hashtable LinkedHashMap 和TreeMap.app
Map主要用于存储健值对,根据键获得值,所以不容许键重复(重复了覆盖了),但容许值重复。
Hashmap 是一个最经常使用的Map,它根据键的HashCode值存储数据,根据键能够直接获取它的值,具备很快的访问速度,遍历时,取得数据的顺序是彻底随机的。 HashMap最多只容许一条记录的键为Null;容许多条记录的值为 Null;HashMap不支持线程的同步,即任一时刻能够有多个线程同时写HashMap;可能会致使数据的不一致。若是须要同步,能够用 Collections的synchronizedMap方法使HashMap具备同步的能力,或者使用ConcurrentHashMap。函数
Hashtable与 HashMap相似,它继承自Dictionary类,不一样的是:它不容许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,所以也致使了 Hashtable在写入时会比较慢。性能
LinkedHashMap 是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先获得的记录确定是先插入的.也能够在构造 时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种状况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比 LinkedHashMap慢,由于LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。spa
TreeMap实现SortMap接口,可以把它保存的记录根据键排序,默认是按键值的升序排序,也能够指定排序的比较器,当用Iterator 遍历TreeMap时,获得的记录是排过序的。线程
一 般状况下,咱们用的最多的是HashMap,在Map 中插入、删除和定位元素,HashMap 是最好的选择。但若是您要按天然顺序或自定义顺序遍历键,那么TreeMap会更好。若是须要输出的顺序和输入的相同,那么用LinkedHashMap 能够实现,它还能够按读取顺序来排列.
code
HashMap是一个最经常使用的Map,它根据键的hashCode值存储数据,根据键能够直接获取它的值,具备很快的访问速度。HashMap最多只容许一条记录的键为NULL,容许多条记录的值为NULL。orm
HashMap不支持线程同步,即任一时刻能够有多个线程同时写HashMap,可能会致使数据的不一致性。若是须要同步,能够用Collections的synchronizedMap方法使HashMap具备同步的能力。
对象
Hashtable与HashMap相似,不一样的是:它不容许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,所以也致使了Hashtable在写入时会比较慢。
LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先获得的记录确定是先插入的。
在遍历的时候会比HashMap慢TreeMap可以把它保存的记录根据键排序,默认是按升序排序,也能够指定排序的比较器。当用Iterator遍历TreeMap时,获得的记录是排过序的。
import
java.util.HashMap;
import
java.util.Iterator;
import
java.util.LinkedHashMap;
import
java.util.Map;
public
class
TestLinkedHashMap {
public
static
void
main(String args[])
{
System.out.println(
"*************************LinkedHashMap*************"
);
Map<Integer,String> map =
new
LinkedHashMap<Integer,String>();
map.put(
6
,
"apple"
);
map.put(
3
,
"banana"
);
map.put(
2
,
"pear"
);
for
(Iterator it = map.keySet().iterator();it.hasNext();)
{
Object key = it.next();
System.out.println( key+
"="
+ map.get(key));
}
System.out.println(
"*************************HashMap*************"
);
Map<Integer,String> map1 =
new
HashMap<Integer,String>();
map1.put(
6
,
"apple"
);
map1.put(
3
,
"banana"
);
map1.put(
2
,
"pear"
);
for
(Iterator it = map1.keySet().iterator();it.hasNext();)
{
Object key = it.next();
System.out.println( key+
"="
+ map1.get(key));
}
}
}
运行结果以下:
*************************LinkedHashMap*************
6=apple
3=banana
2=pear
*************************HashMap**************************
2=pear
6=apple
3=banana
分析:LinkedHashmap 的特色是put进去的对象位置未发生变化,而HashMap会发生变化.