简单总结一下java中的容器----持有对象

在java中为我们提供了大量的持有对象的方法,这些方法可以是我们的程序看起来更简洁,更强大,更高效。好了,闲话不说,接下来我们就简单的总结一下java中的持有对象都有哪些。。。

(1)数组,数组将数字和对象联系起来,它保存类型明确的对象,查询对象时,不需要对结果做类型转换。它可以是多维的,可以保存基本类型的数据,但是数据一旦生成,其容量就不能被改变。

(2)Collection保存单一的元素,而Map保存相关联的键值对。有了java的泛型,你就可以指定容器中存放的对象的类型,因此你就不会将错误类型的对象放置到容器中,并且从容器中获取元素时,不必进行类型转换。各种Collection和各种Map都可以在你向其中添加更多元素时,自动调整其尺寸。容器不能持有基本类型,但自动包装机制可以执行基本类型到容器中所持有的包装器类型之间的双向转换。

(3)List类似数组,也是建立数字索引和对象的关联,因此,数组和List都是排好序的容器,List能够自动扩充容量。

(4)如果需要大量的随机访问时,那就需要建立ArrayList,如果需要大量的对元素进行插入,删除操作,那就需要建立LinkedList。

(5)各种Queue和栈的操作,都可以用LinkedList提供支持,也就是说用LinkedList可以创建出一个Queue或者栈。

(6)Map是一种将对象与对象进行相关联的设计。HashMap设计用来快速访问,TreeMap保持“键”始终处于排序的状态,所以没有HashMap快,LinkedHashMap保持元素插入时的顺序,但是也是通过hash函数提供快速的访问能力。

(7)Set是不接受重复元素的集合。HashSet提供最快的查询速度,TreeSet保持元素处于字典排序的状态,LinkedHashSet保持元素插入时的顺序。

(8)新程序中不应该使用过时的集合,比如,Vector,HashTable和Stack。


==============================================值得注意的是Collection和Iterator==========================================

(1)我们要明白Collection是所有序列容器的共性的根接口。使用接口去描述的一个理由就是可以使我们能够创建更通用的代码出来。一个类去实现Collection时,必须要提供iterator()的方法,因为,Collection和Iterator是绑定在一起的。然而,java提供了java.util.AbstractCollection类提供了Collection的默认实现,使得我们可以创建一个AbstractCollection的子类型。

举个例子:

public class NJQ4 extends AbstractCollection<String>{
	private String[] s = ("la la de ma xi ya"+"sa sa ai ou ni ya").split(" ");
	
	public static void display(Iterator<String> it){
		while(it.hasNext())
			System.out.print(it.next());
	}
	
	public static void main(String[] args) {
		NJQ4 njq = new NJQ4();
		display(njq.iterator());
	}

	@Override
	public Iterator<String> iterator() {
		
		return new Iterator<String>() {
			private int index = 0;
			public boolean hasNext(){
				return index < s.length;
			}
			public String next(){
				return s[index++];
			}
			@Override
			public void remove() {
				throw new UnsupportedOperationException();
			}
		};
	}

	@Override
	public int size() {
		
		return s.length;
	}

}
通过迭代器对字符串数组进行打印输出。

(2)让foreach对任何Collection对象进行应用,可以通过是想Iterator的接口,这个接口包含一个能够产生Iterator的iterator()方法,并且Iterator接口被foreach用来在序列中移动。

举个例子:

public class NJQ5 implements Iterable<String>{
	private String[] s = ("la la de ma xi ya, sa sa sa ai ou ni ya").split(" ");
	
	public static void main(String[] args) {
		NJQ5 njq = new NJQ5();
		for(String str : njq.s)
			System.out.print(str);
	}

	@Override
	public Iterator<String> iterator() {
		
		return new Iterator<String>(){
			private int index = 0;
			@Override
			public boolean hasNext() {
				
				return index < s.length;
			}

			@Override
			public String next() {
				
				return s[index++];
			}

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

}
最后,思考一下:怎样通过适配器的方法,产生一个反向迭代器的能力???下次我们再说这个!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值