Java学习日记----集合

------- android培训java培训、期待与您交流! ----------

 

1 Collection   

    |--List       

      |--ArrayList       

      |--LinkedList       

      |--Vector   

    |--Set       

      |--HashSet       

      |--TreeSet   

  1.1 为什么会出现这么多的容器?     

    因为每个容器对数据的存储方式都不同,这个存储方式就称为数据结构.   

  1.2 Collection中的共性方法       

    add(),size(),isEmpty(),contains(),clear(),remove(),removeAll(),retainAll().   

  1.3 集合中不存放对象实体,存放的都是地址值,或对象的引用.   

  1.4 迭代器       

    迭代器其实就是取出元素的方式,每个容器都有存和取的方式,因为每个容器的数据结构不一样,.虽然它们都具备存和取的动作,因为底层数据结构不一样,存取的方式也不一样,每个集合都有取出的方式,而一个方法不足以描述这个方式,需要多个功能来实现,于是就将这多个方式封装成对象,所以每个集合中都一个用于完成取出动作的类,这个类定义在集合的内部,可以直接访问集合的元素,因为每个集合的取出方式不一样,就将这些取出类进行向上抽取,形成一个接口--->Iterator接口.然后通过一个方法iterator()获取集合的取对象.

2 List   

  2.1 特点:元素是有序的,元素是可以重复的.因为List体系有索引.       

    在List中可以直接通过角标进行增删改查的操作.   

  2.2 ListIterator       

    List中特有的迭代器,Iterator的子接口,Iterator中只有三个方法,hasNext(),next  (),remove(),而ListIterator中可以进行增删改查的操作.   

  2.3 List集合的具体对象       

     1> ArrayList:底层使用的数据结构是数组结构,查询速度很快,增删稍慢,元素越多越明   显,不同步.       

     2> LinkedList:底层使用的是链表数据结构,增删速度很快,查询稍慢,       

       3> Vector: 底层使用的数组数据结构,和ArrayList一样,Vector在Java1.0就出现了,而集合框架在Java1.2才出现.Vector无论增删查询都慢,且是同步的.Vector有其特有的取出方式--->枚举,但是因为枚举的名称以及其方法的名称过长,所以被迭代器取代了.   

  2.4 在JDk1.6中对LinkedList做了升级,将原来的addFirst(),addLast(),getFirst(),getLast(),removeFirst(),removeLast()分别替换成了offerFirst(),offerLast(),pickFirst  (),pickLast(),pollFirst,pollLast().其中pollFirst和pollLast(),如果没有此元素时会返回null.

3 Set   

  3.1 特点:元素是无序的(存入和取出的顺序不一致),元素不可以重复.       

    注意:Set的功能和Collection是一致的.   

  3.2 Set的常见子类       

    1> HashSet:底层数据结构是哈希表,在哈希表中,如果哈希值相同,还有一次校验方式,会判断是否是同一个对象.       

    2> TreeSet:底层结构是二叉树,可以对集合中的元素进行排序.   

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

      是通过元素的两个方法,hashCode()和equals()来完成的,如果元素的哈希值相同,才会判断equals()方法的返回值是否为true,如果元素的哈希值不同,则不会调用equals()方法.所以一般的开发中定义一个类都会复写hashCode()和equals()方法.   

  3.4 Set集合排序       

    1> 第一种方法,让元素自身具备比较性--->元素实现Comparable接口,覆盖compareTo()方法,这种方式叫做元素的自然顺序,也叫做默认顺序.       

    2> 第二种方式,当元素自身不具备比较性时,或者所具备的比较性不是所需要的时候,这时就需要让集合自身具备比较性---->在集合初始化就具有了比较性---->定义一个类实现Comparator接口,在集合初始化的时候,将这个类的对象传入就可以了,       

    3>注意:当两种排序方式都存在时,以比较器为主.

4 泛型   

  4.1 通过尖括号"<>"定义要操作的引用数据类型.它是在JDK1.5后出现的新特性,用于解决安全问题,是一个类型安全机制.泛型可借鉴于数组--->明确里面所装的数据类型.        4.2 泛型的好处       

    1> 将运行时期出现的问题ClassCastException转移到了编译时期,方便于程序员解决问题,让运行时期的问题减少,这样更安全.       

    2> 避免了强制转换的麻烦.   

  4.3 泛型类       

    当类中要操作的引用开数据类型不确定时,早期是通过Object类来完成扩展的,有了泛型后,用泛型就可以了.   

  4.4 泛型方法       

    泛型类定义的泛型在整个类都有效如果方法被使用,如果泛型类的对象明确要操作的数据类型后,所要操作的数据类型,就已经固定了,为了让不同的方法可以操作不同的类型,那么就可以将泛型定义在方法上.   

  4.5 泛型限定       

    ? extends E   --->   可以接收E类型或E的子类.       

    ? super  E    --->   可以接收E类型或E的父类.

5 Map   

  5.1 概述,Map集合存放的是键值对,是一对一对往里面存的,   

  5.2 共性方法:       

    1> 添加:put(K key,V value),putAll(Map<? extends K,? extends V> m)       

    2> 删除:clear(),remove(Object key),       

    3> 判断:containsKey(Objrct key),containsValue(Object value),iaEmpty().       

    4> 获取:get(Object key),size(),values(),entyrSet(),keySet(),       

    5> 注意:put()方法,重复键时,新的值会覆盖旧的值,方法会返回原来的值.          

      remove()的返回值为所删除的键所对应的值,它只能删除键.         

      entyrSet()和keySet()这两个方法,需要重点掌握.   

  5.3 Map的子类       

    1>Hashtable:底层是哈希表数据结构,不可以存入空健空值,在JDK1.0就出现了,线程同步,效率低.       

    2>HashMap:底层是哈希表数据结构,可以存入空健空值,线程不同步,在JDK1.2出现,效率高.       

    3>TreeMap:底层是二叉树数据结构,线程不同步,可以给集合的键排序,和TreeSet很像,其实Set的底层就是使用了Map集合.   

  5.4 Map集合的两种取出方式       

    1>keyset():将集合中所有的键都存入到Set集合中,因为Set具有迭代器,就可以取出所有的键,再通过get()方法取出所有的值.       

    2>entrySet():将Map集合中的所有映射关系都存入到Set集合中,而这个映射的关系的类型就是Map.Entry,Map.Entry是一个接口,里面提供了两个方法,getKey()和getValue(),通过这两个方法就可以取出映射关系中的键和值.

posted @ 2012-12-08 00:45  叶征东  阅读(128)  评论(0编辑  收藏  举报