黑马程序员----集合

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

集合框架

 

    1、java集合概述

 

       在编程的时候,我们常常需要将许多对象存在一个容器当中,并且想要其实现常用的数据结构,如栈、队列等。 除此之外也想要将具有映射关系的关联数组存储其中。由此,就产生了java的集合。
       在java中,总共定义了两大类集合就是collection和map具体的子类及其特点如下:
       在集合的框架中,collection和map是并列的,他们各自产生了很多的子类,现就总结一下,常用的。
      Collection
         --list                 此集合是有序的,存入其中的元素是可以重复的
         --ArrayList      底层是数组数据结构,查询速度较快,增删速度慢 线程是不同步的
         --LinkedList    底层的数据结构是链表数据结构,查询速度较慢,增删较快,线程是不同步的
         --Vector        底层数据结构是数组结构,线程是同步的  效率太慢
         --set              此集合是无顺序的,存入其中的元素是不可以重复的
         --HashSet     底层数据结构式哈希表,对于类似于String的元素,存入其中会自动调用
                               hashCode()方法和equals()方法,这两个方法都是Object的方法  来确保
                              存入元素的唯一性。当自定义元素的时候,我们一般都要复写Object的这
                               两个方法。  
         --TreeSet      底层是二叉树结构,可以对存入的元素进行排序。但是,对于存入的自定义

                              元素必须implements Coparable 接口、复写compareTo()方法,其目的就是

                              为了让存入的元素具有比较性。
                              这就是TreeSet集合的特点。
     Map:    此集合石键值对出现的。
         --HashTable     底层数据结构是哈希表结构,线程是同步的,jdk1.0版本出现的 效率低
                                  键。值不可以为null    元素是无序的 不可重复的
         --HashMap       底层数据结构是哈希表  线程是不同步的 jdk1.4版本出现的  效率较高
                                  键。值可以为null    元素是无序的 不可重复的
         --TreeMap        底层数据结构是二叉树结构  集合可以对存入元素进行排序的

    2、java集合作用及为什么要定义集合

      2.1  集合的作用:

      既然java中已经出现了数组,为什么还是要出现集合呢?数组虽然也可以是存贮对象,但是其长度是固定的,集合的长度是可变的;数组中可以存贮基本数   据类型,集合中只能存贮对象。他会将基本      数据类型转换成引用数据类型,如:int——Integer,short——Short,long——Long,float——Float。

       注意:集合里面存贮的不是对象的实体,而是对象的引用。

      2.2  为什么要出现集合:

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

   3、对集合的常见操作

      3.1  list集合的常见操作

                List集合作为Collection集合的子类,除了继承其全部的方法之外,还提供了自己的特有的方法。
         add(int index,Object obj):将指定的obj添加到集合的指定位置处index。
         get(int index):获取指定位置上的元素,返回值类型为object ,一般使用的时候我们需要进行强转。
         indexOf(Object obj):索引对象在集合中的位置。返回的是int
         remove(int index):删除指定位置上的元素,返回值是这个位置上元素
         remove(Object obj):判断是否删除这个指定位置上元素,返回值是boolean。
        当然,最主要的是List增加了自己特有的迭代器这个可以在遍历集合的时候,进行元素的增删操作。

      3.2  Set集合的主要特点

             前面已经总结过,Set就像是一个罐子,一旦将其扔进其中,集合中的元素没有明显的顺序。他和Collection 一样,继承了其全部的方法,并没有提供额外的方法。Set集合不允许有重复的元素,如果试图将两个相同的元素加入其中,则操作失败并且add方法返回为false,且新元素不会被添加其中。
        set集合判断元素重复的方法,并不是依据"==",而是通过equals方法,就是说只要元素的equals方法返回true添加元素就会失败。
        HashSetshi是set集合的一个重要的实现类,我们一般使用的时候就是使用它。现在总结一下,HashSet集合的主要特点:
       不能保证存入元素的排列顺序,顺序有可能发生变化,HashSet是不同步的,如果多个线程同时访问一个HashSet,有两个或者两个以上的线程修改了集合时候,就必须通过同步代码来保证其步,集合元素的值可以使null当向HashSet集合存入元素的时候,他首先会调用元素的HashCode()方法来保证该对象的哈希值,然后根据其哈希值来判断出该元素在集合中的位置,在调用其equals方法在进行判断一次。
        所以,一般我们在自定义存入集合的元素的时候,就有了一下的操作:
 
     class Person//往HashSet集合中存入自定元素的时候,应该有的复写方法

    

    {
    private String name;
    private int age;
    Person(String name,int age){this.name=name;this.age=age;}
    public void setName(String name){this.name=name;}
    public void setAge(int age){this.age=age;}
    public String getName(){return name;}
    public int getAge(){return age;}
    public int hashCode(){return name.hashCode()+age;}//复写object的hashcode()方法
    public boolean equals(Object obj)//复写object的equals方法
    {
        if(!(obj instanceof Person))   
            return false;
        Person p=(Person)obj;
        return this.name.equals(p.name)&&this.age==p.age;
    }
      }

      TreeSet集合也是Set集合的一个实现类,他相比于HashSet不同之处在于:并不是更具元素的插入顺序进行排序,而是根据元素的实际值来进行排序的。

       他的底层是通过二叉树的原理啦判断元素是否相同。TreeSet集合支持两种排序:自然排序和定制排序。
       自然排序:就是根据元素的自然顺进行排序,我们常用的一般元素都是实现了Comparable接口,并且复写其compareTo方法来实现自然排序的。
       定制排序:就是我们根据自己的需要,自定义一个比较器,将其作为一个参数,传递TreeSet集合的构造参数。具体就是定义一个类实现Comparator接口,复写他的compare方法。
       所以,现在我们想要往仁义一个集合中存入元素的时候,该干的事就多了,例如:
   
  class Person implements Comparable
      {
    private String name;
    private int age;
    Person(String name,int age){this.name=name;this.age=age;}
    public void setName(String name){this.name=name;}
    public void setAge(int age){this.age=age;}
    public String getName(){return name;}
    public int getAge(){return age;}
    public int hashCode(){return name.hashCode()+age;}
    public int compareTo(Object obj)//按照年龄的大小排序
    {
        Person p=(Person)obj;
    int num=new Integer(this.age).compareTo(new Integer(p.age));
    if(num==0)
    {return this.name.compareTo(p.name);}
    return num;
    }

      }
      //自定义比较器,传入集合的构造函数中
      class myComparator implements Comparator
      {
    public int compare(Object obj1,Object obj2)//按照年龄的大小,如果相同再按照姓名
    {
        Person p1=(Person)obj1;
        Person p2=(Person)obj2;
        int num=new Integer(p1.getAge()).compareTo(new Integer(p2.getAge()));
    if(num==0)
    {return p1.getName().compare(p2.getName());}
    return num;
    }
      }


          以上就是我们自定义了集合中元素的方法,并且自定了一个比较器

   3.3  Map集合的特点

            Map集合石用于保存具有映射关系的数据,因此Map集合里面保存着两组值,一组值用于保key,一组用于保存value,一个集合里面不允许有两个相同的key。因为,通过一个key只能相应的取出器固定的value。
       HashMap和HashTable的区别上面已经总结,现在有一个比较重要的类就是properties,它连接着IO流和集合,通过气自身的load(InPutStream in),和list(PrintStream ps)所以这是我们应该掌握的内容。往集合中添加元素的方法以及原理和Set集合大同小异,我们就没必要在重新阐述了。现在重点说一下对于map集合的遍历方法。
   
  //Map集合中没有迭代器,所有就是两种方法。keySet()和entrySet正两种
      //第一种方法 keySet()
      import java.util.*;
      class MapQc
      {
    public static void main(String[] args)
    {
        Map<String,Integer> map=new HashMap<String,Integer>();//创建Map集合子类对象
        map.put("zhangsan0",55);
        map.put("zhangsan1",56);
        map.put("zhangsan2",58);
        map.put("zhangsan0",55);
        QC(map);
        QC_1(map);
    }
    public static void QC(Map<String,Integer> map)
    {
        Set<String> keyset=map.keySet();
        Iterator<String> it=keyset.iterator();
        while(it.hasNext())
        {
            String key=it.next();
            //System.out.println(key);
            Integer value=map.get(key);
            System.out.println(key+"=="+value);
        }
    }
    public static void QC_1(Map<String,Integer> map)//第二种方法  取出键值关系
    {
        Set<Map.Entry<String,Integer>> entryset=map.entrySet();
        Iterator<Map.Entry<String,Integer>> it=entryset.iterator();
        while(it.hasNext())
        {
            Map.Entry<String,Integer>  hs=it.next();
            String key=hs.getKey();
            Integer value=hs.getValue();
            System.out.println(key+"::"+value);
        }
     }
      }


    4.总结

         阐述了上面那么的内容,总而言之,我们一般在操作集合的时候,无非就是常见的四种操作—crud。分别就     是create  raed update delete。
       在list集合中,我们一般情况下首选的是ArrayList,在Set集合中我们一般首选的就是HashSet,在map集合    中我们首选的HashMap。当然,其余的集合我们也肯定会遇到的。最后在总结一点:就是Set集合底层调用的就是Map集合 (当Map集合的value值全为null的时候就是set集合)

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


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值