黑马程序员----JAVA基础集合框架_迭代器

本文深入讲解Java集合框架的构成及各类集合的特点与应用场景,包括List、Set、Map的不同实现类,以及Iterator迭代器的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


 个人认为总的来说,map不是地图是映射的意思,所以里面是键值成对存在的,list的清单的意思,所以里面是一项一项列出来的,set是集合的意思,所以里面不能有重复的(数学里面的集合里面不能有重复元素).

Java的集合类主要由两个接口派生而出:CollectionMap,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些接口或实现类。collection下面两个接口list和set都是继承了collection,要注意的是这里三个概念都是接口,而arraylist等才是他们的实现类。下面一个图摘抄自ibm的教程,可以看出集合接口的继承关系



 Collection

如果只是存一个值,用Collection


List :元素有序(存入和取出的顺序一致),可重复


ArrayList :用的比较多  底层数据结构是数组。查询快,增删慢。线程不安全。


LinkedList :可以方便操作头尾元素,底层数据结构是链表。查询慢,增删快。线程不安全。


Vector :底层数据结构 也是数组实现 , 但是每次递增 100%. 线程安全 , 插入时效率比较高 .


Set  元素无序,不可重复。


HashSet:底层数据结构是哈希表结构。无顺序,不可重复,可以保证元素的唯一性。 它如何保证的呢?先hashCode,在equals。


LinkedHashSet : 底层数据结构是链表和哈希结构。元素有序,不可重复,可以让添加时的顺序与取出时的顺序一致


TreeSet :底层数据结构是二叉数。保证存入的元素是有序的不会重复,TreeSet有顺序,效率比较低 。
   有序是通过两种方式体现的。
  一种是让集合具备比较性。
  一种是让元素本身具备比较性。


为演示具体 Set 类的使用,下面的程序创建了一个 HashSet,并往里添加了一组名字,其中有个名字添加了两次。接着,程序把集中名字的列表打印出来,演示了重复的名字没有出现。接着,程序把集作为 TreeSet 来处理,并显示有序的列表。

    import java.util.*;public class SetExample
    {
    public static void main(String args[])
    {
    Set set = new HashSet();
    set.add("Bernadine");
    set.add("Elizabeth");
    set.add("Gene");
    set.add("Elizabeth");
    set.add("Clara");
    System.out.println(set);
    Set sortedSet = new TreeSet(set);
    System.out.println(sortedSet);
    }
    }


    Map

如果存储的是关系,key-valueMap


HashMap :底层数据结构是哈希表。用的比较多。 线程不安全。


LinkedHashMap :可以让添加时的顺序与取出时的顺序一致


Hashtable :hash实现 不可以有null键和null值 线程安全


Properties :这个可以和IO进行结合使用。


TreeMap :底层数据结构是二叉数。  用key来进行排序


1. Collection是什么?

Collection接口是List、Set接口的父接口,其含有集合都具备的抽象方法. 同时可以操作这两个接口。

2. Collection有什么用?

其实现类叫集合,为一个容器,里面可以装不同的对象,并对其进行增删改查的操作

3. Collection怎么用?

其本身这些方法是不能用的,但是其实现类实现了就都可以用了,这个叫共有方法

:增加一个对象或集合,增加成功返回true

1.public boolean add(Object obj)   向集合中添加一个元素obj

2.public boolean addAll(Collection c)  向集合中添加一堆元素  c

删 改:: 删除某个元素,或删除所有元素,或将一部分元素删除.

public void clear() 清空集合

.public boolean remove(Object obj)

将集合中元素obj删除,如果删除成功,返回true.一次只能删除一个.

public boolean removeAll(Collect c) 将集合中与c集合中相同的元素删除.

:查询长度,交集,元素是否相同,是否是子集,是否是空集合.

public boolean retainAll(Collection c) 求集合的交集,

public int size(); 得到集合中元素的个数

public boolean contains(Object obj)

判断集合中是否有与obj相同的元素.这里面的相同是equals

public boolean containsAll(Collection c)

判断集合c是否是当前集合的子集.

public boolean isEmpty() 

判断集合中是否有元素.<A HREF="Demo1.java"></A>size0,代表空,返回true

Object[] toArray()返回包含此 collection 中所有元素的数组。

4. Collection什么时候用?

当需要对多个对象进行操作时,就要用到集合

5. Collection有什么特点?

集合只能放对象

集合分为两种,一种有序可重复,一中无序不可重复.


Collection接口定义操作集合元素的具体方法大家可以参考API文档,这里通过一个例子来说明Collection的添加元素、删除元素、返回集合中元素的个数以及清空集合元素的方法。

public class TestCollection
{
    public static void main(String[] args) 
    {
        Collection c = new ArrayList();
        //添加元素
        c.add("元素一");
        //虽然集合里不能放基本类型的值,但Java支持自动装箱
        c.add(6);

        System.out.println("c集合的元素个数为:" + c.size());
       
     //删除指定元素
        c.remove(6);
       
     System.out.println("c集合的元素个数为:" + c.size());
        //判断是否包含指定字符串
        System.out.println("c集合的是否包含元素一字符串:" + c.contains("元素一"));

        c.add("轻量级J2EE企业应用实战");

        System.out.println("c集合的元素:" + c);        

     Collection books = new HashSet();

        books.add("轻量级J2EE企业应用实战");
        books.add("Struts2权威指南");

        System.out.println("c集合是否完全包含books集合?" + c.containsAll(books));

        //用c集合减去books集合里的元素
        c.removeAll(books);

        System.out.println("c集合的元素:" + c);

        //删除c集合里所有元素
        c.clear();

        System.out.println("c集合的元素:" + c);

        //books集合里只剩下c集合里也同时包含的元素
        books.retainAll(c);

        System.out.println("books集合的元素:" + books);
    }
}


二、Iterator迭代器---重点

1. 迭代器是什么?

迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些行为上像迭代器的东西都可以叫做迭代器。然而迭代器有很多不同的能力,它可以把抽象容器和通用算法有机的统一起来。

2.  迭代器有什么用?

迭代器提供一些基本操作符:*++==、!==。这些操作和C/C++“操作array元素”时的指针接口一致。不同之处在于,迭代器是个所谓的智能指针,具有遍历复杂数据结构的能力。其下层运行机制取决于其所遍历的数据结构。因此,每一种容器型别都必须提供自己的迭代器。事实上每一种容器都将其迭代器以嵌套的方式定义于内部。因此各种迭代器的接口相同,型号却不同。这直接导出了泛型程序设计的概念:所有操作行为都使用相同接口,虽然它们的型别不同。

3. 迭代器怎么用?

Iterator 迭代器名 集合名.iterator();-----得到一本集合的迭代器对象,

然后用这个对象调用Iterator接口中定义的方法,Iterator有三个方法,

迭代器名.hasNext().....迭代器名.next().....迭代器名.remove().....

来实现:

1.public boolean hasNext()  判断是否有元素进行迭代,没有返回false,一般用于定义条件标记

2.public Object next();      取到下一个元素

3.public void remove();      删除元素


    方法可由底层集合有选择的支持。当底层集合调用并支持该方法时,最近一次 next() 调用返回的元素就被除去。为演示这一点,用于常规 Collection 的 Iterator 接口代码如下:
    Collection collection = …;
    Iterator iterator = collection.iterator();
    while (iterator.hasNext())
    {
    Object element = iterator.next();
    if
    (removalCheck(element))
    {
    iterator.remove();
    }
    }

4. 迭代器什么时候用?

当需要对集合里的元素进行遍历或移除操作时

5. 迭代器有什么特点?

public Iterator iterator() 得到集合的迭代器.

迭代器模式。Iterator对已集合类中的任何一个实现类,都可以返回这样一个Iterator对象。

就和循环一样,好处是可以适用于任何一个类,而且实际上java对它进行了优化,

比直接用index访问快一点(这一点没法考证,别人都这样说)。

不过呢,有一点很好,就是用起来确实很好用,加上泛型就更好用啦。

比如说这样一个例子ArrayList< String > arr = new ArrayList< String >();

Iterator it = arr.iterator();迭代的时候可以这样while( it .hasNext() ){ //做一些处理,比如 System.out.print( it.next );}配合上泛型,

一个好处是it.next()可以不用类型转换。以前用的时候是Object,还要自己转,我感觉,Iterator和泛型简直就是绝配哈。






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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值