JAVA---------集合(二)

来源:互联网 发布:java 网络爬虫demo 编辑:程序博客网 时间:2024/05/17 21:02


一、Iterator 

       上一篇学习了集合的简单概念,这一节来学习一个新的方法:iterator()方法。对于Collection接口的实现类来说由于其具体作用和实 现的不同导致我们遍历他们的方法不能很好的统一。但是JAVA给我们提供了一个方案。通过集合接口的实现类对象的iterator方法可以返回对 其自己(该实现类)的遍历对象, 返回的对象赋给Iterator接口的引用,也就是是通过父类引用来指向子类对象。通过该对象对象封装的方法我们就可以遍历整个集合了,Iterator也被称为迭代器。

通过一个简单的代码了解下它的简单使用。

package CollectionDemo;
import java.util.*;//与集合有关的类借口或类都保存在java.util包下
public class IteratorDemo {


public static void main(String[] args){
/*
* Set接口的特点是里面保存的对象是无序且不能重复的
* HashSet是Set接口的一个实现类。
* */
Collection data=new HashSet();//HashSet是用Hash表实现的Set.
data.add(new Person("xiaoming",11,"nan"));
data.add(new Person("xiaozhang",12,"nan"));
data.add(new Person("xiaohong",13,"nv"));
//    data.add(new Person("xiaohong",13,"nv"));
/*
*  通过集合借口的实现类对象的iterator方法可以返回对 其自己(该实现类)的遍历对象
*  返回的对象赋给Iterator接口的引用,也就是是通过父类引用来指向子类对象。
*  我们可以通过data.iterator()方法返回类里的一些方法对该集合进行相应的遍历操作。
*  
**/
Iterator iterator=data.iterator();
while(iterator.hasNext())
{
Person person=(Person)iterator.next();
System.out.println(person);
person=null;
}
}


}


//定义一个Person类
class Person{
private String name;
private int age;
private String sex;


public Person(String mname,int mage, String msex){
this.name=mname;
this.age=mage;
this.sex=msex;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]";
}

public String getName() {
return name;
}


public void setName(String name) {
this.name = name;
}


public int getAge() {
return age;
}

}

这里我们注意到两个新的方法。hasNext(),next(),这两个方法都是迭代器对象给我们提供的。

hasnext():判断集合的下一个位置是否有元素,其返回值是一个布尔类型的值。如果有则返回true,反之false。

next():返会集合下一个对象的值,并将指针后移一位。

通过一个不停的判断,取值。就可以简单的遍历整个集合。

注意:通过迭代器实现遍历。会给集合对象上锁,只有持有该锁的对象才可以对集合进行操作。锁的相关知识在线程那节会有详细的讲解。

二、增强的for循环

       如下代码:
package CollectionDemo;
import java.util.*;
public class EnchancedDemo {

public static void main(String[] args) {

Set set=new HashSet();
set.add("A");
set.add("B");
set.add("C");
for(Object o:set){
System.out.println(o);
//set.remove("A");
}
System.out.println(set);
}


}

   :前面的是我们从集合中取出的对象,:后面是遍历的集合,通过增强的for循环可以简单的实现遍历整个集合。但通常我们不会这么做,虽然用这种增强的for循环简化了代码,但是却也给我们带来了许多的弊端。
     首先我们不易获取到对象对应的下标,当然我们可以定义一个变量每次循环都加1,但是太麻烦了。
     其次我们不易对这个集合中的对象做其他操作,比如当我们将//set.remove("A");取消注释。我们会发现根本无法移除这个对象。其实道理很简单,增强的for循环底层有用iterator实现。使用迭代器会将集合中的对象上锁(锁是和线程有关的知识),其他的对象就无法对其进行操作,只有迭代器本身可以操作。
     下一节对Collections类进行学习记录,该类对于 List接口实现类的操作有很大的作用,其封装了一些对List接口实现类操作的算法。如排序、二分查找等。