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