每个java.util容器都有其自己的Abstract类,它们提供了该容器接口的部分实现。下面是一个定制自己的Map的例子(List set就省略了):

定制自己的Map实现AbstractMap-->Map,需要实现[Set<Map.Entry<K,V>> entrySet()]方法

实现[Set<Map.Entry<K,V>> entrySet()]方法分两步:

(1) 实现Set<E>接口

(2) 实现Map.Entry<K,V>接口

 import java.util.AbstractMap;
import java.util.AbstractSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet; class Countries {
public static final String[][] DATA = {
// Africa
{ "SOUTH AFRICA", "Cape Town" }, { "SUDAN", "Khartoum" },
// Asia
{ "CHINA", "Beijing" }, { "JAPAN", "Tokyo" }, { "SOUTH KOREA", "Seoul" },
// Australia and Oceania
{ "AUSTRALIA", "Canberra" }, { "NEW ZEALAND", "Wellington" },
// Europe
{ "UNITED KINGDOM", "London" }, { "FRANCE", "Paris" }, { "GERMANY", "Berlin" }, { "ITALY", "Rome" },
{ "SPAIN", "Madrid" },
// North and Central America
{ "UNITED STATES OF AMERICA", "Washington, D.C." }, { "CANADA", "Ottawa" },
// South America
{ "BRAZIL", "Brasilia" }, { "ARGENTINA", "Buenos Aires" } }; private static class FlyweightMap extends AbstractMap<String, String> { private final int dataLength; private static Set<Map.Entry<String, String>> entries = new EntrySet(DATA.length); public FlyweightMap() {
dataLength = 0;
} public FlyweightMap(int dataLength) {
this.dataLength = dataLength;
} @Override
public Set<Map.Entry<String, String>> entrySet() {
if (dataLength > 0) {
return new EntrySet(dataLength);
}
return entries;
} // (1) 实现Set<E>接口
// 定制自己的Set实现AbstractSet(AbstractCollection)-->Set, 需要实现[Iterator<E> iterator() & int size()]方法
private static class EntrySet extends AbstractSet<Map.Entry<String, String>> {
private int size; EntrySet(int size) {
this.size = size < 0 ? (this.size = 0)
: (size > DATA.length ? (this.size = DATA.length) : (this.size = size));
} @Override
public int size() {
return size;
} @Override
public Iterator<Map.Entry<String, String>> iterator() {
return new Iterator<Map.Entry<String, String>>() {
// Only one Entry object per Iterator:
private Entry entry = new Entry(-1); @Override
public boolean hasNext() {
return entry.index < size - 1;
} @Override
public java.util.Map.Entry<String, String> next() {
entry.index++;
return entry;
}
};
}
} // (2) 实现Map.Entry<K,V>接口
// 定制自己的Map.Entry实现Map.Entry<K, V>接口, 需要实现下面的方法
// 每个Map.Entry对象都只存了它们的索引,而不是实际的键值。当调用getKey(), getValue()时,才会用索引返回恰当的元素
private static class Entry implements Map.Entry<String, String> {
int index; Entry(int index) {
this.index = index;
} @Override
public boolean equals(Object o) {
return DATA[index][0].equals(o);
} @Override
public String getKey() {
return DATA[index][0];
} @Override
public String getValue() {
return DATA[index][1];
} @Override
public String setValue(String value) {
throw new UnsupportedOperationException();
} @Override
public int hashCode() {
return DATA[index][0].hashCode();
}
}
} // 取Map全部内容
public static Map<String, String> capitals() {
return selectAll();
} // 取Map全部内容的key
public static List<String> names() {
return new ArrayList<String>(capitals().keySet());
} // 取Map部分内容
public static Map<String, String> capitals(final int size) {
return select(size);
} // 取Map部分内容的key
public static List<String> names(int size) {
return new ArrayList<String>(select(size).keySet());
} private static Map<String, String> selectAll() {
return new FlyweightMap();
} private static Map<String, String> select(final int size) {
return new FlyweightMap(size);
}
} public class Test4 {
public static void main(String[] args) {
System.out.println(Countries.capitals(5)); // {SOUTH AFRICA=Cape Town, SUDAN=Khartoum, CHINA=Beijing, JAPAN=Tokyo, SOUTH KOREA=Seoul}
System.out.println(Countries.names(5)); // [SOUTH AFRICA, SUDAN, CHINA, JAPAN, SOUTH KOREA]
System.out.println(new HashMap<String, String>(Countries.capitals(3))); // {SUDAN=Khartoum, CHINA=Beijing, SOUTH AFRICA=Cape Town}
System.out.println(new LinkedHashMap<String, String>(Countries.capitals(3))); // {SOUTH AFRICA=Cape Town, SUDAN=Khartoum, CHINA=Beijing}
System.out.println(new TreeMap<String, String>(Countries.capitals(3))); // {CHINA=Beijing, SOUTH AFRICA=Pretoria/Cape Town, SUDAN=Khartoum}
System.out.println(new Hashtable<String, String>(Countries.capitals(3))); // {SUDAN=Khartoum, SOUTH AFRICA=Pretoria/Cape Town, CHINA=Beijing}
System.out.println(new HashSet<String>(Countries.names(4))); // [SUDAN, CHINA, SOUTH AFRICA, JAPAN]
System.out.println(new LinkedHashSet<String>(Countries.names(4))); // [SOUTH AFRICA, SUDAN, CHINA, JAPAN]
System.out.println(new TreeSet<String>(Countries.names(4))); // [CHINA, JAPAN, SOUTH AFRICA, SUDAN]
System.out.println(new ArrayList<String>(Countries.names(4))); // [SOUTH AFRICA, SUDAN, CHINA, JAPAN]
System.out.println(new LinkedList<String>(Countries.names(4))); // [SOUTH AFRICA, SUDAN, CHINA, JAPAN]
System.out.println(Countries.capitals().get("BRAZIL")); // Brasilia
}
}

Java集合(3):使用Abstract类的更多相关文章

  1. Java集合框架(常用类) JCF

    Java集合框架(常用类) JCF 为了实现某一目的或功能而预先设计好一系列封装好的具有继承关系或实现关系类的接口: 集合的由来: 特点:元素类型可以不同,集合长度可变,空间不固定: 管理集合类和接口 ...

  2. Java最重要的21个技术点和知识点之JAVA集合框架、异常类、IO

    (三)Java最重要的21个技术点和知识点之JAVA集合框架.异常类.IO  写这篇文章的目的是想总结一下自己这么多年JAVA培训的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享 ...

  3. Java集合中的LinkedHashMap类

    jdk1.8.0_144 本文阅读最好先了解HashMap底层,可前往<Java集合中的HashMap类>. LinkedHashMap由于它的插入有序特性,也是一种比较常用的Map集合. ...

  4. 【JAVA集合框架之工具类】

    一.概述 JAVA集合框架中有两个很重要的工具类,一个是Collections,另一个是Arrays.分别封装了对集合的操作方法和对数组的操作方法,这些操作方法使得程序员的开发更加高效. public ...

  5. JAVA集合四:比较器--类自定义排序

    参考链接: HOW2J.CN 前言 对于JAVA集合,都能够用集合的工具类Collections 提供的方法: Collections.sort(List list) Collections.sort ...

  6. java集合(1)- 类底层数据结构分析

    Java 集合类图 参考:http://www.cnblogs.com/xwdreamer/archive/2012/05/30/2526822.html

  7. Java集合中的HashMap类

    jdk1.8.0_144 HashMap作为最常用集合之一,继承自AbstractMap.JDK8的HashMap实现与JDK7不同,新增了红黑树作为底层数据结构,结构变得复杂,效率变得更高.为满足自 ...

  8. 1、java集合:java集合详解及类关系图

    List和Set继承自Collection接口. Set无序不允许元素重复.HashSet和TreeSet是两个主要的实现类. List有序且允许元素重复,支持null对象.ArrayList.Lin ...

  9. Java技术——Interface与abstract类的区别

    )抽象类是对类抽象,是面向整个类的自下而上的设计理念,一般是先有各种子类,再有把这些有关系的子类加以抽象为父类的需求.而接口是对行为的抽象,是面向行为的自上而下的设计理念,接口根本就不需要知道子类的存 ...

  10. Java 集合源码解析(1):Iterator

    Java, Android 开发也有段时间了,当初为了早点学 Android,Java 匆匆了解个大概就结束了,基础不够扎实. 虽然集合框架经常用,但是一直没有仔细看看原理,仅止于会用,不知道为什么要 ...

随机推荐

  1. 如何通过字符串形式导包(importlib模块的使用)

    1 模块简介 Python提供了importlib包作为标准库的一部分.目的就是提供Python中import语句的实现(以及__import__函数).另外,importlib允许程序员创建他们自定 ...

  2. anguar @input绑定的属性变化

    Intercept @Input property change in Angular Bharat TiwariFollow Mar 15, 2018 this post is good for A ...

  3. fonts/font-awesome-woff2 404问题

    报错环境: vue 开发的项目 npm 引入的font-awesome, 页面正常显示,就是控制台会报这个错误 产生原因:因为服务器IIS不认SVG,WOFF/WOFF2 这几个文件类型,只要在IIS ...

  4. 完整开发vue后台管理系统小结

    最近业余帮朋友做两个vue项目,一个是面向用户纯展示系列的(后统称A项目),一个是后端管理系统类的(后统称B项目).两者在技术上都没难度,这里对开发过程遇到的问题.取舍等做一个小节. 关于项目搭建 目 ...

  5. css居然有根据容器宽度自动截取长度加省略号功能,强大!!

    作者:☆威廉古堡♂ 项目中最初的做法(js截取): //字符长度截取包括中英文混合 function subStr(str, len) { str = str.toString(); var newL ...

  6. Clone failed: Could not read from remote repository

    问题: 使用idea下载项目代码时报错,内容如下: Clone failed: Could not read from remote repository 解决方案: 把 SSH切换成 HTTP重新c ...

  7. 014_linuxC++之_不同类型的继承

    #include <iostream> #include <string.h> #include <unistd.h> using namespace std; c ...

  8. Financial Management(SDUT 1007)

    Problem Description Larry graduated this year and finally has a job. He's making a lot of money, but ...

  9. gitlab使用指南

    gitlab是公司内部搭建的用于管理代码项目的类似于github的系统. 登录注册 注册时使用的名称和邮箱请按照公司内部格式进行信息填写. 在注册完成以后有可能会向邮箱里发送一个注册邮件,如果要求发送 ...

  10. log4j.properties log4j.xml 路径问题