黑马程序员技术交流社区

标题: 集合框架(总结) [打印本页]

作者: zhoubinjian    时间: 2016-4-10 15:43
标题: 集合框架(总结)
集合框架:
1.add方法的参数类型是Object,以便于接收任意类型对象。
2.集合中存储的都是对象的引用(地址)
       
        add() 添加元素
        size() 获取个数,集合长度
        remove() 删除元素
        clear() 清空集合
        contains() 判断元素
        isEmpty() 集合是否为空
        retainAll() 去交集,如:s1.retainsAll(s2);交集是存在s1中的
        removeAll() 如:s1.retainsAll(s2);非交集是存在s1中的,注意是非交                                        集
迭代器: 集合的取出元素的方式;
        如:Iterator it = al.iterator 获取迭代器,用于取出集合中的元素
                it.hasNext()   如果仍有元素可以迭代,则返回true;
                it.next()      返回迭代的下一个元素;
                hasPrevious()  反向迭代;
                previous()        返回迭代的前一个元素

        注意:在迭代时循环中next调用一次,就要hasNext判断一次

例子:
import java.util.*;
class Demo
{
        public static void main(String[] args)
        {
                ArrayList it=new ArrayList();//建立一个数组容器
                       
                it.add("java1");
                it.add("java2");
                it.add("java3");
                it.add("java4");
                Iterator iter=it.iterator();
                while(iter.hasNext())
                   sop(iter.next());
               
        }       
       
        public static void sop(Object e)
        {
                System.out.println(e);
        }
       
}


List子接口

Collection
        -List:元素是有序的,元素可以重复,因为该集合体系有索引。
           |-ArrayList:底层的数据结构使用的是数组结构,特点:查询速度很                        快,但是增删稍慢,线程不同步;
           |-LinkedList:底层使用的是链表数据结构,特点:增删速度快,查询                        稍慢。
           |-Vector:底层是数组数据结构,功能基本和ArrayList一样,区别:线程同步,取出方法是:枚举
        -Set:元素是无序的,元素不可以重复。没有索引

List:特有方法,凡是可以操作角标的方法都是该体系特有的方法。

注意:List集合判断元素是否相同,List下的方法依据是元素的equals方法

增:add(index,element)
    addAll(index,Collection)

删:remove(index)

改:set(index,element)

查:get(index)
    subList(from,to)
    listIterator()
        int indexOf(obj):获取指定元素的位置。
        ListIterator listIterator();


List集合特有的迭代器,ListIterator()是Iterator的子接口。
在迭代时,不可以通过集合对象方法操作集合中的元素。因为会发生ConcurrentModificationException异常。

所以,在迭代时,只能用迭代器的方法操作元素,可是Iterator方法是有限的,只能对元素进行判断,取出,删除的操作。
如果想要其它的操作如:添加,修改等,就需要使用其子接口,ListIterator.
该接口只能通过List集合的listIterator方法获取。如下:
import java.util.*;
class Demo
{
        public static void main(String[] args)
        {
                ArrayList it=new ArrayList();
                       
                it.add("java1");
                it.add("java2");
                it.add("java3");
                it.add("java4");
                ListIterator iter=it.listIterator();
                while(iter.hasNext())
                {
                        // sop(iter.next());
                Object obj=iter.next();
                if(obj.equals("java2"))
                        //iter.add("java5");
                iter.set("java06");
                //sop("obj="+obj);
                }
                sop("it="+it);
        }       
       
        public static void sop(Object e)
        {
                System.out.println(e);
        }
       
}


枚举:是Vector特有的取出方式,
发现枚举和迭代器很像
其实枚举和迭代是一样的
因为枚举的名称以及方法的名字都过长。
所以被迭代器取代了。早期1.0版本是用枚举的。


LinkedList:特有方法
        addFirst()
        addLast()

        getFirst()获取元素,但不删除元素,如果没有元素,会出现:                                        NoSuchElementException
        getLast()获取元素,但不删除元素,如果没有元素,会出现:                                        NoSuchElementException

        removeFirst() 获取元素,但删除元素,长度改变,如果没有元素,会出                                        现:NoSuchElementException
        removeLast()获取元素,但删除元素,长度改变,如果没有元素,会出现                                        :NoSuchElementException

在JDK1.6出现了替代方法:
        offerFirst()
        offerLast()

        peekFirst()获取元素,但不删除元素,如果没有元素,会返回:null
        peekLast()

        pollFirst()获取元素,但删除元素,长度改变,如果没有元素,会返回:                                                                null
        pollLast()


HashSet:
Collection
        -List:
        -Set:功能和Collection是一致的
            -HashSet:底层的数据结构是哈希表。
                        HashSet是如何保证元素的唯一性的呢?
                        是通过元素的两个方法,hashCode和equals来完成的。
                        如果元素的HsahCode值相同,才会判断equals是否为                                                                        true;
                        如果元素的HsahCode值不同,不会判断equals

                        注意:对于判断元素是否存在,以及删除等操作,依赖                                的是元素的hashcode和equals方法;
            -TreeSet:可以对Set集合中的元素进行排序,按字典顺序
                        compareTo()按字典顺序比较两个字符串;
                        要实现了Comparable,才能复写compareTo()

                        底层数据结构是二叉树;保证元素唯一性的依据是:                                compareTo()方法的return 0;

TreeSet排序的第一种方式:
                        让元素自身具备比较性。元素需要实现Comparable接口                        ,覆盖compareTo()方法,该种方式也成为元素的自然                        排序。
             第二种方式:当元素不具备比较性时,或者具备的比较性不是所需要                        的,这时就需要让集合具备比较性,在集合初始化时就                        有了比较方式。

                        定义了比较器,将比较器对象作为参数传递给TreeSet                                集合的构造函数;

                        当两种排序都存在时,以比较器为主。

                        定义一个类,实现Comparator接口,覆盖compare方法。
作者: 哦哈哟    时间: 2016-4-10 15:57
赞一个,是纯手打的吗?
作者: wubin910428    时间: 2016-4-10 16:04
很不错!
作者: zhoubinjian    时间: 2016-4-11 01:57
哦哈哟 发表于 2016-4-10 15:57
赞一个,是纯手打的吗?

是啊,学到那里,就打到那里啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2