Java集合(3):使用Abstract类
每个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类的更多相关文章
- Java集合框架(常用类) JCF
Java集合框架(常用类) JCF 为了实现某一目的或功能而预先设计好一系列封装好的具有继承关系或实现关系类的接口: 集合的由来: 特点:元素类型可以不同,集合长度可变,空间不固定: 管理集合类和接口 ...
- Java最重要的21个技术点和知识点之JAVA集合框架、异常类、IO
(三)Java最重要的21个技术点和知识点之JAVA集合框架.异常类.IO 写这篇文章的目的是想总结一下自己这么多年JAVA培训的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享 ...
- Java集合中的LinkedHashMap类
jdk1.8.0_144 本文阅读最好先了解HashMap底层,可前往<Java集合中的HashMap类>. LinkedHashMap由于它的插入有序特性,也是一种比较常用的Map集合. ...
- 【JAVA集合框架之工具类】
一.概述 JAVA集合框架中有两个很重要的工具类,一个是Collections,另一个是Arrays.分别封装了对集合的操作方法和对数组的操作方法,这些操作方法使得程序员的开发更加高效. public ...
- JAVA集合四:比较器--类自定义排序
参考链接: HOW2J.CN 前言 对于JAVA集合,都能够用集合的工具类Collections 提供的方法: Collections.sort(List list) Collections.sort ...
- java集合(1)- 类底层数据结构分析
Java 集合类图 参考:http://www.cnblogs.com/xwdreamer/archive/2012/05/30/2526822.html
- Java集合中的HashMap类
jdk1.8.0_144 HashMap作为最常用集合之一,继承自AbstractMap.JDK8的HashMap实现与JDK7不同,新增了红黑树作为底层数据结构,结构变得复杂,效率变得更高.为满足自 ...
- 1、java集合:java集合详解及类关系图
List和Set继承自Collection接口. Set无序不允许元素重复.HashSet和TreeSet是两个主要的实现类. List有序且允许元素重复,支持null对象.ArrayList.Lin ...
- Java技术——Interface与abstract类的区别
)抽象类是对类抽象,是面向整个类的自下而上的设计理念,一般是先有各种子类,再有把这些有关系的子类加以抽象为父类的需求.而接口是对行为的抽象,是面向行为的自上而下的设计理念,接口根本就不需要知道子类的存 ...
- Java 集合源码解析(1):Iterator
Java, Android 开发也有段时间了,当初为了早点学 Android,Java 匆匆了解个大概就结束了,基础不够扎实. 虽然集合框架经常用,但是一直没有仔细看看原理,仅止于会用,不知道为什么要 ...
随机推荐
- Python之datetime模块
datatime模块重新封装了time模块,提供更多接口,提供的类有:date,time,datetime,timedelta,tzinfo. 1.date类 datetime.date(year, ...
- HTML中dl元素的高度问题
dl元素通常用来创建一个描述列表,但是在我使用的过程中发现了一个小问题. 定义及用法 在MDN中 <dl> 元素的定义是:一个包含术语定义以及描述的列表,通常用于展示词汇表或者元数据 (键 ...
- OBDSTAR X300 PRO3详细评论
OBDSTAR 公司的X300 PRO3钥匙主控系统具有SKP900的防盗锁钥匙编程功能,以及新功能,例如,测速计调节,EEPROM / PIC和OBDII.它的风格完全符合工业惯例,例如,它采用双边 ...
- demo(一) react-native-router-flux
react-native init AwesomeProject cd AwesomeProject 安装模块 npm i react-native-router-flux --save
- bbs-admin-自定义admin(一)
自定义admin 概要:django-admin本质就是一个app,只是Django内部分装了,因此我们尝试自己设计一个简易版的admin 设计前知识补充: model._meta.app_label ...
- jQuery系列(三):jQuery动画效果
jQuery提供的一组网页中常见的动画效果,这些动画是标准的.有规律的效果:同时还提供给我们了自定义动画的功能. 1.显示动画 方式一: $("div").show(); 解释:无 ...
- Codeforces 1009 E. Intercity Travelling(计数)
1009 E. Intercity Travelling 题意:一段路n个点,走i千米有对应的a[i]疲劳值.但是可以选择在除终点外的其余n-1个点休息,则下一个点开始,疲劳值从a[1]开始累加.休息 ...
- 2017 ZSTU寒假排位赛 #6
题目链接:https://vjudge.net/contest/149212#overview. A题,水题,略过. B题,水题,读清题意即可. C题,数学题,如果把x表示成x=nb+m,则k=n/m ...
- Java后台开发精选知识图谱
1.引言: 学习一个新的技术时,其实不在于跟着某个教程敲出了几行.几百行代码,这样你最多只能知其然而不知其所以然,进步缓慢且深度有限,最重要的是一开始就对整个学习路线有宏观.简洁的认识,确定大的学习方 ...
- legend3---11、php前端模块化开发
legend3---11.php前端模块化开发 一.总结 一句话总结: 把常用的前端块(比如课程列表,比如评论列表)放进模块列表里面,通过外部php变量给数据,可以很好的实现复用和修改 页面调用 @p ...