java 经常使用集合

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会发生变化.

相关文章
相关标签/搜索