黑马程序员-集合框架

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

合:
 用于存储对象,使用频率很高。

集合的数组的区别:
 1,
 集合是可变长度的。
 数组是固定长度的。
 2,
 集合中只能存储对象。集合对象.add(4);可以吗?可以,4不是一个int数值,而是一个Integer对象。因为自动装箱。
 数组可是存储基本数据类型和引用数据类型。但是一个数组只要被定义,该数组中的元素类型也固定。
 

-----------------

集合就是一个容器,因为每一个容器的内部的数据结构(数据的存储方式)不同,就有了多种具体的容器。(如同水杯。)

这些容器都有一些共性的内容,所以就不断的向上抽取。
这样就有了集合体系,也成为集合框架。

该框架的顶层接口是Collection.该接口中定义了集合体系最共性的功能。

Collection
 |--List:有序,有索引,可以重复。
   有两种取出方式,一个是迭代器,Iterator
       一个是通过索引获取元素,get(index),使用遍历获取所有元素。
  |--ArrayList:是数组结构,线程是不同步的,查询的速度很快,增删速度稍慢。(数据连续)
     如何判断元素是否相同?
     是通过元素的equals方法完成。

 

  |--LinkedList:是链表结构,线程是不同步的,查询的速度稍慢,增删的速度很快。(数据不一定连续)
    特有方法:
     addFirst(),addLast();  --jdk1.6-->offerFirst(),offerLast();
     getFirst(),getLast();  --jdk1.6-->peekFirst(),peekLast();
     removeFirst(),removeLast(); --jdk1.6-->pollFirst(),pollLast();
     如果集合没有元素,获取或者删除元素时,get remove会出现NoSuchElementException
     而1.6以后peek,poll,不会出现异常,而是返回null。


  |--Vector:是数据结构,线程是同步的,查询速度和增删速度都非常慢,被ArrayList取代。
      支持Enumeration(枚举).
    
  ArrayList和Vector都是可变长度数组,
  可变长度数组的原理:其实就是超出默认数组长度后,自动建立新的数组,然后将原数组中的数据复制到新数组中,
  然后在将新元素添加到新数组中。重复此操作。


 独立介绍一个接口。ListIterator是Iterator子接口。
 当对集合元素进行迭代时,还想要在迭代过程中操作元素的增删改查,使用Iterator是有局限性的。
 Iterator只有判断hasNext(),获取next(),删除remove()这些方法。
 所以想要更多操作要使用ListIterator.列表迭代器支持增删改查。
 add(),set(),remove(),next(),previous(),hasNext(),hasPrevious().
 注意:ListIterator只有List集合具备。

 

 |--Set:无序,不可以重复。该接口的功能和Collection一致,对元素只有一种取出方式:迭代器。
  |--HashSet:底层是哈希表数据结构,线程是不同步的。
       是如何判断元素是否相同?
       其实是依据元素的hashcode方法和equals方法。
       当两个元素的hashCode值相同,那么会再次判断两个元素的equals是否为true。
       如果为true,则两个对象相同。不存。

       当两个元素的hashCode值不同,那么两个元素在哈希表中有自己不同的位置,
       这时就不需要判断equals方法。

       所以,在实际开发中,自定义对象时,建议该对象在描述,最好覆盖Object类中的hashCode方法和equals方法。
       因为不覆盖,该对象也从Object类中继承了这两个方法。所以还是建立该对象自身判断是否相同方式。

       对于hashCode方法哈希值的定义,以及equals的具体返回结果,最好都依据对象的判断条件而定。
       如Person的name和age。
       public int hashCode()
       {
         final int NUMBER = 35;
      return name.hashCode()+age*NUMBER;
       }
       public boolean equals(Object obj)
       {
         if(!(obj instanceof Studnet))
       throw new ClassCastException("类型不匹配");

      Student stu = (Student)obj;

      return this.name.equals(stu.name) && this.age==stu.age;
       }

 

 

  |--TreeSet:底层是二叉树数据结构,线程是不同步的,可以被Set集合中的元素进行指定方式的排序。
      是如何判断元素是否相同?
      因为该集合可以排序,那么元素就需要比较。
      如果比较的结果是0。是视为这两个元素相同。不存。

      该集合的排序方式通过比较完成。
      有两种方式:
      1,让元素自身具备比较性。
      元素需要实现Comparable接口,覆盖compareTo方法。该接口强制让元素具备比较性,这种排序成为自然排序。
      但这种方式有局限性,如果该元素并为实现Comparable接口,或者该元素具备的比较性不是所需要的。
      那么这时就只能使用第二种方式。
      2,让集合自身具备比较性。
      定义一个类实现Comparator接口,覆盖compare方法。然后将Comparator接口的子类对象作为实际参数
      传递给TreeSet集合构造函数,该子类对象成为比较器对象。
      这也是比较器方式的排序。

     记住:只要提到比较器,指的是Comparator,只要提到自然排序,值的是Comparable.
           如果两种方式都存在,以比较器为主。

        技巧:
      ArrayList:数组结构。
      LinkedList:链表结构。
      HashSet:哈希表结构。
      TreeSet:二叉树。

      通过集合名称其实 就可以知道该集合的结构。
      看到Array,就是数组。
      看到Link,就是链表,first,last方法。
      看到Hash,就是哈希表,就要想到hashCode和equals方法。
      看到Tree,就是二叉树。就要想到Comparable以及compareTo方法,和Comparator以及compare方法。

---------------------- android培训java培训、期待与您交流! ----------------------详细请查看: http://edu.csdn.net/heima
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值