JAVA编程思想学习总结:第十一章持有对象

(1)基本概念

/*
 * P218
 */
import java.util.*;
class Apple{
	private static long counter;
	private final long id =counter++;
	public long id(){return id;}
}
class GrannySmith extends Apple{}
class Gala extends Apple{}
class Fuji extends Apple{}
class Braeburn extends Apple{}
public class GenericsAndUpcasting {
	public static void main(String[] args){
		ArrayList<Apple> apples = new ArrayList<Apple>();
		apples.add(new GrannySmith());
		apples.add(new Gala());
		apples.add(new Fuji());
		apples.add(new Braeburn());
		for(Apple c : apples)
			System.out.println(c);
	}
}
在ArrayList中,尖括号括起来的是类型参数()可以有多个,它指定了这个容器实例可以保存的类型。通过使用泛型,就可心在编译斯防止将错误类型的对象放置到容器中。
如果不需要使用每个元素的索引,可以使用foreach语法来选择List中的每个元素。
1)Collection。一个独立元素的序列,这些元素都服从一条或者多条规则。List必须按照插入的顺序保存元素,而Set不能有重复元素。Queue按照排除规则来确定对象产生的顺序(通常与它们被插入的顺序相同)。
2)Map。一组成对的"键值对"对象,允许你使用键来查找值。ArrayList允许你使用数字来查找值,因此在某种意义上讲,它将数字与对象关联在一起。映射表允许我们使用另一个对象来查找某个对象,它也被称为“关联数组”,因为它将某些对象与另外一些对象关联在了一起,这也被称为“字典”。
/*
 * P220-221
 */
import java.util.*;
class Snow{}
class Powder extends Snow{}
class Light extends Powder{}
class Heavy extends Powder{}
class Crusty extends Snow{}
class Slush extends Snow{}
public class AsListInference {
	public static void main(String[] args){
		List<Snow> snow1=Arrays.asList(new Crusty(),new Slush(),new Powder());
		//Won't compile:
		//List<Snow> snow2 =Arrays.asList( new Light(),new Heavy());
		//Compiler says:
		// fount :java.util.List<Powder>
		// required:java.util.List<Snow>
		// Collections.addAll() doesn't get confused:
		List<Snow> snow3=new ArrayList<Snow>();
		Collections.addAll(snow3, new Light(),new Heavy());
		//Give a hint using an
		//explicit type argument specification;
		List<Snow> snow4=Arrays.<Snow>asList(new Light(),new Heavy());
	}
}
Collection.addAll()方法运行起来要快得多,而且构建一个不包含元素的Collection,然后调用Collections.addAll()这种方式很方便,因此它是首选方式。
你也可以直接使用Array.asList()的输出,将其当作List,但是在这种情况下,其底层表示的是数组,因此不能调整尺寸。如果你试图用add()或delete()方法在这种列表中添加或删除元素,就有可能会引发去改变数组尺寸的尝试,这会导致Unsupported Operation错误。
List类型:ArrayList和LinkedList都是List类型。它们都按照被插入的顺序保存元素。
Set类型:HashSet,TreeSet和LinkedHashSet都是Set类型。每个相同的项只有保存一次。HashSet按一种复杂但最快获取元素的方式存储,TreeSet按比较结果升序保存对象,LinkedHashSet按照添加的顺序保存对象。
Map类型::按键值对来存储对象,其键和值都是对象并相关联。

(2)选代器

选代器模式:选代器是一个对象,它的工作是遍历并选择序列中的对象,而客户端程序员不必知道或关心该序列底层的结构。此外,选代器通常被称为轻量级对象:创建它的代价小。
import java.util.*;
import typeinfo.*;
/*
 * P226
 */
public class SimpleIteration {
	public static void main(String [] args){
		List<Pet> pets=Pets.arrayList(12);
		Iterator<Pet> it=pets.iterator();
		while(it.hasNext()){
			Pet p=it.next();
			System.out.print(p.id()+" :"+p+"");
		}
		System.out.println();
		//A simpler approach,when possible;
		for(Pet p:pets)
			System.out.print(p.id() +" :"+p+" ");
		System.out.println();
		//an Iterator can also remove elements;
		it=pets.iterator();
		for(int i=0;i<6;i++){
			it.next();
			it.remove();
		}
		System.out.println(pets);
	}
}
要注意的是,在此例中使用了foreach语句,该语句可以用于数组或其他任何Iterable,但是这并不意味着数组肯定也是一个Iterable,任何自动包装也不会发生。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值