黑马程序员------集合框架(Collection)

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

 

集合框架(Collection)

为什么出现集合类?

    面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。

数组和集合类同是容器,那么有何不同?

     数组虽然也可以存储对象,但长度是固定的;集合长度是可变的,数组中可以存储基本数据类型,集合只能存储对象

集合类的特点:

     集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象

 

集合框架为什么会出现这么多的容器呢?

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

集合的作用:
    1.我们之前存储大量数据,可以使用数组:


          数组的弊端:
              1).要先期指定长度;


              2).一旦指定长度,其长度不能改变;
    2.Java为我们提供了大量的"集合类",供我们程序员使用;

    3.这些"集合类"内部使用了不同的"数据结构"来存储对象;
              它们有些:查询快;增删慢;
                  有些:查询慢;增删快;
                  有些:查询快;增删快;但是无序的;
    所以要根据我们的需要选择不同的集合类;

集合框架的层次结构:

Collection(顶层接口):
    |--List(接口):元素是有序的,元素可以重复,因为该集合体系有索引
        |---ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快

        |---LinkedList:底层使用的链表数据结构

        |---Vector:底层是数组数据结构。线程同步,被ArrayList替代了

    |--Set(接口):元素是无序的,元素不可以重复
        |--HashSet(类):底层数据结构是哈希表;无序的,线程不安全的效率高;

        |--TreeSet(类): 底层数据结构二叉树;排序的;线程不安全的,效率高;

创建一个集合容器,使用Collection接口的子类,ArrayList

ArrayList  a1=new ArrayList();

ArrayList中的共性方法:

add() 向集合中添加元素

remove() 删除集合中的元素

clear() 清空集合中的元素

contains()  判断元素是否存在

isEmpty()  判断集合是否为空

size()  获取集合的长度

  retailAll()  取交集

  例如:al1. retailAll(al2):取交集,集合al1中只会保留和集合al2中相同的元素

 

add方法的参数类型是object。以便于接收任意类型对象

 

集合中存储的都是对象的引用(地址)

 

遍历取出集合中的所有元素:  就需要使用迭代器

 

什么是迭代器呢?  其实就是集合的取出元素的方式

 

Iterator it = a1.iterator();  获取迭代器,用于取出集合中的元素

例子:

ArrayList a1=new ArrayList();

   a1.add(“abcd1”);

   a2.add(“abcd2”);

Iterator it = a1.iterator();

  while(it.hasNext())

{

     System.out.println(it.next());

}

List的特有的方法:凡是可以操作角标的方法都是该体系特有的方法

List:元素是有序的,元素可以重复,因为该集合体系有索引

增加元素:

     add(index,element);

     addAll(ndex,Collection);

删除元素:

     remove(index);

修改元素:

     set(index,element);

获取元素:

     get(index);

     subList(from,to);

     listIterator();

list集合中判断元素是否相同,依据的是元素的equals方法

LinledList的特有方法:

添加元素:

    addFirst();

         addLast();

获取元素:

    获取元素,但不删除元素,如果集合中没有元素 

         getFirst();

         getLast();

       获取元素,但是元素被删除

         removeFirst();

         removeLast();

Vector:枚举

枚举就是Vector特有的取出方式   并且枚举和迭代器很像

其实枚举和迭代是一样的,因为枚举的名称以及方法的名称都过长,所以被迭代器取代了

 

HashSet底层数据结构是哈希表;无序的,线程不安全的效率高;

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

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

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

               如果元素的hashCode值不同,不会调用equals

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

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

       TreeSet保证元素唯一性的依据:

               两种比较的方式:

                             1)让元素自身具备比较性。 元素需要实现comparable接口,

                                   覆盖compareTo(Object obj)方法,这种方式也称为元素的自然顺序,

                                    或者叫做默认顺序

                             2)当元素自身不具备比较性,或者具备的比较性不是所需要的这

                                   需要让容器自身具备比较性,在初始化时,就有了比较的方式,

                                   需要实现Comparator接口,重写compare()方法;

 

                当两种排序都存在时,以比较器为主接口,覆盖compare()方法定义一个类,实现Comparator

 

Set集合的功能和collection是一致的

 

练习:往TreeSet集合中存储自定义对象学生,想按照学生的年龄进行排序

记住:排序时,当主要条件相同时,一定要判断一下次要条件

Import java.util.*;

class Student implements Comparable<Student>

{

   private String name;

   private int age;

   Student(String name,int age)

       {

        this.name=name;

              this.age=age;

    }

 

       public String getName()

       {

          return name;

       }

       public int getAge()

       {

          return age;

       }

       public int compareTo(Student s)

       {

             

             

           int num=new Integer(this.age).compareTo(new Integer(s.age));

              if(num==0)

              {

                 return this.name.compareTo(s.name);

              }

              return num;

       }

      

}

 

class  TreeDemo

{

       public static void main(String[] args) throws Exception

       {

              TreeSet<Student>  t=new TreeSet<Student>();

 

              t.add(new Student("zhangsan",34));

              t.add(new Student("zhangsan2",11));

              t.add(new Student("zhangsan3",50));

              t.add(new Student("zhangsan4",24));

 

        Iterator<Student> it=t.iterator();

 

              while(it.hasNext())

              {

                  Student s=(Student)it.next();

 

                     System.out.println(s.getName()+"...."+s.getAge());

              }

       }

}

 

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值