对象的集合

如果程序只包含固定数量的对象,并且其生命周期都已知,那么这个程序就实在太简单了。
通常,你的程序会根据运行时才知道的条件创建新对象。不到运行期,不会知道所需对象
的数量,甚至不知道确切的类型。为解决这个普遍的编程问题,需要能够在任意时刻,任
意位置,创建任意数量的对象。所以,你就不能指望创建具名的引用来持有每一个对象:
MyObject myReference;
因为你不知道实际上会需要多少这样的引用。
大多数语言都提供了某种方法来解决这个基本问题。Java 有多种方式保存对象(应该说是
对象的引用 reference)。例如前面曾经学习过的数组,它是语言内置的类型。Java 实用
类库还提供了一套相当完整的容器类(也称为集合类,但由于 Java 2 的类库中使用了
Collection 来指代该类库的一个特殊子集,所以我使用“容器”称呼它们)。容器提供了
近乎完美的方式来保存和操纵对象。

只有三种容器:Map,List 和 Set,它
们各有两到三个实现版本。常用的容器用黑色粗线框表示。看到这里,容器应该没有那么
可怕了吧。

 

回顾一遍 Java标准类库提供的容器:
1.   数组将数字与对象联系起来。它保存类型明确的对象,查询对象时,不需要对
结果做类型转换。它可以是多维的,可以保存基本类型的数据。但是,数组
一旦生成,其容量就不能改变。
2. Collection 保存单个的元素,而 Map 保存相关联的键值对。 
3. 像数组一样,List 也建立数字与对象的关联,可以认为数组和 List 都是排好序
的容器。List能够自动扩充容量。但是List不能保存基本类型,只能保存Object的引用,

因此必须对从容器中取出的 Object 结果做类型转换。
4. 如果要进行大量的随机访问,就使用 ArrayList;如果要经常从 List中间插入或
删除元素,则应该使用 LinkedList。
5.   队列、双向队列以及栈的行为,由 LinkedList提供支持。
6. Map 是一种将对象与对象相关联的设计。HashMap着重于快速访问;TreeMap
保持“键”始终处于排序状态,所以没有 HashMap 快。LinkedHashMap 保
持元素插入的顺序,也可以使用 LRU算法对其重排序。
7. Set不接受重复元素。HashSet提供最快的查询速度,TreeSet保持元素处于排
序状态。LinkedHashSet以插入顺序保存元素。
8. 新程序中不应该使用过时的 Vector、Hashtable和 Stack。
容器是你每天都会用到的工具,它可以使你的程序更简洁、更强大、更高效。

如果你要从一个对象集合中去重流(stream)数据,你可以使用不同的方法,具体取决于你使用的编程语言和框架。以下是一种通用的方法: 1. 首先,将对象集合转换为流。这可以通过调用集合的stream()方法来实现。例如,在Java中,你可以使用`stream()`方法将List或Set集合转换为一个流。 2. 接下来,你可以使用流的distinct()方法来去除重复的元素。这个方法会根据对象的equals()方法来判断元素是否重复。调用distinct()方法后,流会返回一个去重后的新流,其中只包含不重复的元素。 3. 最后,你可以将去重后的流转换回对象集合。这可以通过使用流的collect()方法,并提供一个Collector来实现。例如,在Java中,你可以使用Collectors.toList()方法将流转换为一个List集合,或者使用Collectors.toSet()方法将流转换为一个Set集合。 下面是一个使用Java Stream API进行对象集合去重的示例代码: ```java List<Person> personList = ...; // 原始的Person对象集合 List<Person> distinctPersonList = personList.stream() .distinct() .collect(Collectors.toList()); // distinctPersonList 包含了去重后的Person对象集合 ``` 注意,为了使上述代码正常工作,你需要确保Person类正确实现了equals()和hashCode()方法,以便在去重时进行正确的比较。具体实现方式可能会因语言和对象类型而有所不同。 这是一个简单的示例,你可以根据你使用的编程语言和框架进行相应的调整和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值