java 容器深入研究之使用Abstract类定制

package org.rui.collection3.map;

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;

/***
 * 集合
 * 使用Abstract类
 *
 * @author lenovo
 *
 */
public class Countries
{
	public static final String[][] DATA =
	{
			// Africa
			{ "A", "a" },
			{ "B", "b" },
			{ "C", "c" },
			{ "D", "d" },
			{ "E", "e" },
			{ "F", "f" },
			{ "G", "g" },
			{ "H", "h" },
			{ "I", "i" },
			{ "J", "j" },
			{ "K", "k" },
			{ "L", "l" },
			{ "M", "m" },
			{ "N", "n" },
			{ "O", "o" },
			{ "P", "p" },
			{ "Q", "q" } };

	private static class FlyweightMap extends AbstractMap<String, String>
	{

		private static class Entry implements Map.Entry<String, String>
		{
			int index;

			Entry(int index)
			{
				this.index = index;
			}

			@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();
			}

			public int hashCode()
			{
				return index;
			}

			public boolean equals(Object o)
			{
				return DATA[index][0].equals(o);
			}
		}

		// use abstractset by implementing size & iterator 通过实现尺寸& iterato使用套抽象
		static class EnterSet extends AbstractSet<Map.Entry<String, String>>
		{
			private int size;

			EnterSet(int size) // 享元部分 只存储它的索引 而不是实际的健和值
			{
				if (size < 0)
				{
					this.size = 0;
				} else if (size > DATA.length)
				{
					this.size = DATA.length;
				} else
				{
					this.size = size;
				}
			}

			@Override
			public int size()
			{
				return size;
			}

			private class Iter implements Iterator<Map.Entry<String, String>>
			{
				// 每个迭代器只有一个条目对象
				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;
				}

				@Override
				public void remove()
				{
					throw new UnsupportedOperationException();

				}
			}

			@Override
			public Iterator<java.util.Map.Entry<String, String>> iterator()
			{

				return new Iter();
			}

		}

		//
		public static Set<java.util.Map.Entry<String, String>> entries = new EnterSet(
				DATA.length);

		@Override
		public Set<java.util.Map.Entry<String, String>> entrySet()
		{

			return entries;
		}

	}

	// create a partial map of size countries 创建一个部分大小国家的地图
	static Map<String, String> select(final int size)
	{
		return new FlyweightMap()
		{
			@Override
			public Set<java.util.Map.Entry<String, String>> entrySet()
			{

				return new FlyweightMap.EnterSet(size);
			}
		};
	}

	static Map<String, String> map = new FlyweightMap();

	public static Map<String, String> capitals()
	{
		return map;
	}

	public static Map<String, String> capitals(int size)
	{
		return select(size);// a partial map
	}

	static List<String> names = new ArrayList<String>(map.keySet());

	// all the names;
	public static List<String> names()
	{
		return names;
	}

	// A partial list
	public static List<String> names(int size)
	{
		return new ArrayList<String>(select(size).keySet());
	}

	/********************main******************************/
	public static void main(String[] args)
	{
		System.out.println(capitals(10));
		System.out.println(names(10));
		System.out.println(new HashMap<String, String>(capitals(3)));
		System.out.println(new TreeMap<String, String>(capitals(3)));
		System.out.println(new LinkedHashMap<String, String>(capitals(3)));
		System.out.println(new Hashtable<String, String>(capitals(3)));

		System.out.println(new HashSet<String>(names(6)));
		System.out.println(new TreeSet<String>(capitals(6).keySet()));
		System.out.println(new LinkedHashSet<String>(names(6)));
		// System.out.println(new Hashtable<String, String>(capitals(3)));

		System.out.println(new ArrayList<String>(names(6)));
		System.out.println(new LinkedList<String>(names(6)));

		System.out.println(capitals().get("F"));

	}

}
/**
output:
{A=a, B=b, C=c, D=d, E=e, F=f, G=g, H=h, I=i, J=j}
[A, B, C, D, E, F, G, H, I, J]
{A=a, B=b, C=c}
{A=a, B=b, C=c}
{A=a, B=b, C=c}
{A=a, C=c, B=b}
[D, E, F, A, B, C]
[A, B, C, D, E, F]
[A, B, C, D, E, F]
[A, B, C, D, E, F]
[A, B, C, D, E, F]
f
*/

package org.rui.collection3.map;

import java.util.AbstractList;

/***
 * 它可以具有任意尺寸,并且用Integer数据 有效的 进行了预初始化
 * @author lenovo
 *
 */
public class CountingIntegerList extends AbstractList<Integer>
{
	private int size;

	public CountingIntegerList(int size){
		this.size=size<0?0:size;
	}

	@Override
	public Integer get(int index)
	{
		return Integer.valueOf(index);
	}

	@Override
	public int size()
	{
		return size;
	}

	public static void main(String[] args)
	{
		System.out.println(new CountingIntegerList(30));
	}

}
/**output:
 * [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
 *  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]

 * */

package org.rui.collection3.map;

import java.util.AbstractMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
/**
 * 这里使用的是LinkedHashSet,而不是定制的Set类,因此享元未完全实现
 * @author lenovo
 *
 */
public class CountingMapData extends AbstractMap<Integer, String>
{

	private int size;
	private static String[] chars = "A B C D E F G".split(" ");

	public CountingMapData(int size)
	{
		if (size < 0)
			this.size = 0;
		this.size = size;
	}

	private static class Entry implements Map.Entry<Integer, String>
	{

		private int index;

		Entry(int index)
		{
			this.index = index;
		}

		@Override
		public Integer getKey()
		{
			return index;
		}

		@Override
		public String getValue()
		{
			return chars[index % chars.length]
					+ Integer.toString(index / chars.length);
		}

		@Override
		public String setValue(String value)
		{
			throw new UnsupportedOperationException();
		}

		@Override
		public boolean equals(Object obj)
		{
			return Integer.valueOf(index).equals(obj);
		}

		@Override
		public int hashCode()
		{

			return Integer.valueOf(index).hashCode();
		}
	}

	@Override
	public Set<java.util.Map.Entry<Integer, String>> entrySet()
	{
		// linedhashset 保留初始化顺序
		Set<Map.Entry<Integer, String>> entries = new LinkedHashSet<Map.Entry<Integer, String>>();
		for (int i = 0; i < size; i++)
		{
			entries.add(new Entry(i));
		}

		return entries;
	}

	public static void main(String[] args)
	{
		System.out.println(new CountingMapData(60));
	}

}
/**
 * {0=A0, 1=B0, 2=C0, 3=D0, 4=E0, 5=F0, 6=G0, 7=A1,
 * 8=B1, 9=C1, 10=D1, 11=E1, 12=F1, 13=G1, 14=A2, 15=B2,
 * 16=C2, 17=D2, 18=E2, 19=F2, 20=G2, 21=A3, 22=B3, 23=C3,
 *  24=D3, 25=E3, 26=F3, 27=G3, 28=A4, 29=B4, 30=C4, 31=D4,
 *  32=E4, 33=F4, 34=G4, 35=A5, 36=B5, 37=C5, 38=D5, 39=E5,
 *   40=F5, 41=G5, 42=A6, 43=B6, 44=C6, 45=D6, 46=E6, 47=F6,
 *   48=G6, 49=A7, 50=B7, 51=C7, 52=D7, 53=E7, 54=F7, 55=G7,
 *   56=A8, 57=B8, 58=C8, 59=D8}

 * */
时间: 2024-08-19 20:12:02

java 容器深入研究之使用Abstract类定制的相关文章

Thinking in Java:容器深入研究

1.虚线框表示Abstract类,图中大量的类的名字都是以Abstract开头的,它们仅仅是部分实现了特定接口的工具,因此创建时能够选择从Abstract继承. Collections中的实用方法:挑几个经常使用的: 1. reverse(List):逆转次序 2. rotate(List,int distance)全部元素向后移动distance个位置,将末尾元素循环到前面来(用了三次reverse) 3.sort(List,Comparator) 排序,可依照自己的Comparator 4.

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

java中的abstract类

Abstract是Java中的一个重要关键字,可以用来修饰一个类或者一个方法.修饰一个方法时,表示该方法只有特征签名(signature),没有具体实现,而是把具体实现留给继承该类的子类.一个类中只要有一个abstract方法,那么这个类就要被声明为abstract,但是其中可以有非abstract方法.abstract类可以使得类的设计者能够创建方法的原型,而真正的实现留给使用这个类的人.继承一个abstract类的子类,要么实现父类的所有abstract方法,要么也声明为abstract类,

java中请给一个Abstract类实现接口的实例!

2.Abstract类实现接口 (视频下载) (全部书籍) 马克-to-win:如果实现某接口的类是abstract类,则它可以不实现该接口所有的方法.但其非abstract的子类中必须拥有所有抽象方法的实在的方法体:(当然它abstract爹的也算作是它的) If a class implements an interface, it must implement all of its methods in the interface, otherwise, this class must b

java容器的两大类Collection和Map

java容器包括Collection和Map两种,Collection储存着对象的集合,而Map储存着键值对(两个对象)的映射表. Collection: 1)Set ·TreeSet ·HashSet ·LinkedHashSet 2)List ·ArrayList(基于动态数组实现,线程不安全) ·Vector (线程安全的,同步的,开销必ArrayList大,访问速度更忙.Vector 每次扩容请求其大小的 2 倍空间,而 ArrayList 是 1.5 倍) ·LinkedList(基于

容器深入研究 --- 散列与散列码(一)

通常的: 当标准类库中的类被作用HashMap的键.它用的很好,因为它具备了键所需的全部性质. 当你自己创建用作HashMap的键的类,有可能会忘记在其中放置必须的方法,而这时通常会犯的一个错误. 例如:考虑一个天气系统,将Groundhog对象与Prediction对象联系起来. class Groundhog { protected int number; public Groundhog(int n) { number = n; } public String toString() { r

容器深入研究 --- 散列与散列码(二)

为速度而散列: SlowMap.java说明了创建一个新的Map并不困难.但正如它的名称SlowMap所示,它不会很快,如果有更好的选择就应该放弃它.它的问题在于对键的查询,键没有按照任何特定的顺序保存,所以只能使用简单的线性查询,而线性查询是最慢的查询方式. 散列的价值在于速度: 散列使得查询得以快速进行.由于瓶颈在于键的查询速度,因此解决方案之一就是保持键的排序状态,然后使用Collections.binarySearch()进行查询. 散列则更进一步,它将键保存在某处,以便能够很快的找到.

容器深入研究 --- 理解Map

通常的: 映射表(也称关联数组)的基本思想是它维护的键-值(对)关联,因此你可以使用键来查找值. 标准的Java类库中包含了Map的几种实现,包括:HashMap,TreeMap,LinkedHashMap,WeakHashMap,ConcurrentHashMap,IdentityHashMap. 它们都有同样的基本接口Map,但是行为特性各不相同,这表现在效率.键值对的保存及呈现次序.对象的保存周期.映射表如何在多线程程序中工作的判定"键"等价的策略方面.Map接口实现的数量应该让

Java输入、输入、IO流 类层次关系梳理

Java输入.输入.IO流 类层次关系梳理 本文主要关注在Java编程中涉及到的IO相关的类库.方法.以及对各个层次(抽线.接口继承)的流之间的关系进行梳理 相关学习资料 http://baike.baidu.com/view/1007958.htm?noadapt=1 http://blog.csdn.net/hguisu/article/details/7418161 https://www.ibm.com/developerworks/cn/java/j-lo-javaio/ http:/