黑马程序员_java之集合框架

集合框架

集合框架体系概述

集合:存储对象最常用的一种方式

数组集合作为容器区别:数组,可存储对象、基本数据类型,但长度固定;集合只存储对象,长度可变,可存储不同数据类型对象。

多容器出现原因:每个容器数据存储方式(数据结构)不同。

集合共性方法:

添加:boolean add(E e) //集合中存储的都是对象的地址引用

       Boolean addAll(Collection<? Extends E> c) //添加集合

删除:void clear()  //移除所有元素

          Boolean remove(Object o) //移除指定元素

          Boolean removeAll(Collection<? Extends E> c)//移除指定集合

判断:boolean   contains(Object o);boolean containsAll(Collection<?> c)

         boolean    equals(Object o);int    hashCode(); boolean  isEmpty() 判断是否为空

集合变数组:<T> T[] toArray(T [ ] a)

取交集:boolean retainAll(Collection<? Extends E> c)

//如al1. retainAll(al2)al1中只保留al1中与al2中相同元素

获取:int size()       元素数;Iterator<E>  iterator() 获取迭代器

集合一般取出方式: 迭代器 和 for循环

迭代器:集合的取出元素方式

例:两种方式获取ArrayList集合中元素,集合里有a, b,c  3个元素

方式一:迭代器Iterator<String> it=al.iterator();

                       While(it.hasNext()){

                                   Sop(it.next();

                            }

方式二:for循环  for(Iterator it=al.iterator();it.hasNext();){

                                   Sop(it.next();

}

Collection

       !................List      元素有序、可重复,集合体系有索引(ArrayList、LinkedList、Vector)

       !................Set              元素无序、不可重复 (HashSet、TreeSet)

List特有方法:凡是可操作角标的方法。

增加:void add(int index,E e);Void addAll(int index, Colle(ction<? Extends E> c)

删除:E remove (int index);更改:E set(int index,E e)

获取:E get (int index)//可通过此方法,特殊取出方式,迭代器

         Int  indexOf(Object o)//返回索引

         Int  lastLndexOf(Object o)

         List<T> subList(int from,int to)//返回包含头不包含尾的集合

         ListIterator <E> listIterator //返回列表迭代器

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

迭代时,不能用集合方法的操作集合中元素,发生并发修改异常;只能用Iterator操作,但只能对元素进行判断、取出、删除操作;若要进行增删查改操作则用ListIterator。

可用ListIterator迭代器中特有方法: 更改void set(E e)、删除  void  remove ()、添加:void add(E e)、判断hasNext()、hasPrevious、获取next、previous

例:Iterator<String> it=al.iterator();

                       While(it.hasNext()){

                            Object obj=it.next();

                            if(obj.equals(“b”))

                                   //al.add(“d”);集合增删,迭代不知道

                                   it.remove();//移除集合元素引用,但obj还有元素引用

                                   sop(“obj=”+obj);

                            }                 

List集合具体对象特点

List

!.........     ArrayList  底层是数组数据结构;查询修改快,增删慢;线程不同步;长度可变,默认为10,以50%延长

!.........       LinkedList 底层是链表数据结构;查询修改慢,增删快;线程不同步;

!.........    Vector    底层是数组数据结构;查询修改快,增删慢;线程同步;长度可

变,默认为10,以100%延长

Vector特有取出方式:枚举(还有一般的取出方式迭代器、for循环get方法)

例:有一个Vector集合,里面有a、b、c三个数组,获取数组中元素

Enumeration en=v.elements();

While(en.hasMoreElements()){

       Sop(en.nextElement();

}

LinkedList特有方法:

增加void addFirst(E e);void addLast (E e)

获取E getFirst()    //获取但不删除元素,若集合无元素则异常;  E  getLast ()

删除E removeFirst ()//获取且删除元素,若集合无元素则异常;   E  removeFirst ()

LinkedList获取全部元素新方法: While(link.isEmpty()){   Sop(link.removeFirst());}

JDK1.6以后出现替代方法:(还有String的isEmpty)

增加:boolean offerFirst(E e); boolean offerLast (E e)

获取:E peekFirst()    //获取但不删除元素,若集合无元素则返回null;  E  peekLast ()

删除:E pollFirst ()//获取且删除元素,若集合无元素则返回null;  E  pollFirst ()

练习:去除ArrayList集合中重复元素

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;

}

Set集合:无序(存入和取出的顺序不一定一致),不可有重复元素

!.........HashSet:数据表结构是哈希表,线程是非同步的。保证元素唯一性原理:hashCode和equals方法,先判断hashCode,再判断equals。

!.........TreeSet:数据表结构是二叉树,线程是非同步的,可对集合中元素排序。保证元素唯一性原理:

                  Comparable接口中compareTo方法 return 0; Comparator接口中compare方法 return 0

TreeSet集合排序方式有两种:

第一种:元素自身具备比较性实现Comparable接口覆盖compareTo方法,元素自然顺序

第二种:元素不具备比较性,或比较性非所需,让集合具备比较性,Comparator接口中compare方法,定义比较器,将比较器对象作为参数传递给TreeSet集合的构造函数

注意:当两种排序都有时,优先比较器;排序时,当主要条件相同时,一定要判断次要条件。

注:TreeSet存一个正常,存两个ClassCastException,学生对象不具备比较性

Map集合

Map集合:该类集合存储键值对,一对一往里存,而且要保证键的唯一性。Map集合有3个常用子类对象:HashTable、HashMap、TreeMap。Map和Set很相似,其实Set底层使用了Map集合。

HashTable:底层哈希表数据结构,不可存null键null值,线程同步,效率稍低;

HashMap :底层哈希表数据结构,可存null值null键,线程不同步,效率稍高;

TreeMap :底层二叉树数据结构,可给集合中键排序,线程不同步。

Map集合有一些共性方法:

添加:V       put(K key,V value) 如出现相同键时,新值V覆盖旧值V,返回旧值V

         Void  putAll(Map<? extends K,?extends V> m) 添加Map集合

删除:void    clear() 移除所有映射关系;V     remove(Object key) 删除并返回键对应的值

判断:boolean      containsKey(Object key); boolean     containsValue(Objectvalue)

         boolean     equals(Object o); int hashCode(); boolean     isEmpty() 判断是否为空

获取:V get (Object key) 获取值;Int size( 映射关系数;Collection<V> values() 所有值集合

         Set<K> keySet() 返回键的Set集合;Set<Map.Entry<K,V>>  entrySet()  返回所有的映射集合,类型为Map.Entry

注意:通过get方法返回值是否为null判断键是否存在,因为键、值=null通常无意义

Map集合的两种取出方式:keySet、entrySet 

Map集合取出原理:将Map集合转成Set集合,再通过迭代器取出

1、  keySet: 将Map中所有的键存入Set集合中,迭代键,在通过get方法获取键对应的值

2、  entrySet:将Map集合中的映射关系存入Set集合中,迭代映射关系Map.Entry ,再通

             过映射关系中getKey()和getValue()方法获取键和值

什么时候使用map集合?数据存在映射关系

posted on 2013-01-28 17:39  念满  阅读(191)  评论(0)    收藏  举报