Java学习日记'----集合

------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------

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-07 23:51  叶征东  阅读(66)  评论(0)    收藏  举报