CoreJava学习4――集合之Collection框架和List集合

Collection框架和List集合

   集合框架中包含了一系列不同数据结构(线性表,查找表...),是用来保存一组数据的结构。

Collection下面有两个自接口:List和Set.

   List和Set最重要的区别在于:

   1)、List可以重复存放同一个元素,而Set不行。所以List是可重复集,Set是不可重复集。

   2)、List是有序集合,可以通过索引使用元素;而Set是无序集合。

List下常用有ArrayList,LinkedList。

Set下有HashSet和TreeSet等。

1、Collection常用方法

   int size():返回集合里边包含的对象个数

   boolean isEmpty():是否为空(不是null而是里边没有元素)

   boolean contains(Object o):是否包含指定对象

   boolean clear():清空集合

   boolean add(E e):向集合中添加对象

   boolean remove(Object o):移出某个对象

   boolean addAll(Collection <?extends E> c):将另一个集合中的所有元素添加到集合中。

   boolean removeAll(Collection<?> c):移出集合中与另一个集合中相同的全部元素。

   Iterator<E> iterator():返回该集合的对应的迭代器。

例:

List list1 = new ArrayList();
List list2 = new ArrayList();
List list3 = new ArrayList();     
list1.add("1");
list1.add("2");
list1.add("3");     
list2.add("4");
list2.add("5");     
list3.add("1");
list3.add("2");     
list1.addAll(list2);
System.out.println("list1"+list1);    //{1,2,3,4,5} 
list1.removeAll(list3);        //删除交集的部分
System.out.println("list1"+list1);    //{3,4,5} 
/** 只保留和给定集合元素相同的元素,其余的删掉。保留交集部分 */
list1.retainAll(list2);
System.out.println("list1"+list1);//{4,5}



2、ArrayList和LinkedList

  List接口是Collection的子接口,用于定义线性表数据结构,可以将List理解为存放对象的数组,只不过元素的个数可以动态增加或者减少。

  List接口最常见的实现类为ArrayList和LinkedList,分别用动态数组和链表的方式实现了List接口。

  可以认为他们的方法在逻辑上完全一样,只是在性能上有差别,ArrayList更适合于随机访问,而LinkedList更适合于插入和删除,在性能不是特别要求情况下可以忽略这个差别。  

  1)ArrayList――动态数组实现(自动扩容/维护)的List:可以通过下标迅速的索引到对应的元素,但是在删除和插入时移动较多元素。    

  2)LinkedList――链表实现的List:在插入和删除时只需要改变连接“指针”即可实现。

由于我们可以任意添加不同的对象,这样添加很方便,但是在获取时容易出现“类造型异常”。

   获取元素时,得到的都是Object,若要转换成实际类,就要造型。

   在造型之前需要判断,否则就会出现造型异常ClassCastException。通常我们使用的是一种类型的对象。


3、List常用方法

1)ArrayList重写的toString()方法依次调用了它所包含对象的toString()方法,而且Point类也重写它的toString()方法。

2)List实现类的contains方法用于判断集合中是否包含某一个对象,具体的逻辑是:依次调用集合所包含对象的equals方法与判断对象比较,如果有返回true则包含。因此,至于集合中的对象应妥善的重写equals方法,就Point而言,如果重写了equals方法,且逻辑是x,y全部相同则返回true,则list.contains(p)将返回true.

3)remove方法同样和集合中对象的equals方法相关,首先通过调用equals方法找到对象,然后再删除。


4、基于下标的get和set方法

List除了继承Collection定义的方法外,还根据线性表的数据结构定义了一系列方法。

   1)get(int index)方法,获取集合中索引的元素。

       注:这个方法是List中独有的,返回的是Object

   2)Object set(int index,Object obj):将给定的元素替换集合中索引为index的元素,返回的是被替换的元素。        

   3)add和remove有方法重载        

       add(int index, Object obj):将给定的元素插入索引处,原位置上及后面的元素顺序向后移(插队)。

       Object remove(int index):删除指定索引处的元素,该方法的返回只是被删除的元素。      


第17个、

5、List其他常用方法

   List还提供类似String的indexOf和lastIndexOf方法,用于在集合中检索某个对象,其判断逻辑为:(o==null?get(i)==null:o.equals(get(i)))

   1)int indexOf(Object obj):返回首次在集合中出现该元素的索引值。

   2)lastIndexOf(Object obj):返回最后一次在集合中出现该元素的索引值。

 还有可以将集合转换为数组的方法:    

   3)toArray():将集合转化为数组。这里参数仅仅是告知集合要转换的数组类型,并不会使用我们提供的数组,所以不需要给长度。

    集合中的元素应为同一个类型。

   String[] array = (String[])list.toArray(new String[0]);  


6、迭代器

所有的Collection的实现类都实现了其iterator方法,该方法返回一个Iterator接口类型对象,用于实现集合元素的迭代遍历。

Iterator定义有三个方法:

boolean hasNext():判断指针后边是否有元素,是否还有未迭代的元素。

E next():指针后移,返回当前的元素。

void remove():在原集合中删除刚刚返回的元素。

每次next方法调用完成后只能调用一次remove方法,该方法删除刚刚next方法返回的元素。

在迭代的过程中不能调用集合的remove等方法删除元素,否则会有ConcrrentModificationException异常。

注:    

   对于List而言,可以通过基于下标的get方法进行遍历,而iterator方法是针对Collection接口设计,所有实现了Collection接口的类都可以使用  Iterator实现迭代遍历。例:

List list = new ArrayList();
list.add("1");
list.add("2");
list.add("%");
list.add("%");
list.add("2");
list.add("1");     
Iterator it = list.iterator();//实例迭代器对象
while (it.hasNext()){
    //使用hasNext()方法判断是够还有未迭代的元素
    String str = (String)it.next();//调用next返回该元素         
    if ("%".equals(str)) {
        it.remove();
        /* 每次next方法调用完成后只能调用一次remove方法,该方法删除刚刚next方法返回的元素。
         * 在迭代的过程中不能调用集合的remove等方法删除元素,否则会有ConcrrentModificationException异常。
         */
        //list.remove(str);//错误,会出现异常***
    }
}
System.out.println(list);//迭代后输出集合
//也可以使用for来迭代
/*for (Iterator iterator = list.iterator(); iterator.hasNext();) {
    String str = (String) iterator.next();
    System.out.println(str);
}*/

迭代器在迭代元素时要求不能对该集合的元素进行改变,就如上面不能使用集合的remove等方法删除元素,否则会有ConcrrentModificationException异常。


你可能感兴趣的:(java,list,集合,Collection,ArrayList)