第七章。容器和泛型

首先说说容器类,Collection是容器类的根接口,List、Set、Queue是它的直接子接口。[color=red]List类型允许加入重复对象,Set类型不允许加入重复对象[/color]。Map接口没有继承Collection接口,它的[color=red]键对象不可重复,值对象可重复[/color],是一对一关系。
Set不接受重复的元素,所谓[color=red]重复是指e1.equals(e2),[/color]就称e1和e2是重复元素。Set的实现类有HashSet、TreeSet、LinkedHashSet,子接口是SortSet,TreeSet就是实现了这个接口。HashSet会调用对象的hashCode()方法来获取哈希码,然后根据这个哈希码进一步计算出对象在容器中的存放位置,所以具有很好的存取和查找性能。TreeSet可以对容器中的对象进行排序,默认使用自然排序(使用自然排序时,只能向TreeSet容器加入同类型的对象),也可以实现Comparable接口,使用compareTo()方法来进行排序,x.compareTo(y):如果返回值为0,则表示x和y相等;如果返回值大于0,表示x>y。指定排序:java.util.Comparator<Type>接口提供具体的排序方式,<type>指定被比较的对象的类型,Comparator接口的compare(T o1,To2)方法用来比较两个对象的大小。
List像数组一样也能建立数字索引与对象的关联,表达的是数据结构中线性表的概念,容器中允许存放重复对象,List接口的常用实现类有:ArrayList和LinkedList.
ArrayList代表长度可变的数组,允许对[color=red]元素进行随机的快速访问,但是向其中插入和删除的速度较慢[/color]。ArrayList是线程不安全的,若要成为线程安全,可用:List list=Collections.synchronizedList(new ArrayList());LinkedList在内部是采用[color=red]双向循环链表[/color]实现的,[color=red]插入和删除元素的速度较快,随机访问速度则较慢[/color],LinkedList可以作为[color=red]堆栈、队列、双向队列[/color]来使用,同样,LinkedList也是线程不安全的。
Map(映射)是一种把键对象和值对象进行映射的集合,而值对象仍可以是Map类型,这样就可以形成多级[color=red]映射。HashMap是Map接口的实现类,[color=red]允许使用null键和null值[/color]。迭代collection视图所需的时间与HashMap实例的“容量”及其大小(键值映射关系数)之和成比例[/color],所以,如果迭代性能很重要,则不要将初始容量设置得太高或将加载因子设置得太低。
HashMap的实例有两个参数影响其性能:[color=red]初始容量和加载因子[/color]。加载因子是哈希表在其容量自动增加之前[color=red]可以达到多满[/color]的一种尺度。[color=red]当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行rehash操作(重建内部数据结构),[/color]从而哈希表将具有[color=red]大约两倍的桶数[/color],默认的加载因子是0.75。可能你会想到把加载因子设置高点,但这虽然减少了空间开销,但也同时增加了查询成本。在设置初始容量时应该考虑到映射中所需的条目数及其加载因子,以便最大限度地减少rehash操作次数。如果有很多映射关系要存储在HashMap实例中,则相对于按需执行自动rehash操作以增大表的容量来说,使用足够大的初始容量创建它将使得映射关系能更有效地存储。同样,HashMap也不是线程安全的。 TreeMap实现了SortedMap接口,可以确保键处于排序状态,有些方法比较特殊:firstKey():返回第一个键,lastKey,subMap(fromKey,toKey):生成此Map的子集。tailMap(fromKey):生成此Map的子集,由键大于或等于fromKey的所有键值组成。
接着到泛型,泛型实现了参数化类型的概念,这个术语的意思是“适用于许多种的类型”,目的是希望类或方法能够具备最广泛的表达能力。
泛型用于容器类中可以在[color=red]编译期对容器中的类型进行类型检查[/color],加入或取出都不用强制转换。
在泛型类中可以使用通配符(?)和受限通配符(extends、super)。extends限制其类型必须是extends后面的类或接口的子类或实现类(接口),如:A<? extends List> a=new A<ArrayList>();。super则限制其类型必须是super后面的类的父类。如:A<? super LinkedHashSet> a=new A<HashSet>();(HashSet是LinkedHashSet的父类)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值