首页 > 代码库 > 集合框架浅析

集合框架浅析

一 Collection Framwork Diagram

技术分享

二 重要接口 类解析

 1 Collection(元素无序)

   数组具有良好的随机访问性能,但数组中元素类型单一,一旦声明其空间大小固定。Collection弥补了数组空间不可扩充的缺陷,既可以加入任意类型的对象,空间也可以自由分配。经典谚语"Collection就像一个筐,任何类型的对象都可以放入,而且元素可以重复"。

 2 List(元素有序)

     1 ArrayList 与LinkedList

   List是Collection的经典子接口,经常用于存储操作,同时ArrayList最常用于实现List接口。元素有序添加至列表结尾,ArrayList适用于经常遍历元素.LinkedList也是List接口实现类,特性类似于链表,适用于大规模元素增加删除操作

    2 ArrayList与Vector区别

  ArrayList为线程不同步,Vector为线程同步,在非多线程环境下多选择ArrayList进行操作
3  Set(元素不重复)

 1 TreeSet

       1 内置Integer和String类型分别按自然顺序和字典顺序进行排序,自定义对象类型的排序需要实现Comparable接口

package com.fjnu.test;import java.util.Iterator;import java.util.TreeSet;public class Tester {    public static void main(String[] args) {        // TODO Auto-generated method stub            TreeSet treeset=new TreeSet();            treeset.add("hello world");            treeset.add("welcom to here");            treeset.add("i like java");                     Iterator iterator=treeset.iterator();            while(iterator.hasNext())                System.out.println(iterator.next());    }}

输出结果:

hello world
i like java
welcom to here(此时按照字典顺序排序)

      2 TreeSet依靠TreeMap实现内部排序(详见对象比较与排序)

 2 HashSet(首选Set实现类,其性能优于其他Set实现)

4Queue(支持元素FIFO原则进行排序)

package com.fjnu.test;import java.util.Iterator;import java.util.LinkedList;import java.util.Queue;public class Tester {    public static void main(String[] args) {        // TODO Auto-generated method stub        Queue queue = new LinkedList();        queue.add("i am a programmer!");        queue.add("Java is a computer programming language!");        queue.add("Java is easy to learn!");        Iterator iterator = queue.iterator();        while (iterator.hasNext())            System.out.println(iterator.next());    }}

输出结果:

i am a programmer!
Java is a computer programming language!
Java is easy to learn!

5Map(key/value形式存储)

   1TreeMap(元素有序)

   2HashMap(Map接口常用实现类)

Map是保存键/值对的地方,Map中不含有重复的键,每个键最多映射一个值

注:Map中键和值都不能为基本类型

三 对象比较与排序

小案例:

 一个显示器生产工厂,其专门制造各种液晶显示器 显示器类属性:
1. 屏幕尺寸 (14#,15#,17#,19#,23#)(size)
2. 屏幕分辨率 (1024*768,1280*1024,1366*768,1920*1080)(resolution)
3. 是否合格 (合格,不合格)(qualified)
  随机生成20台液晶电视(但不雷同)(TreeSet满足该条件)
输出要求:
1. 按合格率排(合格的排前头,不合格排后头)
2. 屏幕尺寸 (从大到小)
3. 屏幕分辨率 (从低分辨率到高分辨率)

  方法一 实现Comparable接口(重写compareTO()方法)

package edu.fjnu.Collection.TreeSet.Domain;import java.util.Random;//显示器实体,用于封装屏幕大小 分辨率等属性public class Displayer implements Comparable<Displayer> {    private final static String SIZES[] = { "14#", "15#", "17#", "19#", "23#",            "25#", "27#", "29#" };// 屏幕尺寸    private final static String RESOLUTIONS[] = { "1024*768", "1280*1024",            "1366*768", "1920*1080", "2050*1080" };// 屏幕分辨率    private Random r = new Random();// 是否合格    private String size;    private Boolean qulified;    private String resolution;    // 随机生成对象    public Displayer() {        this.size = SIZES[r.nextInt(SIZES.length)];        this.resolution = RESOLUTIONS[r.nextInt(RESOLUTIONS.length)];        this.qulified = r.nextBoolean();    }    @Override    public String toString() {        return this.size + "\t" + this.resolution + "\t"                + (this.qulified ? "合格" : "不合格");    }    public Random getR() {        return r;    }    public void setR(Random r) {        this.r = r;    }    public String getSize() {        return size;    }    public void setSize(String size) {        this.size = size;    }    public Boolean getQulified() {        return qulified;    }    public void setQulified(Boolean qulified) {        this.qulified = qulified;    }    public String getResolution() {        return resolution;    }    public void setResolution(String resolution) {        this.resolution = resolution;    }    // 自定义Displayer各属性    public Displayer(Random r, String size, Boolean qulified, String resolution) {        this.r = r;        this.size = size;        this.qulified = qulified;        this.resolution = resolution;    }    @Override    public int compareTo(Displayer other) {        if( !(other.getQulified().equals(this.qulified)))//合格率不同,按合格的先拍            return this.qulified.compareTo(other.getQulified())*-1;        else if(!(this.size.equals(other.getSize())))//合格率相同,按尺寸由大到小排           return this.size.compareTo(other.getSize())*-1;        else if(!(other.getResolution().equals(this.resolution)))//屏幕分辨率不同按由大到小排             return this.getResolution().compareTo(other.resolution);        return 0;    }}package edu.fjnu.Collection.TreeSet.test;import java.util.TreeSet;import edu.fjnu.Collection.TreeSet.Domain.Displayer;public class DisplayerTester {    public static void main(String[] args) {        // TODO Auto-generated method stub       TreeSet<Displayer> treeset=new TreeSet<Displayer>();       int i=0;       int count=0;        while(i<20){            treeset.add(new Displayer());            i++;        }        System.out.println( "屏幕尺寸\t屏幕分辨率\t是否合格");        for(Displayer displayer:treeset){            System.out.println(displayer);        }         }}

输出结果

技术分享

 方法二 自定义Comparator比较器

public static class DisplayerCompator implements Comparator<Displayer2> {//自定义比较器        @Override        public int compare(Displayer2 displayer1, Displayer2 displayer2) {//自定义笔记方式            if (!displayer1.getQulified().equals(displayer2.getQulified()))                return displayer1.getQulified().compareTo(                        displayer2.getQulified())*-1;            else if (!displayer1.getSize().equals(displayer2.getSize()))                return displayer1.getSize().compareTo(displayer2.getSize())*-1;            else if (!displayer1.getResolution().equals(                    displayer2.getResolution()))                return displayer1.getResolution().compareTo(                        displayer2.getResolution());            return 0;        }    }
package edu.fjnu.Collection.TreeSet.test;import java.util.Iterator;import java.util.TreeSet;import edu.fjnu.Collection.TreeSet.Domain.Displayer;import edu.fjnu.Collection.TreeSet.Domain.Displayer2;public class DisplayerTester {    public static void main(String[] args) {        // TODO Auto-generated method stub        TreeSet treeset = new TreeSet(new Displayer2.DisplayerCompator());// 构造方法中传入自定义比较器        int i = 0;        while (i < 20) {            treeset.add(new Displayer2());            i++;        }        System.out.println("屏幕尺寸\t屏幕分辨率\t是否合格");        Iterator iterator = treeset.iterator();        while (iterator.hasNext())            // 用迭代器遍历TreeSet中元素            System.out.println(iterator.next());    }}

输出结果:

技术分享

输出结果符合题目要求

备注:

    Java collection framework为程序员提供了操作 存储对象的便利,开发过程中当依据不同集合类型各自特点,选取最恰当的存储类型。因集合框架技术细节繁多,此文仅涉及collection的常规用法,细节问题实践过后方能体会。

 

集合框架浅析