黑马程序员——Java学习笔记 集合框架(一)

来源:互联网 发布:linux c 执行shell 编辑:程序博客网 时间:2024/06/05 19:39
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

一、集合类的概述

    一个集合对象或一个容器表示了一组对象,集合中的对象称为元素。在这个对象中,存放指向其他其他对象的引用。

1、为什么出现集合类?
    面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。
2、数组和集合类同是容器,有何不同?
    数组虽然也可以存储对象,但长度是固定的;集合长度是可变的。数组中可以存储基本数据类型,集合只能存储对象。
3、集合类的特点
    集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。
4、集合中为什么会出现这么多容器?
    因为每个容器对数据的存储方式都不同。存储方式成为数据结构。

二、Collecton中的共性方法

    Collection定义了集合框架的共性功能。
添加
    add(e);                   //添加元素。
    addAll(collection);
删除
    remove(e);                //删除元素。
    removeAll(collection);
    clear();                  //清空集合。
判断
    contains(e);              //判断某集合是否包含某元素。
    isEmpty();                //判断集合是否为空。
获取
    size();                   //获取元素的个数(集合的长度)。
获取交集。
    retainAll();
    格式:al1.retainAll(al2);//取交集,al1中只会保留和al2中相同的元素。
集合变数组。
    toArray();
注意:
    (1)add方法的参数类型是Object。以便于接收任意类型对象。
    (2)集合中存储的都是对象的引用(地址)

三、迭代器

    Java Collection API为集合对象提供了Iterator(迭代器),用来遍历集合中的元素。Iterator接口中的方法使我们可以向前遍历所有类型的集合。在对一个Set对象的遍历中,元素的遍历顺序是不确定的。List对象的遍历次序是从前向后,并且List对象还支持Iterator的子接口ListIterator,该接口支持List的从后向前的反向遍历。

    迭代器其实就是集合的取出元素的方式。迭代器是取出方式,会直接访问集合中的元素。所以将迭代器通过内部类的形式来进行描述。通过容器的iterator()方法获取该内部类的对象。
1、iterator()方法摘要:
    (1)boolean hasNext() //如果仍有元素可以迭代,则返回 true。
    (2)E next()          //返回迭代的下一个元素。
    (3)void remove()     //从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。
2、迭代器的两种写法:
    (1)Iterator it = al.iterator();
    while(it.hasNext())
    {
        System.out.println(it.next());
    }
    (2)for(Iterator it = al.iterator(); it.hasNext() ; )
    {
        System.out.println(it.next());
    }

四、List集合

    JDK中提供了实现List接口的三个实用类:ArrayList类、LinkdeList和Vector类。

    List:元素是有序的,元素可以重复。因为该集合体系有索引。
        |--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。
        |--LinkedList:底层使用的链表数据结构。特点:增删速度很快,查询稍慢。线程不同步。
        |--Vector:底层是数组数据结构。线程同步。被ArrayList替代了。因为效率低。
1、List特有方法:

    凡是可以操作角标的方法都是该体系特有的方法。按位置存取存取元素,即按照元素在List中的序号对其进行操纵。

增:
    add(index,element);              //在指定位置添加元素。
    addAll(index,Collection);
删:
    remove(index);                  //删除指定位置的元素。
改:
    set(index,element);             //修改指定位置的元素              
查:
    get(index):                     //通过角标获取元素。
    subList(from,to);               //返回子列表中的元素,含头不含尾。
    listIterator();                 //列表迭代器。
    int indexOf(obj):               //获取指定元素的位置。

2、列表迭代器
    List集合特有的迭代器。ListIterator是Iterator的子接口。在迭代时,不可以通过集合对象的方法操作集合中的元素。因为会发生ConcurrentModificationException异常。所以,在迭代器时,只能用迭代器的放过操作元素,可是Iterator方法是有限的,只能对元素进行判断,取出,删除的操作,如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator。该接口只能通过List集合的listIterator方法获取。
列表迭代器方法摘要:
    void add(E e)        //将指定的元素插入列表(可选操作)。
    boolean hasNext()    //以正向遍历列表时,如果列表迭代器有多个元素,则返回 true
    boolean hasPrevious()//如果以逆向遍历列表,列表迭代器有多个元素,则返回 true。
    E next()             //返回列表中的下一个元素。
    int nextIndex()      //返回对 next 的后续调用所返回元素的索引。
    E previous()         //返回列表中的前一个元素。
    int previousIndex()  //返回对 previous 的后续调用所返回元素的索引。
    void remove()        //从列表中移除由 next 或 previous 返回的最后一个元素(可选操作)。
    void set(E e)        //用指定元素替换 next 或 previous 返回的最后一个元素(可选操作)。 
注意:
    remove() 和 set(Object) 方法不是根据光标位置定义的;它们是根据对调用 next() 或 previous() 所返回的最后一个元素的操作定义的。

3、Vector

    枚举是Vector特有的取出方式,枚举和迭代器功能类似,由于名称过长被迭代器取代。

<span style="font-family:SimSun;font-size:14px;">class VectorDemo {public static void main(String[] args) {Vector v = new Vector();  //<span style="font-family:SimSun;">建立对象v</span>v.add("java01");          //添加元素v.add("java02");v.add("java03");v.add("java04");Enumeration en = v.elements();  //创建枚举while(en.hasMoreElements())     //测试此枚举是否包含更多的元素。{<span style="font-family:SimSun;">    </span>System.out.println(en.nextElement());  //返回此枚举的下一个元素}}}</span>
4、LinkedList

LinkedList的特有方法:
    addFirst();      //添加元素到头部。
    addLast();       //添加元素到头部。

    getFirst();        //返回此列表的第一个元素。如果此列表为空抛出异常
    getLast();
   
    removeFirst();     //移除并返回此列表的第一个元素。如果此列表为空抛出异常
    removeLast();
   
    在JDK1.6出现了替代方法。
    offerFirst();     //在此列表的开头插入指定的元素。
    offerLast();

    peekFirst();      //获取但不移除此列表的第一个元素;如果此列表为空,则返回 null。
    peekLast();

    pollFirst();      //获取并移除此列表的第一个元素;如果此列表为空,则返回 null。
    pollLast();

LinkedList中的特有方法代替迭代器的方法:
正序:
    while(!link.isEmpty())
        {
            sop(link.removeFirst());
        }
逆序:
    while(!link.isEmpty())
        {
            sop(link.removeLast());
        }

LinkedList练习:

    使用LinkedList模拟一个堆栈或者队列数据结构。
    堆栈:先进后出  如同一个杯子。
    队列:先进先出  如同一个水管。

<span style="font-family:SimSun;font-size:14px;">import java.util.*;class DuiLie{    private LinkedList link;             //私有化成员变量    DuiLie()                             //构造函数,初始化类。    {        link = new LinkedList();    }        public void myAdd(Object obj)    {        link.addFirst(obj);             //将元素添加到首位。          //link.addlast(obj);                //将元素添加到末位。    }    public Object myGet()    {          //return link.removeFirst();       //获取并删除首元素。        return link.removeLast();       //获取并删除尾元素。    }    public boolean isNull()             //判断集合是否为空    {        return link.isEmpty();    }}</span>

5、ArrayList练习
    (1)去除ArrayList集合中的重复元素:

        public static ArrayList singleElement(ArrayList al)    {        ArrayList newAl = new ArrayList(); //定义一个新集合。        Iterator it = al.iterator();       //遍历传入的集合。                   while(it.hasNext())                //循环调用hasNext        {            Object obj = it.next();        //定义临时变量            if(!newAl.contains(obj))       //如果新集合不包含该元素                newAl.add(obj);            //将该元素添加到新集合        }        return newAl;                      //返回不包含重复元素的新集合    }

    (2)将自定义对象作为元素存到ArrayList集合中,并去除重复元素。
    例如:存人对象。同姓名同年龄,视为同一个人。为重复元素。

思路:
    1,对人描述,将数据封装进人对象。
    2,定义容器,将人存入。
    3,取出。
    List集合判断元素是否相同,依据是元素的equals方法。(contains方法和removed方法调用equals方法进行比较)

    class Person                    //创建Preson对象{    private String name;    private int age;    Person(String name,int age) //创建构造函数    {        this.name = name;        this.age = age;    }        public boolean equals(Object obj)  //重写equals方法,自定义比较方式    {        if(!(obj instanceof Person))   //判断传入的对象是否为Person类的对象            return false;        Person p = (Person)obj;        //将传入的对象强制转换为Person类的对象        //System.out.println(this.name+"....."+p.name);        return this.name.equals(p.name) && this.age == p.age; //自定义比较条件并返回比较结果    }    public String getName()    {        return name;    }    public int getAge()    {        return age;    }}class ArrayListTest2    {    public static void sop(Object obj)    {        System.out.println(obj);    }    public static void main(String[] args) //主函数    {        ArrayList al = new ArrayList();        al.add(new Demo());        al.add(new Person("lisi01",30));//al.add(Object obj);相当于Object obj = new Person("lisi01",30);                                        //add方法传入的是Object类型的对象,相当于多态,所以使用Person类的方法前需要强制类型转换。        al.add(new Person("lisi02",32));        al.add(new Person("lisi02",32));        al.add(new Person("lisi04",35));        al.add(new Person("lisi03",33));        al = singleElement(al);        //sop("remove 03 :"+al.remove(new Person("lisi03",33)));//remove方法底层也是依赖于元素的equals方法。        Iterator it = al.iterator();        while(it.hasNext())        {            Person p = (Person)it.next();//add方法传入的是Object类型的对象,相当于多态,所以使用Person类的方法前需要强制类型转换。            sop(p.getName()+"::"+p.getAge());        }    }        public static ArrayList singleElement(ArrayList al)    {        //定义一个临时容器。        ArrayList newAl = new ArrayList();        Iterator it = al.iterator();        while(it.hasNext())        {            Object obj = it.next();            if(!newAl.contains(obj))                newAl.add(obj);        }        return newAl;    }} 


0 0
原创粉丝点击