第十一章:持有对象《thinking in Java》学习笔记

Java实用类库提供了一套相当完整的容器类,其中基本的类型是List,Set,Queue和Map。这些对象也被称作集合类,其提供了完善的方法来保存对象。

(1)泛型和类型安全的容器
一个类如果没有显式的声明继承与哪个类,那么它自动继承自Object类。因此假如有一个ArrayList,因为ArrayList保存的是Object类,因此你可以将Apple(自定义的类)放进这个容器中,还可以添加Orange对象,而且无论编译器还是运行期都不会有问题。当你在使用ArrayList的get()方法取出你认为是Apple的对象时,你得到的只是Object的引用,必须将其转型为Apple。因此引入泛型避免了这个麻烦。

(2)基本概念
Collection
java.util下的接口,是各种集合结构的父接口

这里写图片描述

有时为了通用性,会向上转型为Collection接口。
一些常用的方法:
add(Object obj):将指定对象添加到集合中
remove(Object obj):将指定对象从集合中移除
remove(int index):将指定位置对象从集合中移除
isEmpty():返回boolean值,用于判断集合是否为空
iterator():返回迭代器,用于遍历
size():返回int型值,即元素个数
contains(Object obj):判断是否包含此对象

List

由于List继承了Collection接口,因此Collection接口的方法仍试用
有两种类型的List:
一、ArrayList 比较常用与随机的访问元素,但在插入和删除操作时,工作效率比较慢。
二、LinkList 相对于ArrayList来说正好解决了他的问题,代价较低(比较廉价)的进行插入和删除工作,但随机访问的效率又会变低。
总之,他们是互补的,List在被创建之后仍可以添加,删除元素,可以自我调整尺寸,这正是他最大的魅力所在:一种可修改的序列。
一些常用的方法:
get(int index):获得指定索引位置的元素
set(int index ,Object obj):将指定位置的对象修改为指定的对象

Set

Set不保存重复的元素,如果你试图将一个类的多个实例添加到Set中的话,他会阻止你这样做。Set最常用的属性就是测试归属性,你可以很容易的判断一个对象是否在Set中,查询就成为了Set中最重要的操作,因此你通常都会选择HashSet来对查询进行优化。
出于对查询速度的原因,HashSet中的对象没有顺序可言,HashSet使用了散列。
一些常用方法:
first():返回Set中当前第一个元素
last():返回Set中当前最后一个元素
subSet(E fromElement,E fromElement):返回一个新的集合(左开右闭)

Map

将对象映射到其他对象的能力是解决问题的杀手锏。Map就是我们强大的编程工具,他有一组“键值对”的对象组成,允许你使用键来查找值。

import java.util.*;
 5 
 6 public class PrintingContainers {
 7     public static Collection fill(Collection<String> collection){
 8         collection.add("张三");
 9         collection.add("李四");
10         collection.add("王二");
11         collection.add("麻子");
12         return collection;
13     }
14     public static Map fill(Map<String, String> map){
15         map.put("张", "张三");
16         map.put("李", "李四");
17         map.put("王", "王二");
18         map.put("麻", "麻子");
19         return map;
20     }
21     public static void main(String[] args) {
22         System.out.println(fill(new ArrayList<String>()));
23         System.out.println(fill(new LinkedList<String>()));
24         System.out.println(fill(new HashSet<String>()));
25         System.out.println(fill(new TreeSet<String>()));
26         System.out.println(fill(new LinkedHashSet<String>()));
27         System.out.println(fill(new HashMap<String, String>()));
28         System.out.println(fill(new TreeSet<String>()));
29         System.out.println(fill(new LinkedHashMap<String, String>()));
30     }
31 
32 }

通俗的说吧,java容器类库有两种主要类型Collection和map,区别在于容器中的每个“槽”保存的元素个数:
  collection和旗下的list,Set,Queue都是每个槽一个元素;
  map和旗下的各种HashMap,TreeMap等都是一个槽两个元素(一个是key,一个是value),两者对应起来,像个简单的数据库;

其中collection接口继承自Iterable接口

public interface Collectionextends Iterable
而这个Iterable接口有一个方法,iterator iterator(),以匿名内部类的方式实现这个方法并返回一个继承了iterator接口的的子对象;
一些常用方法:
put(K key,V value):向集合中添加指定的映射关系
containsKey(Object key):如果集合包含指定key的映射关系,则返回true
containsValue(Object value):如果映射将一个或多个key映射到这个指定值,返回true
get(Object key):如果存在指定的key对象,返回该key对应的值,否则返回null
values():返回该集合中所有对象形成的Collection集合
Map与数组和其他Collection一样,可以扩展到多维,例如Map

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值