第十一章 持有对象 导读

导读:

  • 如果一个程序只包含固定数量且生命周期都是已知的对象,那么这是一个非常简单的程序。
  • 问题所在:通常程序总是根据运行时才知道的某些条件去创建对象。在此之前,不会知道所需对象的数量,甚至不知道确切的对象类型。

    为了解决这个问题,需要在任意时刻和任意位置创建任意数量的对象。所以就不能依靠引用来持有每一个对象,因为数量可能会很多。
  • java有多种方式保存对象(应该是对象的引用)。例如数组,
    但数组具有固定的尺寸,更多的情况下并不知道需要多少个对象,如Android中的listview,这样数组就受到了限制。
  • java实用类库还提供了一套相当完整的容器类来解决这个问题,如List、Set、Queue、Map等。用来保存对象。
    可以将任意数量的对象放置到容器中去。
  • Java使用Collection这个名字来指代该类库的一个子集。

1.泛型和类型安全的容器

  • java se5之前容器是没有泛型的,以ArrayList为例,所有的都是ArrayList<Object>的,所以它允许向容器中插入任何类型的对象,
    这样做会有很多问题出现,进去的是详细的类型,而出来是确是Object的了,如果要使用就要强制类型转换,转换错了,程序就会
    抛出错误。
  • Java SE5 之后引入的了泛型,如果想容器中插入类型错误的对象,编译器会报告警告异常。如ArrayList<String> 插入int型数据。
  • 从一个List中get一个数据是并不需要转型,因为在调用list.get(position)时list已经执行了转型了
  • 容器中可以插入泛型的子类,允许向上转型,如ArrayList<Book> class Math extends Book 那么List<Book>也可以添加list.add(new Math())、

2.基本概念

  • Collection 及其子类(List Set Queue) Map及其子类将在容器中介绍。

3.添加一组元素(ArrayList.....子类的简单使用)

  • public class AddingGroup {
    	public static void main(String[] args) {
    		Collection<Integer> collection = 
    				new ArrayList<Integer>(Arrays.asList(1,2,3,4,5));
    		Integer[] moreInt = {6,7,8,9,10};
    		//添加数组到collection
    		collection.addAll(Arrays.asList(moreInt));
    		//将数组添加到collection后
    		Collections.addAll(collection, 11,12,13,14,15);
    		Collections.addAll(collection, moreInt);
    		List<Integer> list = Arrays.asList(1,2,3,4);
    	}
    }
    

4.显示类型参数说明

  • 这个bug在java 1.8的时候已经消除了
    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());
    		//这里在java 1.8之前asList方法会返回Light 和Heavy   List<Powder>的形式的list
    		List<Snow> snow2 = Arrays.asList(new Light(),new Heavy());
    		//需要这样才能解决上面的问题,这叫做“显式类型参数说明”
    		List<Snow> snow3 = Arrays.<Snow>asList(new Light(),new Heavy());
    		System.out.println(snow2.get(0));
    	}
    	
    }
    



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值