[置顶] 黑马程序员_集合框架(Collection,Iterator)

时间:2021-12-20 15:49:52

------- android培训java培训、期待与您交流! ----------

为什么出现集合类?

  • 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式


 数组和集合类同是容器,有何不同?
  •  数组虽然也可以存储对象,但长度是固定的;集合长度是可变的
  •  数组中可以存储基本数据类型,集合只能存储对象 
集合类的特点:

  • 集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象

集合的用处:

  • 用于存储对象的容器
  • 该容器的长度是可变的

集合和数组的区别:

  • 集合长度是可变的,数组长度是固定的
  • 集合中只能存储对象,数组中即可以存储对象,又可以存储基本类型数值
  • 集合中存储的对象可以是任意类型的,数组中只能存储同一类型的对象

集合框架的由来:

  • 容器很多,因为每个容器中的数据结构是不同的。
  • 数据结构:就是数据在容器中存储方式
  • 如散装鸡蛋和品牌鸡蛋的存储方式
  • 容器虽然因为结构有不同,但是都具备着共性,可以不断地向上抽取。
  • 就形成集合框架,该框架的顶层之一就是Collection接口。         
  • 该接口中定义了集合框架中最共性的功能。                                                  
  • 最终使用的时候,其实使用的该框架最子类的对象。        

Collection中有哪些方法呢?                                                                     
1,添加方法。                                                                                  
boolean add(object e):一次添加一个元素。                                                  
boolean addAll(Collection):将一个参数容器中的元素添加到当前容器中。     

                                       
2,删除方法。                                                                                  
boolean remove(object):删除一个指定对象。                                                 
boolean removeAll(Collection):删除指定collection中和本Collection中相同的元素。            
void clear():直接将集合中的元素清空。                                                     


3,判断方法:                                                                                  
boolean contains(object):是否包含指定元素。                                               
boolean containsAll(Collection):是否包含指定容器中的元素。                                
boolean isEmpty():是否有元素。                        

                                    
4,获取元素个数:                                                                              
int size():获取元素有几个。            

                                                   
5,取交集。                                                                                    
boolean retainAll(collection):保留和指定collection集合中相同的元素,不相同的元素会被删除。


6,将集合转成数组。


7,取出元素的方法: 

     

Iterator iterator(): 

迭代器:取出集合中元素的方式的一个对象。该对象本身就内置在容器中。

如何获取到集合的迭代器呢?                                                       

  • 可以通过iterator()方法来完成。该方法返回一个Iterator类型对象。                       
  • 迭代器接口出现:将每一个容器中的取出方式进行了封装。并对外暴露。                 
  • 这样无论是什么容器或者数据结构,只要内部取出方式实现了Iterator接口,             
  • 都可以通过该接口取出这些容器中的元素。                                              
  • 它的出现,将容器的取出方式和容器的数据结构相分离,降低了耦合性。                 
  • 而取出方式因为直接在访问容器中的元素,并依赖具体的数据结构,所以被定义在了容器中。
  • 通过内部类来实现Iterator接口。                                                                            
  • 大型游戏机中抓布娃娃的游戏机中的夹子。就是那个迭代器。                                                                                     
  • 只要是Collection集合中的容器,迭代器是通用取出方式。                            

演示代码如下:

//创建集合。 
Collection coll = new ArrayList();

//添加元素。
coll.add("abc1");
coll.add("abc2");
coll.add("abc3");

/*
//获取该集合的迭代器对象。
Iterator it = coll.iterator();

//使用迭代器对象中的方法完成元素的获取。
while(it.hasNext())
{
System.out.println(it.next());
}
*/

//将while改成for结构。开发的时候建议写for。
for(Iterator it = coll.iterator(); it.hasNext(); )
{
System.out.println(it.next());
}
输出结果

demo1
demo2
demo3


使用集合是的一些小细节

创建一个集合容器。其实也是一个对象

Collection coll = new ArrayList();
存储时,add可以接收任意类型的对象因为参数类型是Object。
所以对象元素存入时都被提升为了Object。其实在集合中真正存储都是对象的引用。

coll.add(new Object());
coll.add("abc");
用迭代器取出时,其实取出的也是引用。

coll.add(5);
上面这样写是可以的。因为jdk1.5后,有了自动装箱机制。

相当于new Integer(5).装箱Integer.valueOf(5);
等同于coll.add(Integer.valueOf(5));//拆箱 intValue();

                                                         
一般开发时,最常见的就是往集合存储自定义对象对自定义对象进行描述。  

存储时,都被提升为了Object。   

取出时如果要使用自定义对象的特有方法,一定要进行向下转型。

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

示例代码如下:

Collection coll = new ArrayList();
coll.add(new Person("lisi2",22));
coll.add(new Person("lisi3",23));
coll.add(new Person("lisi4",24));

//取出元素。
Iterator it = coll.iterator();
while(it.hasNext())
{
Person p = (Person)it.next();
System.out.println(p.getName()+":"+p.getAge());
//System.out.println(((Person)it.next()).getName()+":"+((Person)it.next()).getAge()); //出错,next()只能调用一次

}

Vector:jdk1.0就存在了,底层是数组结构,可变长度数组

原理:一旦原数组长度不够,会创建新数组,将原数组的元素复制到新数组,并

将新元素添加到数组中

  • ArrayList:底层是数组结构,也是支持长度可变变数组的,是不同步的。代替了Vector,因为效率高,查询效率高,增删低
  • LinkedList:底层是链接列表结构。简称链表结构。好处是对元素的增删效率非常高,查询低