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 匆匆了解个大概就结束了,基础不够扎实. 虽然集合框架经常用,但是一直没有仔细看看原理,仅止于会用,不知道为什么要 ...
随机推荐
- 一些网站后台模板源码分析 Particleground.js 验证码
转: https://blog.csdn.net/bcbobo21cn/article/details/51271750 1 灰色简洁企业后台管理模板 效果: 看下项目结构: 它使用了moderniz ...
- 记录一下UILabel加载富文本 iOS
一般情况下我们都习惯用webview加载富文本.但是webview比较消耗内存.然后发现其实本身可以用uilabel加载,性能还不错就记录下~~ 核心方法下面两个 -(NSMutableAttribu ...
- cubemx+stm32串口学习汇总资料
这篇文章是串口中断的文章--STM32基于CubeMX的高速串口收发程序(中断模式)比较有帮助. http://www.stmcu.org.cn/module/forum/thread-616613- ...
- hbuilderX创建vue项目之添加router路由(前端萌新)
作为一个刚刚接触前端不久的新人来说,熟悉了一种目录结构或者项目创建方法以后,恨不得一辈子不会变! 可是人要生活,就要工作,既然是打工,当然要满足雇佣者的要求. 今天我来说说 hbuilderX 这个开 ...
- QT 设置应用程序图标和可执行程序图标
1, 首先准备个ICO图标.例如:myappico.ico 在工程目录下新建images文件夹并你的图标myappico.ico(只能用ico格式的图片)放到工程目录下的images文件夹下 2, 用 ...
- 深入了解java线程池(转载)
出处:http://www.cnblogs.com/dolphin0520/ 本文归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责 ...
- 【Android-ListView控件】显示信息
效果图 布局文件 layout - activity_main.xml 在主布局添加一个listview控件 <?xml version="1.0" encoding=&qu ...
- PHP实现省市区关键词搜索邮编
前两天做了一个项目, 其中有一个需求是根据用户输入的关键词查询邮编. 最开始设计的数据库结构是省市区分为三个字段, province, city, area, 但是在写代码实现的过程中发现, 用户只输 ...
- 最新版Google Chrome 自动加载flash插件的方法
我们在用Selenium做自动化测试时,有时候需要浏览器自动加载flash插件,69以前的谷歌浏览器,可以通过加载属性的方法自动运行flash插件,如下: prefs={ "profile. ...
- codeforces#1166F. Vicky's Delivery (Service并查集+启发式合并)
题目链接: https://codeforces.com/contest/1166/problem/F 题意: 给出节点数为$n$,边数为$m$的图,保证每个点对都是互连的 定义彩虹路:这条路经过$k ...