这一篇讲的collection接口;首先,集合是用来 存储数据 的,它是基于某种数据结构数据容器。常见的数据结构:数组(Array)、集(Set)、队列(Queue)、链表(Linkedlist)、树(Tree)、堆(Heap)、栈(Stack)和映射(Map)等结构。 集合大类分为了Collection和Map 。 如下图
这一篇文章的内容——现在讲下collection,“集合、容器”,用来存储数据的,它是一个 接口 ,不能直接实例化使用;只能通过它的子类来完成,从上图来看,Collection分为List和Set,List集合中的元素是有序的、可重复的,而Set集合中的元素是无序的、不能重复的。List集合强调的是有序,Set集合强调的是不重复。下面是它的已知实现类。
Collection是描述所有序列容器的共性的根接口,可能会被认为是一个附属接口,即因为要表示其他若干个接口的共性而出现的接口。同时为什么要将其作为接口?是因为可以使我们能够创建更通用的代码。通过针对接口而非具体实现来编写代码,这样,才可以更好地应用于更多的对象类型。
下面的是Collection更加仔细一点的分类。今天这篇重点介绍一下Collection的几个方法,掌握了这些,对于它的子类都是可以直接拿来用的。子类的介绍后面再总结出来。
遇到一些自己不熟的知识点,在IDEA上可以直接查看该接口的详细源码(ctrl加鼠标左键),点开旁边的结构图按钮,可以直观得去查看这些方法
这个一看就知道了,就是添加功能,往集合里面添加元素或者对象的方法,若是list这种,因为它返回都是true,一般情况下,可以随便往里面添加。
Collection s = new Collection(); s.add(你要添加的); s.add("你要添加的");
有时需要注意的时候,如果操作的集合是不允许重复值的,往里面添加就会报错。返回的是false.
移除容器中的所有元素,该集合不支持移除的话就会抛出UnsupportedOperationException异常(不支持该操作)
//接着用上面的s集合 s.clear(); //这时候集合为空了
用来检查此集合是否包含指定元素或者对象,包含则返回true不包含就返回false;会返回两种错误。
用来检查集合中是否为空,如果为空就返回true。
返回一个Iterator
这两个方法一般情况下都是 绑定一起用的 。形式如下。
//其主要的用法如下,遍历的功能 //通过集合对象获取迭代器对象 Iterator i = 集合.iterator(); //hasNext方法是布尔型的返回值,有元素在集合里面的时候就会返回true while(it.hasNext()){ System.out.println(it.next()); }
用来返回的集合的 长度 ,也就是集合里面的元素的个数。
//直接使用,返回长度 集合.size();
用来 删除 集合中的元素,对象,只要有移除动作就会返回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))); } }