zoukankan      html  css  js  c++  java
  • java中Collection容器

    1、容器(Collection)也称为集合, 在java中就是指对象的集合.

        容器里存放的都只能是对象. 实际上是存放对象的指针(头部地址);

        这里对于八种基本数据类型,在集合中实际存的是对应的包装类!

      为什么要引出容器呢?java中的数组不是也能满足部分要求?

        数组中元素类型必须一致;而且数组长度难以扩充,需要扩充的话,需要把原先的数组复制到一个新的数组,使用System.arraycopy();这样十分耗费CPU资源和内存空间

    class A{  
        private int i;  
        public A(int i){  
            this.i = i;  
        }  
      
        public String toString(){  
            return "" + this.i;  
        }  
    }  
      
    public class Collect1{  
        public static void f(){  
            A[] arr_A = new A[10];  
            int i;  
            for(i = 0; i < 10; i++){  
                arr_A[i] = new A(i);  
            }       
      
            A[] arr_A2 = new A[11];  
            System.arraycopy(arr_A,0,arr_A2,0,10);  
      
            arr_A2[10] = new A(11);  
            for(i = 0; i < 11; i++){  
               System.out.println(arr_A2[i]);   
            }       
        }  
    }  

    2、容器的分类

    01、集(Set)

         Set相当于数学上的集合, Set中的所有元素是无序的, 而且不允许出现重复的元素.

    02、列表(List)

         List相当于代数里的队列, 列表的元素是有序的, 而且允许包含重复成员.

        当然, 在java中List也可以分为数组列表(ArrayList)和链表(LinkedList), 它们两者的使用方法类似, 但是内存存储机制是不同的.

    03、映射(Map)

        Map保存所谓的'键值对'(Key - Value)信息, 映射中不能出现重复的键(key), 每个键最多只能映射一个值.

      在java中, sun公司为上面三个容器类型设计了三个对应的接口(interface), 这个三个接口分别是 Set  List  Map.

    由此看出, Java里的容器类是基于接口(interface)构建的.

      * Collection 定义了存取一组对象的方法, 其子接口Set和List分别定义了存储方式.

      * Map接口定义了存储(key-value)映射对的方法.

      *常见的容器Vector, 其实Vector也是List容器一种, 但是Vector支持线程同步(里面的方法都是sycronized的), 也就是

        允许多个线程同时操作1个Vector容器而不丢失数据.而Arraylist并不是同步的.

    3、容器中常见的方法

    容器作为1个类, 当然有若干个常用的成员方法, 为了叙述方便, 先介绍这一点.

       3.1 int size();      返回Collection中的元素个数.

      3.2 boolean containsAll(collection c); 判断1个容器是否包含另1个容器的所有元素, 这里的元素指的的是对象的指针, 也就是对象的本身.

      3.3 boolean add(Object e);

        把1个对象添加到容器中, 这个方法是每种容器必有的方法.

      3.4 boolean remove(Object e);

         移除容器中首次出现的制定对象, 因为List容器根据次序不同允许存在重复的对象

       3.5 get(int index);

        获得容器中第index个元素, 这个方法在List容器中十分常用, 但是不并适用于Set容器, 因为Set容器的元素是无序的.

       3.6 Iterator iterator();

         一些无序的容器很难通过循环来遍历元素, 这时我们可以利用迭代器来遍历容器元素.

      3.7 Object[] toArray();

      容器不是数组, 不能用下标来访问容器的元素, 这个方法可以返回1个包含容器所有元素的数组.

       3.8 重写容器元素的toString()方法

        而println方法是输出对象的toString()方法.   toString()方法在基类(Object)中被定义成输出对象的类名+hashcode(). 

        而很多时候我们需要的是输出对象的其他有用信息(例如关键成员的值)

      所以强烈建议:

           为所有有可能放入容器的类重写toString()方法.

    4、Collections

      是容器的工具类,集合许多对容器进行复杂操作静态的方法

      

    4.1 void sort(List); 

    对List容器内的元素排序, 前提是容器内元素的类已经实现Comparable 接口(可以比较的)

    下一篇文章会详细提到.

    4.2 void Shuffle(List);

    对List容器的元素进行随机排序.

    4.3 void reverst(List);

    就是传说中的倒置, 队List容器内的元素进行逆排序, 一般没什么用..

    4.4 void Fill(List,Object);

    把容器内的所有元素都替换为1个制定对象(object)

    4.5 void Copy(List dest,List src); 

    把容器src里的内容复制到dest容器 

    4.6 int bianrySearch(List,Object);

    对于已排序的容器, 利用折半查找法找出制定对象,

    5、有必要介绍Comparable接口

      Collections类中包含很多对实现Collection接口的容器各种操作的静态方法. 

        当然, 其中最长用的莫过于排序了(Collections.sort(List l)

      当我们自定义类实现排序时,报出java.lang.ClassCastException,只有实现Comparable接口,重写int compareTo(T o)

        这个方法返回1个Int数值,  

          例如 i = x.compareTo(y)

        如果i=0, 也表明对象x与y排位上是相等的(并非意味x.equals(y) = true, 但是jdk api上强烈建议这样处理)

        如果返回数值i>0 则意味者, x > y啦, 

        反之若i<0则 意味x < y

    下面是一个例子

    import java.util.ArrayList;  
    import java.util.Collections;  
      
    class Student implements Comparable{  
        private String name;  
        private int ranking;  
      
        public Student(String name, int ranking){  
            this.name = name;  
            this.ranking = ranking;  
        }   
      
        public String toString(){  
            return this.name + ":" + this.ranking;  
        }  
      
        public int compareTo(Object o){  
            Student s = (Student)(o);  
            return this.ranking - s.ranking;  
        }  
    }  
      
    public class Compare2{  
        public static void f(){  
            ArrayList arr = new ArrayList();  
            arr.add(new Student("Jack",10));  
            arr.add(new Student("Bill",23));  
            arr.add(new Student("Rudy",7));  
      
            System.out.println(arr);  
            Collections.sort(arr);  
            System.out.println(arr);  
        }   
    }  

    这时再编译执行, 就能见到List容器内的Student对象已经根据ranking来排序了. 

    [java] [Jack:10, Bill:23, Rudy:7]  
    [java] [Rudy:7, Jack:10, Bill:23]  
    

      

    参考:http://blog.csdn.net/nvd11/article/details/21516075

  • 相关阅读:
    解决Maven关于本地jar包的打包处理
    微信公众帐号应用开发—本地调试
    字符串
    动态类型
    数字
    React文档(二十四)高阶组件
    React文档(二十三)Web Components
    React文档(二十二)context
    React文档(二十一)协调
    React文档(二十)不使用JSX
  • 原文地址:https://www.cnblogs.com/developerxiaofeng/p/8329392.html
Copyright © 2011-2022 走看看