疯狂Java学习笔记(34)----------Iterator、Collection接口以及foreach

Iterator、Collection接口:

如下图:Iterator、Collection同在一个包中:

红字部分使我们经常遇到的,但是遇到又不知道怎么去理解,去应用它!

Collection是最基本集合接口,它定义了一组允许重复的对象。Collection接口派生了两个子接口Set和List,分别定义了两种不同的存储方式,如下:

2、 Set接口

Set接口继承于Collection接口,它没有提供额外的方法,但实现了Set接口的集合类中的元素是无序且不可重复。

特征:无序且不可重复。

3、  List接口

List接口同样也继承于Collection接口,但是与Set接口恰恰相反,List接口的集合类中的元素是对象有序且可重复。

特征:有序且可重复。

两个重要的实现类:ArrayList和LinkedList

1.ArrayList特点是有序可重复的

2.LinkedList是一个双向链表结构的。

4、Map接口

Map也是接口,但没有继承Collection接口。该接口描述了从不重复的键到值的映射。Map接口用于维护键/值对(key/value pairs)。

5.Iterator接口

Iterator接口,在C#里有例外一种说法IEnumerator,他们都是集合访问器,用于循环访问集合中的对象。

所有实现了Collection接口的容器类都有iterator方法,用于返回一个实现了Iterator接口的对象。Iterator对象称作迭代器,Iterator接口方法能以迭代方式逐个访问集合中各个元素,并可以从Collection中除去适当的元素。

下面将是展现真正的实力了!

CollectionTest.java代码

package com.haixu.collection;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
/**
 * Collection集合内部方法的学习!
 * */
public class CollectionTest {

 public static void main(String[] args) {

 Collection<String> c =new ArrayList<String>();
 //向集合内添加元素
 c.add("Hi!");
 c.add("Haixu");
 //输出各个元素
 System.out.println("c的集合元素个数:"+c.size());

//虽然集合里不能放基本类型的值,但Java支持自动装箱!

 //删除指定的元素
 c.remove(2);
 System.out.println("c的集合元素个数:"+c.size());

 //判断集合c中是否包含字符串"Haixu"
 System.out.println("c的集合中是否有\"Haixu\"字符串:" + c.contains("Haixu"));

 //继续向集合内添加元素并将集合元素输出出来
 c.add("You are very perfect!");
 System.out.println("c的集合中的元素为:" + c);

 //用HsahSet定义对象c1
 Collection<String> c1 = new HashSet<String>();

 //添加元素
 c1.add("Believe yourself!");
 c1.add("Haixu!");
 c1.add("you will success!");
 System.out.println(c1);

 //判断c集合是否完全包含c1集合
 System.out.println("c集合是否完全包含c1集合?" + c.contains(c1));

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

 //清空集合c
 c.clear();
 System.out.println("c的集合元素为:" + c);

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

}

IteratorTest.java

package com.haixu.collection;

import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
/*
 * Iterator 用于遍历集合
 * */
public class IteratorTest {

 public static void main(String[] args) {

  Collection<String> str1 = new HashSet<String>();
  //添加元素
  str1.add("Everything that you can do!");
  str1.add("if only you hard work continuely!");
  str1.add("Success will belong to you!");

  //获取str1集合对应的迭代器
  Iterator<String> it = str1.iterator();
  while(it.hasNext()){

   String str = (String)it.next();
   System.out.println(str);

   if(str.equals("Everything that you can do!"));
   it.remove();

   str = "Everything that you can do!";

   System.out.println(str);
  }
  System.out.println(str1);

 }

}

foreach循环来迭代访问Collection集合里的元素跟家简洁一点!

foreach循环迭代方位集合元素是,该集合不可改变否则将会引发ConcurrentModificationException异常!

ForeEachTest.java

package com.haixu.collection;

import java.util.Collection;
import java.util.HashSet;
/*
 * foreeach 循环来迭代Collection集合里的元素
 * */
public class ForeEachTest {

	public static void main(String[] args) {
		Collection<String> str1 = new HashSet<String>();
		//添加元素
		str1.add("Everything that you can do!");
		str1.add("if only you hard work continuely!");
		str1.add("Success will belong to you!");

		for(Object obj : str1){
			String str = (String) obj;
			System.out.println(str);

			if(str.equals("Everything that you can do!")){
				//下面的代码会引发异常
				//是故意的!
				str1.remove(str);

			}
		}
		System.out.println(str1);
	}

}

以上就是各个接口的应用和使用情况。

因为其中有一个返回值为Iterator<E>类型的iterator()方法,所以,Collection接口必须实现Iterator接口

实现Collection接口的每一个类都要实现以上众多方法,但开发者自己实现很麻烦。所以java提供了AbstractCollection类来编写具体的类。

以下类都实现了Collection接口:

AbstractCollection, AbstractList, AbstractQueue, AbstractSequentialList, AbstractSet, ArrayBlockingQueue, ArrayDeque, ArrayList, AttributeList, BeanContextServicesSupport, BeanContextSupport, ConcurrentLinkedDeque,ConcurrentLinkedQueue, ConcurrentSkipListSet, CopyOnWriteArrayList, CopyOnWriteArraySet, DelayQueue, EnumSet, HashSet, JobStateReasons, LinkedBlockingDeque, LinkedBlockingQueue, LinkedHashSet, LinkedList,LinkedTransferQueue, PriorityBlockingQueue, PriorityQueue, RoleList, RoleUnresolvedList, Stack, SynchronousQueue, TreeSet, Vector

时间: 2024-12-10 18:27:37

疯狂Java学习笔记(34)----------Iterator、Collection接口以及foreach的相关文章

疯狂Java学习笔记(61)-----------40个Java集合面试问题和答案

1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector.Stack.HashTable和Array.随着集合的广泛使用,Java1.2提出了囊括所有集合接口.实现和算法的集合框架.在保证线程安全的情况下使用泛型和并发集合类,Java已经经历了很久.它还包括在Java并发包中,阻塞接口以及它们的实现.集合框架的部分优点如下: (1)使用核心集合类降低开发成本,而非实现我们自己的集合类. (2)随着使用经过严格测试的集合框架类,代

疯狂Java学习笔记(36)-----------Set集合

Set集合 类似于一个罐子,丢进"Set",集合里的过个对象之间没有明显的顺序. Set集合与Collection集合基本上完全一样,他没有提供任何额外的方法. 实际上Set就是Collection,只是行为略有不同,Set不允许包含重复元素.允许包含值为null的元素,但最多只能有一个null元素. 常用方法 按照定义,Set 接口继承 Collection 接口,所有原始方法都是现成的,没有引入新方法.具体的 Set 实现类依赖添加的对象的 equals() 方法来检查等同性. 各

疯狂Java学习笔记(59)-----------50道Java线程面试题

50道Java线程面试题 下面是Java线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速.比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒.Java在语言层面对多线程提供了卓越的支持,它也是一个很好的卖点.欲了解更多详细信息请点击这里. 2) 线程和进程有什么区别? 线程是进程的子集,一个

【疯狂Java学习笔记】【理解面向对象】

[学习笔记]1.Java语言是纯粹的面向对象语言,这体现在Java完全支持面向对象的三大基本特征:封装.继承.多态.抽象也是面向对象的重要组成部分,不过它不是面向对象的特征之一,因为所有的编程语言都需要抽象. 2.面向对象开发方法比较结构化开发方法的优势在于可以提供更好的可重用性.可扩展性.可维护性. 3.基于对象和面向对象的区别:基于对象也使用了对象,但是无法通过现有的对象作为模板来生成新的对象类型,继而产生新的对象,也就是说,基于对象没有继承的特点.而面向对象有继承,而多态则是建立在继承的基

疯狂java学习笔记之面向对象(八) - static和final

一.static: 1.static是一个标识符: - 有static修饰的成员表明该成员是属于类的; - 没有static修饰的成员表明该成员是属于实例/对象的. 2.static修饰的成员(Field.方法.初始化块),与类共存亡:static修饰的成员建议总是通过类名来访问,虽然它也可以通过实例来访问(实质也是通过类来访问的),所以平时若在其他程序中见到通过实例/对象来访问static成员时,可以直接将实例/对象 替换成类名: 3.程序都是先有类再有对象的,有可能出现有类但没有实例/对象的

疯狂Java学习笔记(37)----------List集合

在网上找了很长时间关于List集合的资料,发现都是代码,理论性的东西太少了,对于想要深入的学习我来说,很困难呀,光看代码,不能解决问题呀!所以,自己精心的搜刮来了一点资料在这整理了一下! List集合! ·List列表 ·list: list代表有序.可重复集合,每个元素都有对应的索引,所以List集合中的元素可以重复.List集合默认暗元素的添加顺序设计元素! ·list当然也用于collection中的所有方法,并且自己也有添加了额外的方法,所有List实现类都可以调用这些方法来操作元素.L

疯狂Java学习笔记(51)-----------面试题

自己做了一点面试题,感觉很经典,分享给大家,发现还有很多东西需要学! 一.String,StringBuffer, StringBuilder 的区别是什么?String为什么是不可变的? 答:   1.String是字符串常量,StringBuffer和StringBuilder都是字符串变量.后两者的字符内容可变,而前者创建后内容不可变. 2.String不可变是因为在JDK中String类被声明为一个final类. 3.StringBuffer是线程安全的,而StringBuilder是非

疯狂Java学习笔记(87)-----------十篇必读的Java文章

1.Brian Goetz:"管理工作:发人深省的部分" 这其实不是一篇博文,而是Brian Goetz对于甲骨文公司Java的管理的一个非常有趣的讨论的记录.在 以前我们将Java语言与Scala或者Ceylon相比较的时候,对其1-2个特性一直稍微有些意见. 对于为什么Java尽快变得和其他语言一样"时髦"不是一个好主意,Brian提出了很好的观点.每一个Java开发者都应有所了解(大约一个小时). Youtube链接. 2.Aleksey Shipilёv:(

疯狂Java学习笔记(89)-----------Java习惯用法总结

在Java编程中,有些知识 并不能仅通过语言规范或者标准API文档就能学到的.在本文中,我会尽量收集一些最常用的习惯用法,特别是很难猜到的用法.(Joshua Bloch的<Effective Java>对这个话题给出了更详尽的论述,可以从这本书里学习更多的用法.) 我把本文的所有代码都放在公共场所里.你可以根据自己的喜好去复制和修改任意的代码片段,不需要任何的凭证. 目录 实现: equals() hashCode() compareTo() clone() 应用: StringBuilde