Java中集合框架、Collection接口、迭代器Iterator、List接口、ListIterator列表迭代器

集合框架

  • 集合类的由来
    • 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,Java就提供了集合类。
  • 数组和集合类同是容器,他们有何区别
    • 数组虽然也可以存储对象,但长度是固定的。数组中可以存储基本数据类型。
    • 集合长度是可变的。集合只能存储对象。
  • 集合类的特点
    • 集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。

下面我画了两张图,给出了组成集合框架的各个接口与类的层次结构(图画的有点丑,莫怪)

collection接口.png
Map接口.png

从上面的图中可以看出集合框架中提供的主要接口有6个,主要类有10个。以及接口和类之间的继承和实现关系。

Collection接口

  • 概述(通过查看API)
    • Collection 层次结构中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。
  • Collection的功能概述:
    • 1:添加功能
      • boolean add(Object obj):添加一个元素
      • boolean addAll(Collection c):添加一个集合的元素
    • 2:删除功能
      • void clear():移除所有元素
      • boolean remove(Object o):移除一个元素
      • boolean removeAll(Collection c):移除一个集合的元素
    • 3:判断功能
      • boolean contains(Object o):判断集合中是否包含指定的元素
      • boolean containsAll(Collection c):判断集合中是否包含指定的集合元素
      • boolean isEmpty():判断集合是否为空
    • 4:获取功能
      • Iterator iterator()
    • 5:长度功能
      • int size():元素的个数
    • 6:交集功能
      • boolean retainAll(Collection c)
    • 7:把集合转换为数组
      • Object[] toArray()
public class CollectionDemo { 
public static void main(String[] args) { 
// 测试不带All的方法 
// 创建集合对象
 // Collection c = new Collection(); //错误,因为接口不能实例化
 Collection c = new ArrayList(); 
// boolean add(Object obj):添加一个元素 
c.add("hello"); 
c.add("world"); 
c.add("java");
 // boolean isEmpty():判断集合是否为空 System.out.println("isEmpty:"+c.isEmpty()); 
//int size():元素的个数 
System.out.println("size:"+c.size()); 
System.out.println("c:" + c); 
}
}
//我们还可以移除判断一下
 // void clear():移除所有元素 
c.clear();
 //要是移除了所有元素,上面的输出结果,isEmpty就成为true,size=0,c集合就为空[] 
// boolean remove(Object o):移除一个元素 System.out.println("remove:" + c.remove("hello"));//上面我们给集合中add了hello,所以会返回true System.out.println("remove:" + c.remove("javaee"));//集合中没有javaee,所以肯定会返回false
// boolean contains(Object o):判断集合中是否包含指定的元素 System.out.println("contains:"+c.contains("hello"));//和上面一样会返回true System.out.println("contains:"+c.contains("android"));//会返回false

两个集合的交集

public class CollectionDemo {
    public static void main(String[] args) {
 // 创建集合1
 Collection c1 = new ArrayList(); 
c1.add("abc1"); 
c1.add("abc2"); 
// 创建集合2 
Collection c2 = new ArrayList(); 
c2.add("abc1"); 
c2.add("abc2"); 
c2.add("abc3"); 
c2.add("abc4"); 
c2.add("abc5"); 
c1.retainAll(c2); 
System.out.println("c1:" + c1);//c1:[abc1, abc2] System.out.println("c2:" + c2);//c2:[abc1, abc2, abc3, abc4, abc5] 
}
}

集合转成数组,可以实现集合的遍历

public class CollectionDemo { 
public static void main(String[] args) { 
  // 创建集合对象 
Collection c = new ArrayList(); 
// 添加元素 
c.add("hello");// Object obj = "hello"; 向上转型
 c.add("world"); 
c.add("java");
 //遍历 
Object[] objs = c.toArray(); 
for (int x = 0; x < objs.length; x++) { 
     String s = (String) objs[x]; 
     System.out.println(s + "---" + s.length()); 
  } 
 }
}

迭代器Iterator

  • Iterator接口概述
    • 对 collection 进行迭代的迭代器
    • 依赖于集合而存在
  • 成员方法
    • boolean hasNext()
    • next()

迭代器它是集合的专用遍历方式,下面我们来看它怎么对数据进行操作

public class IteratorDemo { 
   public static void main(String[] args) { 
   // 创建集合对象 
   Collection c = new ArrayList();
   // 创建并添加元素 
c.add("hello"); c.add("world"); c.add("java");
Iterator it = c.iterator(); // 实际返回的肯定是子类对象,这里是多态
 while (it.hasNext()) {
     String s = (String) it.next();
     System.out.println(s); 
  } 
 }
}

List接口

  • List接口概述
    • 有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
    • 与 set 不同,列表通常允许重复的元素。

所以我们可以看出List和Set的区别很明显

  • List接口:元素是有序的,元素可以重复,因为该集合体系有索引
  • Set接口:元素是无序,元素不可以重复,不能索引

下面我们来看List里面都有哪些成员方法

  • List接口成员方法
    • 添加功能
      void add(int index,Object element):在指定位置添加元素

    • 获取功能
      Object get(int index):获取指定位置的元素

    • 删除功能
      Object remove(int index):根据索引删除元素,返回被删除的元素

    • 修改功能
      Object set(int index,Object element):根据索引修改元素,返回被修饰的元素

下面我们来逐个学习他的成员方法

public class ListDemo { 
   public static void main(String[] args) { 
   // 我们先创建集合对象 
   List list = new ArrayList(); 
   // 添加元素 
   list.add("hello"); 
   list.add("world"); 
   list.add("java"); 
   System.out.println("原集合:" + list); 

   //在指定位置添加元素 
   list.add(1, "android"); 
   System.out.println("添加后:" + list); 
   list.add(11, "javaee");//这样会有问题,出现IndexOutOfBoundsException 
   //获取指定位置的元素 
   System.out.println("获取后:" + list.get(1)); 
   //根据索引删除元素,返回被删除的元素 
   list.remove(1); 
   System.out.println("删除后:" + list); 
   //根据索引修改元素,返回被修饰的元素 
   list.set(1, "javaee"); 
   System.out.println("修改后:" +list); 
   // 获取所有元素 
   for (int x = 0; x < list.size(); x++) { 
         System.out.println(list.get(x)); 
   } 
  // 通过迭代器 
   Iterator it = list.iterator();
   while (it.hasNext()) { 
          System.out.println("next:" + it.next()); 
    }
}

ListIterator列表迭代器

上面我们学习了Iterator迭代器,现在又来一个ListIterator,它又是什么呢?它是List集合特有的迭代器
下面我们通过一道题来弄懂它。
我有一个集合,如下,请问,我想判断里面有没有”world”这个元素,如果有,我就添加一个”javaee”元素,请写代码实现。

public class ListIteratorDemo2 { 
    public static void main(String[] args) {
        // 创建List集合对象 
        List list = new ArrayList(); 
       // 添加元素
       list.add("hello"); 
       list.add("world");
       list.add("java"); 
       // 看到这里,我们会想到用我们上面学的迭代器遍历   
       Iterator it = list.iterator();
       while (it.hasNext()) {
               String s = (String) it.next(); 
               if ("world".equals(s)) { 
                     list.add("javaee"); 
               } 
       }
       System.out.println("list:" + list); 
    }
}

运行出错,这是什么错呢?通过看API我们可以知道
ConcurrentModificationException:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。

  • 产生的原因
    • 迭代器是依赖于集合而存在的,在判断成功后,集合的中新添加了元素,而迭代器却不知道,所以就报错了,这个错叫并发修改异常。
    • 其实这个问题描述的是:迭代器遍历元素的时候,通过集合是不能修改元素的。
  • 如何解决呢?
    • 迭代器迭代元素,迭代器修改元素
    • 集合遍历元素,集合修改元素(普通for)
// 方式1:迭代器迭代元素,迭代器修改元素 
// 而Iterator迭代器却没有添加功能,所以我们使用其子接口ListIterator ListIterator lit = list.listIterator();
 while (lit.hasNext()) { 
     String s = (String) lit.next(); 
     if ("world".equals(s)) { 
         lit.add("javaee"); 
     } 
} 
  System.out.println("使用ListIterator迭代器后得到的结果:" + list); 
   // 方式2:集合遍历元素,集合修改元素(普通for) 
   for (int x = 0; x < list.size(); x++) { 
         String s = (String) list.get(x); 
         if ("world".equals(s)) { list.add("javaee"); 
    } 
 } 
 System.out.println("使用集合遍历后得到的结果:" + list);

可以发现我们使用ListIterator迭代器后得到的结果(元素是跟在刚才迭代的元素后面的)
使用集合遍历元素后,集合修改元素得到的结果(元素在最后添加的)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容

  • 写在前面自开始在公司实习以来,经常都要用到集合框架。不仅后台要用,在前台做数据交互的时候用得也多。所以我想着是时候...
    EakonZhao阅读 3,255评论 0 12
  • Collection ├List │├LinkedList │├ArrayList │└Vector │└Stac...
    AndyZX阅读 869评论 0 1
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,559评论 18 399
  • 一.集合框架 1.集合框架(对象数组的概述和使用) a.案例演示 * 需求:我有5个学生,请把这个5个学生的信息存...
    梦游的沙师弟阅读 537评论 0 1
  • 前言:一名iOS开发工程师,正在学习Android开发,期待各路大神指点和学习交流.学习交流讨论及资料获取请关注:...
    极客James阅读 4,375评论 0 5