代码改变世界

集合框架-Collection集合

2014-06-06 17:04  黑马程序员*  阅读(203)  评论(0编辑  收藏  举报

集合有两大类:Collection和Map,

集合的由来:我们用对象来封装数据,对象多了也要存储起来,如果对象的个数不确定,就使用集合容器进行存储。

集合的特点:所有集合类都位于java.util包下。集合中只能保存对象(保存对象的引用变量,集合存储的是对象的地址),不可以存储基本数据类型值,集合长度的是可变的,集合可以存储不同类型的对象

为什么会出现这么多容器?每个容器对数据存储的方式不同,这个方式就称为:数据结构。

集合与数组的区别:数组长度不可变,数组对象必须是同种类型。

集合Collection总结。

Collection是根接口,Collection下有两个比较重要的子接口,他们是Set和List

Collection:

              |--List:元素是有序的,元素可以重复。因为该集合体系有所以

                     |-- ArrayList:底层是数组数据结构,数组长度是可变的,超出后延长50%,线程是不同步的,,查询,修改速度快效率高,替代了Vector ,增删较慢.

                     |--LinkedList;底层使用的链表数据结构 此实现不是同步的 特点:查找慢,增删快//重要

                     |--Vector: Vector:底层是数组数据结构,数组长度是可变的,超出后延长100%,是同步的(线程安全),效率低,增删查询都很慢

              |--Set:元素是无序(指不安存储顺序来),元素不可以重复。但是提供了可以排序的TreeSet(但是存入的对象必须具备就)

                     |--TreeSet:可以对Set集合的元素进行排序。底层数据结构是二叉树,不同步。保证元素唯一性的依据:compareTo或compara方法 return的数据 .

                            二叉树:比较,小于放左边,大于放右边,这样存入时就可以一次性排除一边数据,取数据时:从最小的开始从下往上。

                     |--HashSet:数据结构是哈希表,线程是非同步的。保证元素唯一性的原理:判断元素的hashCode值是否相同。

存储数据:

       List:自定义类复写equals可以按自定义去除重复元素

       HashSet:按哈希表和equals,注意先找hashcode()方法。自定义条件保证唯一性:自定义类需要复写hashcode(返回值int,不要超了),equals。

                     :哈希表之所以出现希望不要每次都要调用equals,否则很慢。

       TreeSet:方法1:自定义对象实现comparable,复写compareTo(),方法2:自定义比较器实现comparator(比较器,并作为参数传给TreeSet),复写compare方法。

                     原理:不调用equals,只看compare和compareTo返回的结果来判断是否重复。

                     排序:不论是什么排序,主要条件相同,一定要判断次要条件。

                     如何实现怎么存入,怎么取出。将compareTo方法的返回值写成:1即可  

总结

后缀名就是该集合所属的体系,前缀名就是该集合的数据结构。

       看到array:就要想到数组,就要想到查询快,有角标.

看到link:就要想到链表,就要想到增删快,就要想要 add get remove+frist last的方法

看到hash:就要想到哈希表,就要想到唯一性,就要想到元素需要覆盖hashcode方法和equals方法。

看到tree:就要想到二叉树,就要想要排序,就要想到两个接口Comparable,Comparator。

       通常这些常用的集合容器都是不同步的,除了Vector          

Collection的一些基本方法:

              1.添加  集合中存放的是对象的地址或引用

                      boolean add(E e);

                      boolean addAll(Collection<? extends E> c);

              2.删除

                      void clear();删除全部

                      boolean remove(Object o); 移除第一次出现的指定元素 ,不存在返回false

                      removeAll(Collection<?> c) ;

              3.获取

                      int size() ;返回元素数,集合长度

              4.判断

                      boolean isEmpty();

                      boolean contains(Object obj);

                      boolean containsAll(Collectioncoll);

              5.交集

                     boolean retainAll(Collection<?> c) 

a1.retainAll(a2);//取交集,a1中只会保留与a2相同的对象,如果没有交集,a1是null

              6.常用

                      Object[] toArray() 返回包含此 collection 中所有元素的数组。

                      <T> T[]  toArray(T[] a)

迭代器:迭代器取代了Enumeration。

迭代器与枚举有两点不同:迭起可以使用remove()方法,名字变短了.     

 List接口:常用的实现类 :ArrayList:Vector:LinkedList:

:特有方法.凡是可以操作角标的方法都是该体系特有的方法,因为List有序(存入和取出的顺序一致),元素都有索引,所以元素可以重复。

              因为list集合有脚标,所以就有两种取出元素的方式:for循环和迭代器.

              获取所有元素

              for (int x=0;x<a1.size();x++ )       {

                      System.out.println("a1("+x+"):"+a1.get(x));

              }

              迭代器

              Iterator it = a1.iterator();

              while (it.hasNext())       {

                     //System.out.print("a1:"+it.next());

              }           

注:第一种while循环后迭代器对象还驻留在内存中,第二种for循环后迭代器对象立即释放,第二种更省内存。      

       |---List特有迭代器:ListIterator

              在迭代时,只能用迭代器操作元素,可是Iterator方法是有限的:hasNext()  next() void remove()

        只能对元素进行判断,取出,删除。

如果要进行其他操作如添加,修改,就需要使用其子接口,ListIterator.该接口只能通过List集合的listIterator方法获取。特有方法:add,remove,set.

               ListIterator li = a.listIterator();          

               while (li.hasNext()) {

                      Object obj = li.next();

                      if (obj.equals("hehe")) {

                             //li.remove();

                             li.add("java");

                             //li.set("2222");

                      }          

              }

              注:hasPrevious() previous()是逆向遍历

List的一些常用方法:

              添加:add(index,element);

              addAll(index,Collection)             

              获取:

listIterator(int index)    返回列表中元素的列表迭代器,从列表的指定位置开始。

                     get(index);

                     int indexOf(Object o)    返回此列表中首次出现的指定元素的索引,如果此列表中不包含该元素,则返回 -1。

int lastIndexOf(Object o)   返回此列表中最后出现的指定元素的索引,如果此列表中不包含该元素,则返回 -1

                     List<E> subList(int fromIndex, int toIndex) :不包含尾

              修改元素:

                     set(int index, E element) 用指定元素【替换】列表中指定位置的元素

              删除:

                     a1.remove(int index);// 移除列表中指定位置的元素

--LinkedList

              特有方法

              addFirst()指定元素插入此列表的开头

              addLast()指定元素插入此列表的尾部

           列表为空,removeFirst()等抛异常:

              (1)获取元素,但不删除元素

              getFirst()返回此列表的第一个元素。

              getLast()返回此列表的最后一个元素。

              获取元素,并删除元素。

              (2) removeFirst() 移除并【返回】此列表的第一个元素  列表为空,removeFirst()等抛异常

              removeLast()移除并【返回】此列表的组最后一个元素

              取出全部元素;除了迭代器和get(for遍历),可以用removeFirst()

              while(!link.isEmpty){

                     removeFirst()//pooFirst()

              }

              在jdk1.6出现了代替()方法,如果此列表为空,则返回 null

              offerFirst()在此列表的开头【插入】指定的元素。代替add

              offerLast()在此列表的尾部【插入】指定的元素。

              pollFirst();【获取并移除】此列表的第一个元素则返回 null。代替remove

              pollLast();【获取并移除】此列表的最后一个元素 则返回 null。

              peekFirst():【获取但不移除】此列表的第一个元素;【如果此列表为空,则返回 null】。代替get

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

             练习:

     1.使用LinkedList模拟一个堆栈或者队列数据结构。              

              /*

              2.删除ArrayList集合中的重复元素

              思路:定义一个临时容器

                       遍历集合,存入临时容器,相同不存

                       打印临时容器

              */          

              /*

    3.将自定义对象作为元素存到ArrayList集合中,并去除重复元素。

              比如;存人对象,同姓名,同年龄,视为同一个人,为重复元素。

              思路;

              1.对人描述,将数据进行封装。//人本身具备equals方法(继承自Object),比较的是地址值。但我们要复写。

              2.定义容器,将人存入。

              3.取出。

              */           

Set :元素不能重复,无序(存入和取出的顺序不一致)的, 因为没有脚标,

       所以,Set接口中的方法和Collection是一样的。

    |--HashSet:底层结构式是哈希表

                     HashSet是如何保证元素的唯一性呢?

                     是通过元素的两个方法,hashcode和equals来完成。

                     如果元素的hashcode值相同,才会判断equals是否为true                 

                     如果元素的hashcode值不同,不会调用equals 复写hashCode方法, 哈希值相同才调用equals

       注意:HashSet:对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法    

              ArrayList判断或存储,只依赖于equals。       

    |--TreeSet:可以对Set集合的元素进行排序。底层数据结构是二叉树。保证元素唯一性的依据:compareTo和compare.表示元素相同。