集合框架浅析

一 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实现)

4
Queue(支持元素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!

5
Map(key/value形式存储)

1
TreeMap(元素有序)

2
HashMap(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的常规用法,细节问题实践过后方能体会。

时间: 2024-11-01 08:42:33

集合框架浅析的相关文章

Java集合框架浅析

集合框架示图 Collection接口和Map接口 方法API介绍 Collection接口: boolean add(E e) :添加元素到集合中 boolean addAll(Collection<? extends E> c) : 将指定 collection 中的所有元素都添加到此 collection 中(可选操作). void clear() : 移除此 collection 中的所有元素(可选操作). boolean contains(Object o) :如果此 collect

牛刀小试 - 浅析Java集合框架的使用

基本概述 Java中的集合框架与数组类似,都是用于存储多个同一类型数据的容器. 但是对于数组的使用,会因为数组本身的特性会导致一些使用限制,例如: 数组要求在构造时,就必须确定数组的长度.所以如果想要存放的数据个数不确定,数组就无法使用. 于是促使了集合框架的诞生,与数组相比,集合框架最大特点在于: 集合框架下的容器类只能存放对象类型数据:而数组支持对基本类型数据的存放. 任何集合框架下的容器类,其长度都是可变的.所以不必担心其长度的指定问题. 集合框架下的不同容器了底层采用了不同的数据结构实现

深入java集合学习1-集合框架浅析

前言 集合是一种数据结构,在编程中是非常重要的.好的程序就是好的数据结构+好的算法.java中为我们实现了曾经在大学学过的数据结构与算法中提到的一些数据结构.如顺序表,链表,栈和堆等.Java 集合框架API是用来表示和操作集合的统一框架,它包含接口,实现类以及一些编程辅助算法.具体位于java.util包下. java集合框架UML图 从上面的UML图中可以看出,集合框架可以简单的分为四部分 Collection接口以及实现类 Map接口及其实现类 Iterator接口及实现类 辅助工具类  

JAVA 笔记(三) 从源码深入浅出集合框架

集合框架概述 以Java来说,我们日常所做的编写代码的工作,其实基本上往往就是在和对象打交道. 但显然有一个情况是,一个应用程序里往往不会仅仅只包含数量固定且生命周期都是已知的对象. 所以,就需要通过一些方式来对对象进行持有,那么通常是通过怎么样的方式来持有对象呢? 通过数组是最简单的一种方式,但其缺陷在于:数组的尺寸是固定的,即数组在初始化时就必须被定义长度,且无法改变. 也就说,通过数组来持有对象虽然能解决对象生命周期的问题,但仍然没有解决对象数量未知的问题. 这也是集合框架出现的核心原因,

Java—集合框架List

集合的概念 现实生活中:很多的事物凑在一起 数学中的集合:具有共同属性的事物的总和 Java中的集合类:是一种工具类,就像是容器,存储任意数量的具有共同属性的对象 集合的作用 在类的内部,对数据进行组织(针对作用与意义一样的属性,将他们放到一个集合中) 简单而快速的搜索大数量的条目 有的集合接口,提供了一系列排列有序的元素,并且可以在序列中快速的插入或删除有关元素 有的集合接口,提供了映射关系,可以通过关键字(key)去快速查找到对应的唯一对象,而这个关键字可以是任意类型 与数组相比 数组的长度

《深入理解Java集合框架》系列文章

Introduction 关于C++标准模板库(Standard Template Library, STL)的书籍和资料有很多,关于Java集合框架(Java Collections Framework, JCF)的资料却很少,甚至很难找到一本专门介绍它的书籍,这给Java学习者们带来不小的麻烦.我深深的不解其中的原因.虽然JCF设计参考了STL,但其定位不是Java版的STL,而是要实现一个精简紧凑的容器框架,对STL的介绍自然不能替代对JCF的介绍. 本系列文章主要从数据结构和算法层面分析

JAVA基础之集合框架

集合框架(collections framework) 首先要明确,集合代表了一组对象(和数组一样,但数组长度不能变,而集合能).Java中的集合框架定义了一套规范,用来表示.操作集合,使具体操作与实现细节解耦. 其实说白了,可以把一个集合看成一个微型数据库,操作不外乎"增删改查"四种操作,我们在学习使用一个具体的集合类时,需要把这四个操作的时空复杂度弄清楚了,基本上就可以说掌握这个类了. 设计理念 主要理念用一句话概括就是:提供一套"小而美"的API.API需要对

java中的集合框架

由于数组具有属性单一,长度不可改变的缺点,于是在程序中我们使用集合来代替它. 集合中不可放入基本数据类型,基本数据类型都是通过自动拆包和自动装箱功能才能放入和取出集合. 分类:Collection接口和Map接口 Collection:存放单一值元素,又可分为list接口类型和set接口类型 list接口类型:存放元素是有序的可重复的,可通过循环来取出其中的元素,实现类ArrayList() set接口类型:hash值排列,存放元素是无序不可重复的,通过指针取出其中元素,实现类HashSet()

JAVA集合框架

收藏 查看我的收藏 146有用+1 56 编辑 Java,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称.用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台.动态的Web.Internet计算.从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器现在均支持Java applet.集合框架是为表示和操作集合而规定的一种统一的标准的体系结构.任何集合框架都包含三大块内容:对外的接口.接口的实