Collection

Collection

Collection接口的方法: 

 
  1. <span style="font-weight: normal;">boolean add(Object o)      :向集合中加入一个对象的引用   
  2.   
  3. void clear():删除集合中所有的对象,即不再持有这些对象的引用   
  4.   
  5. boolean isEmpty()    :判断集合是否为空   
  6.   
  7. boolean contains(Object o) : 判断集合中是否持有特定对象的引用   
  8.   
  9. Iterartor iterator()  :返回一个Iterator对象,可以用来遍历集合中的元素   
  10.   
  11. boolean remove(Object o) :从集合中删除一个对象的引用   
  12.   
  13. int size()       :返回集合中元素的数目   
  14.   
  15. Object[] toArray()    : 返回一个数组,该数组中包括集合中的所有元素 </span>  

1.List

 

JDK不提供此接口的任何直接实现:它提供更具体的子接口(如 Set 和 List)实现。此接口通常用来传递 collection,并在需要最大普遍性的地方操作这些 collection。

所有通用的 Collection 实现类(通常通过它的一个子接口间接实现 Collection)应该提供两个“标准”构造方法:一个是 void(无参数)构造方法,用于创建空 collection;另一个是带有 Collection 类型单参数的构造方法,用于创建一个具有与其参数相同元素新的 collection。实际上,后者允许用户复制任何 collection,以生成所需实现类型的一个等效 collection。尽管无法强制执行此约定(因为接口不能包含构造方法),但是 Java 平台库中所有通用的 Collection 实现都遵从它。

一些 collection 实现对它们可能包含的元素有所限制。例如,某些实现禁止 null 元素,而某些实现则对元素的类型有限制。试图添加不合格的元素将抛出一个未经检查的异常,通常是 NullPointerException 或 ClassCastException。试图查询是否存在不合格的元素可能抛出一个异常,或者只是简单地返回 false;某些实现将表现出前一种行为,而某些实现则表现后一种。较为常见的是,试图对某个不合格的元素执行操作且该操作的完成不会导致将不合格的元素插入 collection 中,将可能抛出一个异常,也可能操作成功,这取决于实现本身。这样的异常在此接口的规范中标记为“可选”。

Collections Framework 接口中的很多方法是根据 equals 方法定义的。例如,contains(Object o) 方法的规范声明:“当且仅当此 collection 包含至少一个满足 (o==null e==null :o.equals(e)) 的元素 e 时,返回 true。”不 应将此规范理解为它暗指调用具有非空参数 o 的 Collection.contains 方法会导致为任意的 e 元素调用 o.equals(e) 方法。可随意对各种实现执行优化,只要避免调用 equals 即可,例如,通过首先比较两个元素的哈希码。(Object.hashCode() 规范保证哈希码不相等的两个对象不会相等)。较为常见的是,各种 Collections Framework 接口的实现可随意利用底层 Object 方法的指定行为,而不管实现程序认为它是否合适。

ArrayList

List容器的迭代器来从容器最开始向后来依次遍历其中的元素;还提供了一个反向的迭代器,从容器的最后向前来依次访问其中的元素。

List和数组一样,其中的元素可以通过下标来访问,下标都是从0开始。List中的元素都有其对应的顺序索引,可以像数组一样访问List中的元素,方便在List中插入、删元素,元素的索引和与其插入的顺序有关,List种刻意保存重复的元素。

List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象元素列表。List 适用于按数值索引访问元素的情形。

 

  1. package code;  
  2. import java.util.ArrayList;  
  3. import java.util.Iterator;  
  4. public class SimpleTest {  
  5.    
  6.    
  7.  public static void main(String []args){  
  8.     
  9.   ArrayList list1 = new ArrayList();    
  10.   list1.add("one");  
  11.   list1.add("two");  
  12.   list1.add("three");  
  13.   list1.add("four");  
  14.   list1.add("five");  
  15.   list1.add(0,"zero");    
  16.   System.out.println("<--list1*有>" + list1.size()+ "个元素");    
  17.   System.out.println("<--list1中的内容:" + list1 + "-->");  
  18.     
  19.   ArrayList list2 = new ArrayList();  
  20.   list2.add("Begin");  
  21.   list2.addAll(list1);  
  22.   list2.add("End");  
  23.   System.out.println("<--list2*有>" + list2.size()+ "个元素");    
  24.   System.out.println("<--list2中的内容:" + list2 + "-->");  
  25.     
  26.   ArrayList list3 =  new ArrayList();  
  27.   list3.removeAll(list1);  
  28.   System.out.println("<--list3中是否存在one: "+ (list3.contains("one")? "是":"否")+ "-->");  
  29.     
  30.   list3.add(0,"same element");  
  31.   list3.add(1,"same element");  
  32.   System.out.println("<--list3*有>" + list3.size()+ "个元素");    
  33.   System.out.println("<--list3中的内容:" + list3 + "-->");  
  34.   System.out.println("<--list3中第一次出现same element的索引是" + list3.indexOf("same element") + "-->");  
  35.   System.out.println("<--list3中最后一次出现same element的索引是" + list3.lastIndexOf("same element") + "-->");  
  36.     
  37.     
  38.   System.out.println("<--使用Iterator接口访问list3->");  
  39.   Iterator it = list3.iterator();  
  40.   while(it.hasNext()){  
  41.    String str = (String)it.next();  
  42.    System.out.println("<--list3中的元素:" + list3 + "-->");  
  43.   }  
  44.     
  45.   System.out.println("<--将list3中的same element修改为another element-->");  
  46.   list3.set(0,"another element");  
  47.   list3.set(1,"another element");  
  48.      System.out.println("<--将list3转为数组-->");  
  49.     // Object []  array =(Object[]) list3.toArray(new   Object[list3.size()] );  
  50.      Object [] array = list3.toArray();  
  51.      for(int i = 0; i < array.length ; i ++){  
  52.       String str = (String)array[i];  
  53.       System.out.println("array[" + i + "] = "+ str);        
  54.      }       
  55.        
  56.      System.out.println("<---清空list3->");  
  57.      list3.clear();  
  58.      System.out.println("<--list3中是否为空: " + (list3.isEmpty()?"是":"否") + "-->");  
  59.      System.out.println("<--list3*有>" + list3.size()+ "个元素");   
  60.     
  61.   //System.out.println("hello world!");  
  62.  }  
  63. }  

2.Map

Collection接口的实现只能保存单个元素,当需要集中存储和管理的数据是一组存在映射或关联关系的数据时,无法满足,就需要Map来实现,

Map的实现类中可以存储以键--值对形式存在的多组数据,一组键--值对表示具有映射或关联关系的一组数据。

entrySet方法一次拿到所有key和value的集合;而keySet拿到的只是key的集合,针对每个key,都要去Map中额外查找一次value,从而降低了总体效率。

map集合的两种取出方式: 
1 . Set<k> keySet:将map中所有的键存入到Set集合。因为set具备迭代器。所有可以迭代方式取出所有的键,在根据get方法。获取每一个键对应的值。 
     Map集合的取出原理:将map集合转成set集合。在通过迭代器取出。 
2 . Set<Map.Entry<k,v>> entrySet:将map集合中的映射关系存入到了set集合中,而这个关系的数据类型就是:Map.Entry 
     Entry其实就是Map中的一个static内部接口。 
     定义在内部因为只有有了Map集合,有了键值对,才会有键值的映射关系。关系属于Map集合中的一个内部事物。而且该事物在直接访问Map集合中的元素。

map遍历的几种方案:

1.用for循环

for(Map.Entry<String, String> entry:map.entrySet()){
          System.out.println(entry.getKey()+"--->"+entry.getValue());
 }

2.用迭代 

Set set = map.entrySet();     
Iterator i = set.iterator();     
while(i.hasNext()){  
    Map.Entry<String, String> entry1=(Map.Entry<String, String>)i.next();
    System.out.println(entry1.getKey()+"=="+entry1.getValue());
}

3.用keySet()迭代 

Collection
Iterator it=map.keySet().iterator();
while(it.hasNext()){
    String key;
    String value;
    key=it.next().toString();
    value=map.get(key);
    System.out.println(key+"--"+value);
}