美文网首页
java集合-Collections

java集合-Collections

作者: 比轩 | 来源:发表于2016-10-28 17:05 被阅读137次

学习阶段,以下不考虑泛型

附继承关系图:

简化版 完整版

1.集合接口:6个接口(短虚线表示),表示不同集合类型,是集合框架的基础。
2.抽象类:5个抽象类(长虚线表示),对集合接口的部分实现。可扩展为自定义集合类。
3.实现类:8个实现类(实线表示),对接口的具体实现。

一、java集合框架的学习目的

  • 学习集合每个容器的特点,包括对象的存储和取出

二、顶层接口Collection的方法

集合中顶层接口中所有的抽象方法,下面的子类或者接口都是具备的,接口中的方法都是抽象的,找实现类ArrayList,也就是接口指向实现类,运行的方法都是子类重写后的方法。

1.以ArrayList为例

add(Object o); //将元素添加到集合,存储到集合
addAll(collection c); //参数是一个集合,把一个集合存储到另一个集合
void clear(); //清楚集合中的所有对象,但是集合容器还在
int size(); //但会集合中存储元素的个数
boolean isEmpty(); //判断集合中元素个数是不是0,是返回True
boolean contains(Object o); //判断集合众是不是包含这个对象,如果包含返回True
boolean containsAll(Collection c); //一个集合是否完全包含另一个集合,是集合中存储的对象,如果完全包含,返回True
boolean remove(Object o);// 移除集合中的元素,移除成功返回True
//***********
//注意:如果集合中包含多个此元素,remove只移除第一个,也就是一次调用只能移除一个元素

boolean removeAll(Collection c);// 移除两个集合中的相同元素
boolean retainAll(Collection c);//保留两集合中相同的元素也就是取交集,只要原始集合没变,就返回False
toArry(); //集合专数组

2.方法运行Demo

import java.util.*;
public class CollectionDemo {

    /*
     * 练习collection中的方法
    */
    public static void main(String[] args) {
        method();
    }
    
    public static void method(){
        Collection col = new ArrayList();
        Collection col1 = new ArrayList();
        
        col.add("a");
        col.add("b");
        col.add("c");
        col.add("a");
        col.add("a");
        
        col1.add("a");
        col1.add("b");
        col1.add("e");
        
        col.retainAll(col1);
        System.out.println(col.containsAll(col1));
        System.out.println(col.size());
        System.out.println(col);
        
    }
}

三、迭代器-Iterator

  • 迭代器就是从集合中取出元素的方式
  • 但是每种集合子类存储对象的方式不同,造成获取对象的方式也不同,因此规定了一个接口(iterator),所有子类的迭代器必须满足接口规则
  • 每一个集合的子类中,都有一个方法iterator(),返回的就是自己的内部类的对象,但是这个内部类实现了iterator接口
iterator iterator() //方法是获取迭代器对象的方法,返回值是一个接口,返回的就是这个接口的实现类

1.Iterator接口中的方法

boolean hasNext();//判断集合中有没有下一个被取出的元素,有返回true
Object next();//获取集合中的从下一个元素
void remove();//移除元素,就是迭代过程中移除

2.迭代器的实现源码演示

使用ArrayList为例演示

public class ArrayList extends XXX implements List{
  
  //用方法iterator来返回内部类对象
  public Iterator iterator(){
    return new Itr();
  }
  
  //用内部类来实现迭代器的方法,并设置为私有,不向外暴露
  private class Itr implements Iterator{
    public boolean hasNext();
    public Object next();
    public void remove();
  }
}

//外部调用的方式
Iterator it = new ArrayList对象.iterator();

3.迭代器取集合中元素的步骤

  • 调用集合方法iterator()获取迭代器接口的实现类对象
  • 调用接口Iterator方法hasNext()判断集合中有没有下一个元素
  • 调用接口Iterator方法next()获取集合中的元素
public static void main(String[] args) {
        //创建集合对象ArrayList
        Collection con =new ArrayList();
        
        con.add(1);
        con.add(2);
        con.add(3);
        con.add(4);
        
        //使用迭代器获取集合中的元素
        Iterator it = con.iterator();
        
        while(it.hasNext()){
            System.out.println(it.next());
            it.remove();
        }

        while(it.hasNext()){
            System.out.println(it.next());
        }
    }

/*输出结果
1
2
3
4
*/

4.迭代器注意事项

  • 如果hasNext()判断为false,还用next()获取,出现没有元素被取出异常
  • 在迭代的过程中,不允许使用集合的方法改变集合长度,出现并发修改异常
  • 迭代器创建好以后,只能迭代一次
  • 一次迭代中,不允许出现多次next方法

四、list接口派系

Lsit接口继承Collection接口,自己成立一个派系。特点(有序,重复,下标):

  • 存储是有序的。顺序:存储和取出的顺序相同
  • 允许存储重复
  • 元素都有下标

1.List接口特有方法

void add(int index,Object o)//在列表的指定位置上插入元素
boolean addAll(int index,Collection c)//在列表的指定位置上插入另一个集合
Object get(int index)//返回指定索引上的元素!
Object remove(int index)//移除指定下标上的元素,返回移除前的对象
Object set(int index,Object o)//修改指定下标上的元素,返回修改前的元素
List subList(int start,int end)//获取集合中的一部分,包含头,不包含尾,返回新集合

demo:

import java.util.ArrayList;
import java.util.List;

/*
 * List接口的特有方法
*/
public class ListDemo {
    public static void main(String[] args) {
        List list = new ArrayList();
        
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");

        /*
         * void add(int index,Object o)
         * 在列表的指定位置前插入元素
        */      
        list.add(2,"z");
        System.out.println(list);

        /*
         *  void addAll(int index,Collection o)
         * 在列表的指定位置插入另一个集合
         * 插入的集合为空时,返回false
        */
        
        List list2 = new ArrayList();
        
        list2.add("e");
        list2.add("f");
        list2.add("g");
        list2.add("h");
        
        list.addAll(5,list2);
        System.out.println(list);
        
        /*
         * Object get(int index);
         * 返回指定下标上的元素
        */
        for(int i = 0;i<list.size();i++){
            System.out.print((String)list.get(i)+',');
        }
        System.out.print('\n');
        /*
         * Object remove(int index)
         * 移除指定下标上的元素
        */
        list.remove(0);
        System.out.println(list);

        /*
         * Object set(int index, Object o);
         * 修改指定位置上的元素,并返回修改前的元素
        */
        System.out.println(list2.set(0, "a"));
        System.out.println(list2);
        
        /*
         * List subList(int start, int end)
         * 获取集合一部分,有头无尾
        */
        System.out.println(list.subList(1, 3));
    }
}

2. List派系特有迭代器

迭代器只能应用于List集合,其他集合不能用。

List特有迭代器接口ListIterator,这个接口是Iterator的子接口。

List的派系的每一个子类,都有一个方法listIterator,返回ListIterator接口的实现类对象,这个实现类,就是集合的内部类。

2.1特点

迭代中,可以使用迭代器方法,进行添加,修改,删除集合中的元素,两个方向遍历

2.2方法

     add(Object)//添加,迭代到哪个对象,添加到这个对象的后面
     set(Object)//修改,迭代到哪个对象,修改的就是哪个对象
     remove()//删除
     hasPrevious() == hasNext() //逆向使用
     previous() == next() //逆向使用

3.ArrayList类

  • 容器的底层实现方式,可变长度数组(扩容,自动复制数组),数组默认大小10个长度。
  • 线程不安全集合,运行速度快。查询速度快,增删慢
  • 每次增长50%。
  • ArrayList使用的频率最高,速度快,查询也快
  • 可以存储NULL

4.Vector类

开始版本JDK1.0 ,升级到JDK1.2的时候,才出现了集合框架的概念。类Vector在JDK1.2版本后,改为实现List接口。Vector类底层实现,也是可变数组,增长率100%,线程安全,运行速度慢。 从JDK1.2版本开始,Vector被ArrayList取代

5.LinkedList类

  • 特点和List接口,一致,重复,有序,下标
  • LinkedList底层实现原理:链表结构,查询慢,增删快,线程不安全,运行速度快
  • 存储和取出,实现代码,和ArrayList完全一致

5.1LinkedList特有方法

addFirst(Object o);//头部添加元素
addLast(Object o);//尾部添加元素
Object getFirst();//获取头部
Object getLast();//获取尾部
Object removeFirst();//移除头部
Object removeLast();//移除尾部
  
//在LinkedList中,1.6版本开始,添加了几个新的方法,来操作集合
boolean offerFirst()  boolean offerLast() //替换的了 addFirst() addLast(),返回永真
Object peekFirst()  Object peekLast() //替换了 getFirst() getLast().如果集合中是空的,获取后返回null不会出现异常
Object pollFirst()  Object pollLast()// 替换了 removeFirst() removeLast().如果集是空的返回null,不会出现异常

5.2LinkedList模拟队列和堆栈

  • 堆栈:内存中的数据,先进去的,后出来
  • 队列:内存中的数据,先进去的,先出来
  • 特点:符合LinkedList类的特点,存储对象的时候,开头结尾,获取对象的时候,可以在开头和结尾获取。
package collectionDemo;

import java.util.*;

/*
 * 通过LinkedList实现队列和栈
*/

public class LinkedListTest {
    public static void main(String[] args) {
        Heap<String> h = new Heap<String>();
        
        h.put("a");
        h.put("b");
        h.put("c");
        h.put("d");
        h.put("e");
        h.put("f");
        
        System.out.println(h);
        
        System.out.println(h.pop());
        System.out.println(h.pop());
        System.out.println(h.pop());
        System.out.println(h.pop());
        System.out.println(h.pop());
        System.out.println(h.pop());
        System.out.println(h.pop());
        
        Queue<Integer> q = new Queue<Integer>();
        
        q.put(1);
        q.put(2);
        q.put(3);
        q.put(4);
        q.put(5);
        System.out.println(q);
        System.out.println(q.pop());
        System.out.println(q.pop());
        System.out.println(q.pop());
        System.out.println(q.pop());
        System.out.println(q.pop());
        System.out.println(q.pop());

    }
    

}

//实现栈
class Heap<E>{ 
    private LinkedList<E> h ;
    
    Heap(){
        this.h =  new LinkedList<E>();
    }
    
    public void put(E o){
        this.h.addFirst(o);
    }
    
    public E pop(){
        
        return this.h.pollFirst();
    }
    
    public String toString(){
        
        return this.h.toString();
    }
}

//实现队
class Queue<E>{
    
    private LinkedList<E> q;
    
    Queue(){
        this.q = new LinkedList<E>();
    }
    
    public void put(E o){
        this.q.addFirst(o);
    }
    
    public E pop(){
        return this.q.pollLast();
    }
    
public String toString(){
        
        return this.q.toString();
    }

}

相关文章

网友评论

      本文标题:java集合-Collections

      本文链接:https://www.haomeiwen.com/subject/adseuttx.html