集合框架(一)——概述

集合框架构成图:



大纲:

1.      数组容器和集合的区别;

2.      集合框架的由来;

3.      Collection中的共性方法

4.      迭代器,及其原理,以及出现的好处

5.      集合中两个注意的小细节

6.      Collection的两个子集List   Set 简介及其子类

7.      集合的技巧掌握

————————————————————————————————————————————————————————————————

在开始集合框架总结之前,先得明确【集合】是什么?

                                 集合是:1.用于存储对象的容器。2.该容器的长度是可变的。

一,数组容器和集合的区别;

在这之前学过的【数组容器和集合都可以用来存储数据,那么他们有啥区别呢?】

               1. 集合长度是可变的;数组长度固定的;

               2. 集合中只能存储对象;数组中既可以存储对象,又可以存储基本类型数据。

               3. 集合中存储的对象可以是任意类型的;数组中只能存储同一类型的对象。

【重点注意:】

              集合只能存储对象,经常犯的错误:集合可以存储整型之类的基本数据类型,其实那是通过自动装箱,拆箱机制,转为了Integer对象。

二: 集合框架的由来;            

                用来存储对象的容器虽然有很多并且结构不同,但是都具备着共性,可以不断向上抽取,最终就形成集合框架,该框架的顶层之一就是Collectionn接口。 该接口中定义了集合框架中最共性的功能。最终使用的时候,其实使用的是该框架最子类的对象。

【集合框架的小细节】

              StringBuffer——放进去是一坨了,不能区别单个的了!

              框架,数组————放进去能区分,拿出来也能区分了。

三:Collection中的共性方法;

              

【Collection中的共性方法】——【掌握程度:不用查API文档就可以写出来】

作为容器应该具备的方法:添加,删除,判断,获取。

1.      添加方法:

        boolean add(Object e)——  一次只能添加一个元素;

    boolean addAll(Collection<? extends E> c)—— 将一个参数容器中的所有元素添加到当前容器中。

2.      删除方法:

           boolean remove(Object e) 删除一个指定对象,

     boolean removeAll(Collection<?> c)  删除指定Collection中和本Collection中相同的元素。

            void clear ():直接将集合中的元素清空。

3.      判断方法:

          Boolean contains (Object)是否包含指定元素

     boolean containsAll(Collection<?> c) 是否包含指定容器中的元素。

          boolean imEmpty(): 是否有元素。

 

4.      获取元素个数:

           int size (),获取元素的个数;

5.取交集

     boolean retainAll(Collection<?> c) 
     保留和指定collection集合中相同的元素,不相同的元素会被删除。

6 将集合转成数组;

     Object[] toArray()
【7】取出元素的方法——【重点】
      Iterator<E> iterator()


四:   迭代器,及其原理,以及出现的好处;

      【迭代器】取出集合中元素的方式的一个对象。该对象本身就内置在容器中。
       如何获取到集合的迭代器?
       可以通过iterator()方法完成,该方法返回一个Iterator类型对象。

       

【迭代器接口的原理】

将每一个容器中的取出方式进行了封装。并对外暴露。这样无论是什么容器或者数据结构,只要内部取出方式实现了Iterator接口,

都可以通过该接口取出这些容器中的元素。

【迭代器接口的好处】

它的出现,将容器的取出方式和容器的数据结构分离,降低了耦合性。而取出方式因为直接在访问容器中的元素,并依赖具体的数据结构,所以被定义在了容器中。通过内部类在实现Iterator接口。

【NOTICE】——只要是Collection集合中的容器,迭代器是通用取出方式。

【用迭代器取出时,其实取出的也是引用。】

【代码体现】
package api.iterator.demo;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class IteratorDemo {

	public static void main(String[] args) {
		
		//创建集合。 
		Collection coll = new ArrayList();
		//添加元素。
		coll.add("abc1");
		coll.add("abc2");
		coll.add("abc3");
		
		/*
		//获取该集合的迭代器对象。
		Iterator it = coll.iterator(); //这个对象不用new ,本身内置于该接口中。
		
		//使用迭代器对象中的方法完成元素的获取。 
		while(it.hasNext()){
			System.out.println(it.next());
		}
		*/
		
		//将while改成for结构。开发的时候建议写for。
		for(Iterator it = coll.iterator(); it.hasNext(); ){
			System.out.println(it.next());//next()可以取出元素。而且自动往下取
		}	
	}
}


五:集合中要注意的两个细节;

         

【集合小细节1】

1.存储时,add可以接收任意类型的对象因为参数类型为 Object。

所以对象元素存入时都被提升为Object。

2.其实在集合中真正存储的都是对象的引用。

【用迭代器取出时,其实取出的也是引用。】

(取出的是引用,引用是个地址值,那么又该如何拿出这个地址值对应的元素呢?)

NOTICE

 

coll.add(5),不能存储基本数据类型,

jdk1.5以后,有了自动装箱机制,相当于new Integer5),装箱Integer.valueOf(5);

等同于coll.add(Integer.valueOf(5));

【集合小细节2】——在集合中存储自定义对象;

 

1.       对自定义对象的描述。

          存储时,都被提升为了Object;取出时,如果要使用自定义对象的特有方法,一定要进行向下转型。

注意事项:在迭代时,循环中只要有一个next()即可。

           System.out.println(((Person)it.next()).getName()+ ":" + ((Person)it.next()).getAge( ));

          否则将会抛出:NoSuchElementException

          java.util.NoSuchElementException


【如何往集合中存储自定义对象?】

ArrayListDemo2.java

HashSetDemo.java

TreeSetTest.java


六: Collection的两个子集List  &&  Set 简介及其子类:

集合框架(三)——Collection 子集 ——————List 及其 小弟们!


集合框架(四)——Collection 子集 ——————Set及其 小弟们!




七:集合的技巧性掌握;

1. 明确具体集合对象名称的后缀:

       如果后缀是List,都所属于List体系,通常都是非同步的。

       如果后缀是Set,都所属于Set体系通常都是非同步的。

       这些体系中的其他子类对象,后缀不是所属接口名的,一般都是同步的。

       这在常用子类对象中通用。

 

2. 明确数据结构:

       对于jdk1.2版本的子类对象。后缀名是所属的体系。

       前缀名就是数据结构的名称。

       比如:

       ArrayList:看到Array,就要明确是数组结构;查询快

       LinkedList:看到Link,就要明确链表结构,就要想到add get remove first last结合的方法。增删快

       HashSet看到hash ,就要明确是哈希表,查询快,而且所存储的对象具有唯一性。

              就要想到元素必须覆盖hashCode方法和 equals方法。

       TreeSet就看到Tree,就要明确是二叉树,可以对元素排序;

              就要想到两种排序方式:

              自然排序:Comparable接口,覆盖compareTo(一个参数)java.lang

              比器排序:Comparator接口,覆盖compare(两个参数):java.util

              判断元素唯一性的依据就是比较方法的返回结果 return 0







阅读更多 登录后自动展开
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页