java(14):数据结构(1)--Collection

日期:2017/11/3

一、集合的意义:

        面向对象语言对事物的体现都是以 对象的形式,所以为了方便对多个对象的操作,用前面所学知识,我们只能采用对象数组实现,但对象数组的长度又是固定的,适应不了变化的需求,所以,java就提供了集合类供我们使用。

fig.1


        上面的图展示了整个集合大家族的成员以及他们之间的关系。下面就上面的各个接口、基类做一些简单的介绍(主要介绍各个集合的特点。区别)。

一、Collection 接口

public interface Collection<E>
 
 
  
  extends 
  
  Iterable<E>
 
 
所有超级接口:
Iterable<E>
所有已知子接口:
BeanContextBeanContextServicesBlockingDeque<E>,  BlockingQueue<E>,  Deque<E>,  List<E>,  NavigableSet<E>,  Queue<E>,  Set<E>,  SortedSet<E>
所有已知实现类:
AbstractCollectionAbstractListAbstractQueueAbstractSequentialListAbstractSetArrayBlockingQueueArrayDequeArrayListAttributeListBeanContextServicesSupportBeanContextSupportConcurrentLinkedQueueConcurrentSkipListSetCopyOnWriteArrayListCopyOnWriteArraySetDelayQueueEnumSetHashSetJobStateReasonsLinkedBlockingDequeLinkedBlockingQueueLinkedHashSetLinkedListPriorityBlockingQueuePriorityQueueRoleListRoleUnresolvedListStackSynchronousQueueTreeSetVector


       Collection 接口是最基本的集合接口,它不提供直接的实现,Java SDK提供的类都是继承自 Collection 的“子接口”如 List 和 Set。Collection 所代表的是一种规则,它所包含的元素都必须遵循一条或者多条规则。如有些允许重复而有些则不能重复、有些必须要按照顺序插入而有些则是散列,有些支持排序但是有些则不支持。

      Collection 是层次结构 中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现。此接口通常用来传递 collection,并在需要最大普遍性的地方操作这些 collection。

       在 Java 中所有实现了 Collection 接口的类都必须提供两套标准的构造函数,一个是无参,用于创建一个空的 Collection,一个是带有 Collection 参数的有参构造函数,用于创建一个新的 Collection,这个新的 Collection 与传入进来的 Collection 具备相同的元素。


Collection 小例子1.1,提供了元素(对象)增删改查/判断的方法:


package com.colection;
/*
 * 为什么出现集合类?
 * 		面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,用前面所学知识,我们只能采用对象数组实现。
 * 		但是,对象数组的长度又是固定的,适应不了变化的需求,所以,java就提供了集合类供我们使用。
 * 
 * 集合类的特点:
 * 		A:长度可变
 * 		B:只能存储对象
 * 		C:可以存储不同类型的对象
 * 
 * 面试题:数组和集合的区别?
 * 		A:集合长度可变;集合只能存储引用数据类型;集合可以存储不同数据类型的元素
 * 		B:数组长度固定;数组可以存储引用数据类型,也可以存储基本数据类型;数组存储的是同一种数据类型的元素
 * 
 * 由于我们的功能需求不太一样,所以,java就提供了多种集合类供我们使用。这些集合类的本质区别:其实是底层的数据结构不同。
 * 数据结构:数据的存储方式。
 * 
 * Collection的功能:
 * A:添加功能
 * 		boolean add(Object obj):往集合中添加一个元素
 * 		boolean addAll(Collection c):往集合中添加多个元素。
 * B:获取功能
 * 		Iterator iterator():迭代器
 * 		int size():集合的元素个数,长度
 * C:删除功能
 * 		void clear():清空集合的所有元素
 * 		boolean remove(Object obj):从集合中移除一个元素
 * 		boolean removeAll(Collection c):从集合中移除多个元素
 * D:判断功能
 * 		boolean contains(Object obj):判断集合中是否包含指定的元素
 * 		boolean containsAll(Collection c):判断集合中是否包含指定的多个元素
 * 		boolean isEmpty():判断集合是否为空
 * E:交集元素
 * 		boolean retainAll(Collection c)
 * F:转数组
 * 		Object[] toArray():把集合转成对象数组
 */
import java.util.ArrayList;
import java.util.Collection;

public class CollectionDemo {

	public static void main(String[] args) {
//		不能实例化类型 Collection
//		Collection c = new Collection();
		Collection v = new ArrayList();
		
		// boolean add(Object obj):往集合中添加一个元素
		//warnning:类型安全:方法 add(Object)属于原始类型 Collection。
		//应该将对通用类型 Collection<E> 的引用参数化
		v.add("hello");
		v.add("world");
		v.add("java");
		
		System.out.println("size: "+v.size());
		System.out.println("v:"+v);
				
		// boolean remove(Object obj):从集合中移除一个元素
		v.remove("java");
		
		// boolean contains(Object obj):判断集合中是否包含指定的元素
		System.out.println("contains hello: " + v.contains("hello"));
		System.out.println("contains javaee: " + v.contains("javaee"));
		
		// void clear():清空集合的所有元素
		System.out.println("after clear..");
		v.clear();

		// boolean isEmpty():判断集合是否为空
		System.out.println("isEmpty : "+v.isEmpty());
		
		System.out.println("size: "+v.size());
		System.out.println("v:"+v);
	}

}



     集合之间亦能做比较,Collection提供了相关的方法,见例子1.2:


package com.colection;

import java.util.ArrayList;
import java.util.Collection;

/*
 * boolean addAll(Collection c)
 * boolean removeAll(Collection c):删除一个,就是删除,返回true
 * boolean containsAll(Collection c):全部包含,才是包含。
 * boolean retainAll(Collection c)
 */
public class CollectionDemo2 {

	public static void main(String[] args) {
		// 创建集合
		Collection<String> c1 = new ArrayList();
		c1.add("abc1");
		c1.add("abc2");
		c1.add("abc3");
		c1.add("abc4");
		
		// 创建集合
		Collection c2 = new ArrayList();
		// c2.add("abc1");
		// c2.add("abc2");
		// c2.add("abc3");
		// c2.add("abc4");
		c2.add("abc5");
		c2.add("abc6");
		c2.add("abc7");
		
		// boolean addAll(Collection c)
		 System.out.println("addAll:" + c1.addAll(c2));
		 System.out.println("c1: "+c1);

		// boolean removeAll(Collection c)
		 System.out.println("removeAll:" + c1.removeAll(c2));
		 System.out.println("c1: "+c1);

		// boolean containsAll(Collection c)
		 System.out.println("containsAll:" + c1.containsAll(c2));
		 System.out.println("c1: "+c1);
		 
		// boolean retainAll(Collection c)
		System.out.println("retainAll:" + c1.retainAll(c2));
		/*
		 * 如果我有两个集合A,B。用A对B做交集 交集元素存储在A集合,B集合不发生改变。 返回值表达是A集合是否发生过改变。
		 */
		
		System.out.println("c1: "+c1);
		System.out.println("c2: "+c2);

	}

}



     利用迭代器进行元素的遍历,见例子1.3:


package com.colection;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class CollectionTest2 {
	public static void main(String[] args){
		// 创建集合对象
		Collection c = new ArrayList();

		// 创建元素对象
		Student s1 = new Student("孙悟空", 30);
		Student s2 = new Student("紫霞仙子", 26);
		Student s3 = new Student("嫦娥", 22);

		// 把元素添加到集合
		c.add(s1);
		c.add(s2);
		c.add(s3);

		// 遍历集合
		// 通过集合对象调用iterator()方法获取迭代器对象
		Iterator it = c.iterator();
		// 通过迭代器对象的hasNext()方法进行判断是否有元素
		while (it.hasNext()) {
			// 通过迭代器对象的next()方法获取元素,并转换为你存储的元素类型
			Student s = (Student) it.next();
			// 直接输出对象的名称,输出的是地址值,没有什么意义。
			// 如何解决呢?A:重写对象所属类的toString()方法。B:通过对象调用getXxx()方法
			System.out.println(s.getName() + "---" + s.getAge());
		}
	
	}

}

     第四个例子,当Collection存放String和int对象时,迭代器取出的东西就麻烦大了,,见例子1.4:

package com.colection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Collection;
import java.util.Iterator;

/*
 * Iterator iterator()
 * 		boolean hasNext():是否有下一个元素
 * 		Object next():获取下一个元素,并自动移动到下一个位置等待
 * 
 * 		NoSuchElementException:没有这样的元素异常。
 * 		原因是:你已经获取到元素的末尾了,你还要获取元素,已经没有元素了,所以报错。
 */
public class IteratorDemo {

	public static void main(String[] args) {
		Collection c = new ArrayList();
		
		// 创建元素并添加元素
		c.add("hello");
		c.add("world");
		c.add("java");
		c.add(100);

		// 集合中的方法:Iterator iterator()
		Iterator it  = c.iterator();// 右边其实是接口的实现类对象,这是多态的应用

//		System.out.println(it.next());
//		 System.out.println(it.next());
//		 System.out.println(it.next());
		 
/*	
    	 while(it.hasNext()){
			 System.out.println(it.next());
			 
//			 String s = (String) it.next();
//			 System.out.println(s);			 
//			 s = (String) it.next();
//			 System.out.println(s);			 
//			 s = (String) it.next();
//			 System.out.println(s);
//			 int i = (int) it.next();
//			 System.out.println(i);
 
		 }*/
//			 for循环改进
			 for (Iterator itt = c.iterator(); itt.hasNext();) {
			 String s = (String) itt.next();
			 System.out.println(s);
//			 System.out.println(itt.next());
			 }
	}

}

     PS:Collection的确解决了存储限度的问题,但这也暴露了一个问题 ---- 因为我们想要存储的数据,肯定不可能全部类型一样的,那怎么办呢?? Tips: 泛型!




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后台技术汇

对你的帮助,是对我的最好鼓励。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值