集合框架浅析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了集合框架浅析相关的知识,希望对你有一定的参考价值。

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

 

以上是关于集合框架浅析的主要内容,如果未能解决你的问题,请参考以下文章

Java学习入门-05 -集合浅析

Java8集合框架——集合工具类Collections内部方法浅析

浅析Minium,微信小程序自动化测试框架

浅析Java中的集合

006 Java集合浅析1

学习笔记-集合HashMap 源码浅析