JAVA集合汇总

来源:互联网 发布:冒泡排序法c程序算法 编辑:程序博客网 时间:2024/06/06 05:19

JAVA集合出现:

            1.由于传统数组的长度大小是一定的,而集合的长度大小是不固定的,而且集合只能存储引用类型数据,不能存储基本类型数据;(JAVA的Integer 是对int的封装);

JAVA基本分类:

           1.List(列表)

           2.Set(集合)

           3.Map(映射)

           Collection 接口 :Collection是最基本的集合接口,声明了适用于JAVA集合(只包括Set和List)的通用方法。 Set 和List 都继承了Conllection,Map;          

            Collection接口的方法: 

            boolean add(Object o)      :向集合中加入一个对象的引用 

            void clear():删除集合中所有的对象,即不再持有这些对象的引用 

            boolean isEmpty()    :判断集合是否为空 

            boolean contains(Object o) : 判断集合中是否持有特定对象的引用 

           Iterartor iterator()  :返回一个Iterator对象,可以用来遍历集合中的元素 

           boolean remove(Object o) :从集合中删除一个对象的引用 

           int size()       :返回集合中元素的数目 

           Object[] toArray()    : 返回一个数组,该数组中包括集合中的所有元素

           Iterator() 和toArray() 方法都用于集合的所有的元素,前者返回一个Iterator对象,后者返回一个包含集合中所有元素的数组。

   1.Set(集合): Set是最简单的一种集合。集合中的对象不按特定的方式排序,并且没有重复对象。 如果试图把两个相同元素加入同一个集合中,add方法返回false。

           Set判断两个对象相同不是使用==运算符,而是根据equals方法。也就是说,只要两个对象用equals方法比较返回true,Set就不 会接受这两个对象。

           HashSet  :HashSet类按照哈希算法来存取集合中的对象,存取速度比较快 ; 不能保证元素的排列顺序,顺序有可能发生变化;集合元素可以是null,但只能放入一个null;

     不是同步的;

          LinkedHashSet:保留插入顺序,迭代访问性能比HashSet好,但插入不如HashSet;

          TreeSet:TreeSet类实现了SortedSet接口,能够对集合中的对象进行排序;TreeSet支持两种排序方式,自然排序 和定制排序,其中自然排序为默认的排序方式。向TreeSet中加入的应该是同一个类的对象;自然排序是根据集合元素的大小,以升序排列,如果要定制排序,应该使用Comparator接口,实现 int compare(T o1,T o2)方法;

   示例代码如下;

       package test;

import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;

public class SetTest {
    public static void main(String[] args){
        //载入自定义的排序规则
        Set<Student> qingHua=new TreeSet<Student>(new TestComparator());
        qingHua.add(new Student(170,120,100.1));
        qingHua.add(new Student(175,115,100.2));
        qingHua.add(new Student(180,110,100.3));
        for(Student s:qingHua){
            System.out.println("Height:"+s.getHeight()+" Weight:"+s.getWeight()+" grade:"+s.getGrade());
        }
        Student.sortMold=2;
        for(Student s:qingHua){
            System.out.println("Height:"+s.getHeight()+" Weight:"+s.getWeight()+" grade:"+s.getGrade());
        }
        Student.sortMold=3;
        for(Student s:qingHua){
            System.out.println("Height:"+s.getHeight()+" Weight:"+s.getWeight()+" grade:"+s.getGrade());
        }
    }
}

class TestComparator implements Comparator<Student>{

    @Override
    public int compare(Student o1, Student o2) {
        if(Student.sortMold==1){
            if(o1.getHeight()>o2.getHeight()){
                //返回-1的是需要的顺序
                return -1;
            }else if(o1.getHeight()<o2.getHeight()){
                return 1;
            }else{
                return 0;
            }
        }else if(Student.sortMold==2){
            if(o1.getWeight()<o1.getWeight()){
                return 1;
            }else if(o1.getWeight()>o1.getWeight()){
                return -1;
            }else{
                return 0;
            }
        }else if(Student.sortMold==3){
            if(o1.getGrade()>o2.getGrade()){
                return -1;
            }else if(o1.getGrade()<o2.getGrade()){
                return 1;
            }else{
                return 0;
            }
        }
        return 0;
    }
    
}

class Student{
    public static int sortMold =1;    //排序模式,1为身高,2为体重,3为成绩
    private int height;    //身高
    private int weight;    //体重
    private Double grade;    //成绩
    Student(int height,int weight,Double grade){
        this.height=height;
        this.weight=weight;
        this.grade=grade;
    }
    public int getHeight() {
        return height;
    }
    public void setHeight(int height) {
        this.height = height;
    }
    public int getWeight() {
        return weight;
    }
    public void setWeight(int weight) {
        this.weight = weight;
    }
    public Double getGrade() {
        return grade;
    }
    public void setGrade(Double grade) {
        this.grade = grade;
    }
}

  2.List(列表): List的特征是其元素以线性方式存储,集合中可以存放重复对象。 

      ArrayList 是一个可改变大小的数组.当更多的元素加入到ArrayList中时,其大小将会动态地增长.内部的元素可以直接通过get与set方法进行访问,因为ArrayList本质上就是一个数组.
     LinkedList 是一个双链表,在添加和删除元素时具有比ArrayList更好的性能.但在get与set方面弱于ArrayList.
当然,这些对比都是指数据量很大或者操作很频繁的情况下的对比,如果数据和运算量很小,那么对比将失去意义.
     Vector 和ArrayList类似,但属于强同步类。如果你的程序本身是线程安全的(thread-safe,没有在多个线程之间共享同一个集合/对象),那么使用ArrayList是更好的选择。
Vector和ArrayList在更多元素添加进来时会请求更大的空间。Vector每次请求其大小的双倍空间,而ArrayList每次对size增长50%.而 LinkedList还实现了 Queue 接口,该接口比List提供了更多的方法,包括 offer(),peek(),poll()等.
注意: 默认情况下ArrayList的初始容量非常小,所以如果可以预估数据量的话,分配一个较大的初始值属于最佳实践,这样可以减少调整大小的开销。

  3.Map(映射):Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复。

     HashMap:

           Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。
           HashMap最多只允许一条记录的键为Null;允 许多条记录的值为 Null;

           HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。

           如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。

    Hashtable:HashMap类似,它继承自Dictionary类,

           不同的是:它不允许记录的键或者值为空;

          它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢。

     LinkedHashMap:

        保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以 在构造时用带参数,按照应用次数排序。

        在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会 比LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。

    TreeMap:实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。


    一般情况下,我们用的最多的是HashMap,HashMap里面存入的键值对在取出的时候是随机的,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度.

    在Map 中插入、删除和定位元素,HashMap 是最好的选择。

    TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。

    LinkedHashMap 是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现,它还可以按读取顺序来排列,像连接池中可以应 用。

2 0
原创粉丝点击