目录
谈谈 Collection
前言
Collection
方法
- boolean add(E)
- void clear()
- boolean contains(Object o)
- boolean isEmpty()
- Iterator iterator()
- int size()
- Boolean remove()
总结
什么是可选操作
集合使用的整体框架(步骤)
谈谈 Collection
前言
这一篇讲的 collection 接口; 首先, 集合是用来存储数据的, 它是基于某种数据结构数据容器. 常见的数据结构: 数组 (Array), 集(Set), 队列(Queue), 链表(Linkedlist), 树(Tree), 堆(Heap), 栈(Stack) 和映射 (Map) 等结构. 集合大类分为了 Collection 和 Map. 如下图
Collection
这一篇文章的内容 -- 现在讲下 collection,"集合, 容器", 用来存储数据的, 它是一个接口, 不能直接实例化使用; 只能通过它的子类来完成, 从上图来看, Collection 分为 List 和 Set,List 集合中的元素是有序的, 可重复的, 而 Set 集合中的元素是无序的, 不能重复的. List 集合强调的是有序, Set 集合强调的是不重复. 下面是它的已知实现类.
Collection 是描述所有序列容器的共性的根接口, 可能会被认为是一个附属接口, 即因为要表示其他若干个接口的共性而出现的接口. 同时为什么要将其作为接口? 是因为可以使我们能够创建更通用的代码. 通过针对接口而非具体实现来编写代码, 这样, 才可以更好地应用于更多的对象类型.
下面的是 Collection 更加仔细一点的分类. 今天这篇重点介绍一下 Collection 的几个方法, 掌握了这些, 对于它的子类都是可以直接拿来用的. 子类的介绍后面再总结出来.
方法
遇到一些自己不熟的知识点, 在 IDEA 上可以直接查看该接口的详细源码(ctrl 加鼠标左键), 点开旁边的结构图按钮, 可以直观得去查看这些方法
1.boolean add(E)
这个一看就知道了, 就是添加功能, 往集合里面添加元素或者对象的方法, 若是 list 这种, 因为它返回都是 true, 一般情况下, 可以随便往里面添加.
- Collection s = new Collection();
- s.add(你要添加的);
- s.add("你要添加的");
有时需要注意的时候, 如果操作的集合是不允许重复值的, 往里面添加就会报错. 返回的是 false.
2.void clear()
移除容器中的所有元素, 该集合不支持移除的话就会抛出 UnsupportedOperationException 异常(不支持该操作)
- // 接着用上面的 s 集合
- s.clear();
- // 这时候集合为空了
- 3.boolean contains(Object o)
用来检查此集合是否包含指定元素或者对象, 包含则返回 true 不包含就返回 false; 会返回两种错误.
4.boolean isEmpty()
用来检查集合中是否为空, 如果为空就返回 true.
5.Iterator iterator()
返回一个 Iterator 迭代器, 这个方法是用来遍历集合中的元素的, 在一些需要获取集合中的元素(包括打印输出, 调用等场景下), 依赖于集合而存在的, 有 next 方法和 hasNext 方法.
这两个方法一般情况下都是绑定一起用的. 形式如下.
- // 其主要的用法如下, 遍历的功能
- // 通过集合对象获取迭代器对象
Iterator i = 集合. iterator();
- //hasNext 方法是布尔型的返回值, 有元素在集合里面的时候就会返回 true
- while(it.hasNext()){
- System.out.println(it.next());
- }
- 6.int size()
用来返回的集合的长度, 也就是集合里面的元素的个数.
// 直接使用, 返回长度
集合. size();
7.Boolean remove()
用来删除集合中的元素, 对象, 只要有移除动作就会返回 true.
总结
什么是可选操作
在看源码的时候, 会发现有些方法在后面会标记为可选操作 (optional operation).
执行各种不同的添加和移除的方法在 Colletion 接口中都是可选操作, 这意味着实现类并不需要为这些方法提供功能定义....... 如果一个操作是可选的, 编译器仍旧会严格要求你只能调用该接口中的方法.
它声明调用某些方法将不会执行有意义的行为, 相反, 它们会抛出异常. --《Java 编程思想》
异常 UnsupportedOperationException(这个和上面讲 remove 时候不支持操作的时候抛出一样的异常)
大概意思是 collection 子类可以重写这个方法以达到子类自己的目的, 也可以不覆盖这个方法但是. 没有实现这个方法的子类使用这个方法的话会抛出 UnsupportedOperationException 异常.(这个未获得支持的异常在运行时候才能探测到, 属于动态类型异常), 先看下报错的代码示例
- package music.daima.ebook;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.Collection;
- import java.util.List;
- /**
- * @author yhy
- * 这个是用来观察 java 中的可选操作方法的一些特点以及定义使用以及报错的原因, 这是书上的代码
- */
- public class Unsupport {
- static void test(String msg, List<String> list) {
- System.out.println("---" + msg + "---");
- Collection<String> c = list;
- Collection<String> subList = list.subList(1,8);
- Collection<String> c2 = new ArrayList<String>(subList);
- try {
- c.retainAll(c2);
- }
- catch(Exception e) {
- System.out.println("retainAll():" + e);
- }
- try { c.removeAll(c2); } catch(Exception e) {
- System.out.println("removeAll():" + e);
- }
- try { c.clear(); } catch(Exception e) {
- System.out.println("clear():" + e);
- }
- try { c.add("X"); } catch(Exception e) {
- System.out.println("add():" + e);
- }
- try { c.addAll(c2); } catch(Exception e) {
- System.out.println("addAll():" + e);
- }
- try { c.remove("C"); } catch(Exception e) {
- System.out.println("remove():" + e);
- }
- // The List.set() 虽然改变了值但没有改变它的数据结构尺寸
- try {
- list.set(0, "X");
- } catch(Exception e) {
- System.out.println("List.set():" + e);
- }
- }
- public static void main(String[] args) {
- //asList 方法: 返回由指定数组支持的固定大小的列表. (将返回的列表更改为 "写入数组".)该方法作为基于数组和基于集合的 API 之间的桥梁, 与 Collection.toArray()相结合 .
- // 返回的列表是可序列化的, 并实现 RandomAccess . 此方法还提供了一种方便的方式来创建一个初始化为包含几个元素的固定大小的列表:
- List<String> list = Arrays.asList("A B C D E F G H I J K L".split(" "));
- System.out.println(list.getClass());
- test("Arrays.asList()", list);
- // System.out.println(list1.getClass());
- test("Modifiable Copy", new ArrayList<String>(list));
- //test("unmodifiableList()",Collections.unmodifiableList(new ArrayList<String>(list)));
- }
- }
- output(输出):
集合使用的整体框架(步骤)
来源: https://www.cnblogs.com/yhycoder/p/12209198.html