《JAVA编程思想》读书笔记之一:持有对象

一、持有对象的基础知识

1、Java如何持有对象?

持有对象即对对象引用(一般有很多个)的保存和使用。Java有两种持有对象的方式:数组容器

数组将数字与对象联系起来以保存类型明确的对象。数组持有对象的优点是可以持有基本类型的数据,缺点是数组一旦生成,其容量就不能发生改变(无法在运行时即时持有任意数量的任意类型的对象),并且没有实现Iterable接口(这无关紧要,因为仍然可以使用foreach)。

容器分为Collection和Map两类,Collection持有序列数据,Map持有相关联的键值对。容器持有对象的优点是可以在向容器中增加元素时,自动调整其尺寸,缺点是无法持有基本类型的数据(但可以自动包装)。

2、容器及其继承结构

容器的简单的继承结构
在容器的简单的继承结构图中:实线框为类,虚线框为接口,空心箭头表示某个类实现了某个接口,实心箭头表示某个类可以生成箭头指向类的对象。
由图中可以看出,只看接口的话容器分为Collection和Map两类,其中Collection可以派生出List、Set、Queue这几个接口。

List可以由ArrayList或者LinkedLIst实现,ArrayList是最基本的容器,可进行随机存取,但如果要经常在List中间插入和删除,应该使用LinkedList。

Set不保存重复元素,因此主要用法是测试归属性(较多使用查找操作),因此是实现方式有HashSet、TreeSet、LinkedHashSet,区别主要是HashSet使用散列进行存储,可以较快查找但存储顺序无规律,TreeSet使用红黑树进行存储,查找速度较慢,但输出为升序,LinkedHashSet保留了一定程度上的HashSet的查找速度并且输出顺序为输入顺序(三者不同主要是在输出顺序)。

Queue的思想为FIFO(现金先吃),因此常被用于将一个任务的数据安全的传递给另一个任务。Queue可以直接使用LinkedList来实现,因为LinkedList包含Queue的所有方法(这只是LinkedList方法的一部分),并实现了Queue接口。当然PriorityQueue需要另外的实现,因为弹出的是最高优先级的元素。优先级一般默认是自然顺序,但可以在构造器中提供Comparator来自定义优先级顺序。

Map和以上三个容器不一样,没有实现Iterable,不能使用foreach(Collection都实现了Iterable),但可以持有键值对,其将一个对象映射到另一个对象的能力在很多场景下都很有用。

二、容器安全性

1、容器本身安全性

在Java SE5之前容器的一个安全问题是容器允许你插入一个不安全的类型,这可能会在运行时产生异常。而在Java SE5之后,泛型解决了这个问题,使得容器的创建和使用更加安全。

2、添加元素的安全性

Collection添加元素时如果直接将Arrays.asList(可变参数)的返回结果当作List使用时会出现问题,因为这个List的底层实现仍旧是数组,所以不能突破数组持有固定数量对象的缺陷。

3、版本遗留问题

新程序中不应使用过时的Vector、Hashtable和Stack(新程序中Stack可用拥有Stack需要的所有方法的LinkedList来代理实现)。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值