java 基础之 集合-Collection&Iterator

182 阅读5分钟

简单的集合大家庭先看一下: D19owj.png

集合框架被设计成要满足以下几个目标:

  • 该框架必须是高性能的。基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的。

  • 该框架允许不同类型的集合,以类似的方式工作,具有高度的互操作性。

  • 对一个集合的扩展和适应必须是简单的。

其实集合有两个顶级的接口就是Collection和Map两个接口,在我们使用的时候一般都是使用的其子类。进行使用,集合的操作很多这里我们直接进行看一下如何进行操作的。

Collection

Collection是描述所有序列容器的共同的根接口,他可能被认为是一个附属接口,即因为要表示其他若干个接口的共性而出现的接口。java.util.AbstractCollection类提供了Collection的默认实现。

Collection接口是List、Set和Queue接口的父接口,该接口里定义的方法既可用于操作Set集合,也可用于操作List和Queue集合。

Collection:一个独立的元素序列,这些元素都服从一条或多条规则。List必须按照插入的顺序保存元素,而Set不能有重复元素,Query按照排队规则来确定对象产生的顺序(通常与插入的顺序相同)(List,Set,Query)

public interface Collection<E> extends Iterable<E> {}

Map:一组成对的“键值对”对象,允许使用键来查找对象。将数字与对象关联,映射表允许我们使用另一个对象来查找某个对象,因此被称为关联数组。(HashMap,TreeMap)

public interface Map<K,V> {}

本篇主要说下Collection接口和我们如何使用

Conllection 方法

Collection接口里定义了如下操作集合元素的方法:

  • boolean add(Object o):该方法用于向集合里添加一个元素。如果集合对象被添加操作改变了,则返回true。

  • boolean addAll(Collection c):该方法把集合c里的所有元素添加到指定集合里。如果集合对象被添加操作改变了,则返回true。

  • void clear():清除集合里的所有元素,将集合长度变为0。

  • boolean contains(Object o):返回集合里是否包含指定元素。

  • boolean containsAll(Collection c):返回集合里是否包含集合c里的所有元素。

  • boolean isEmpty():返回集合是否为空。当集合长度为0时返回true,否则返回false。

  • Iterator iterator():返回一个Iterator对象,用于遍历集合里的元素。

  • boolean remove(Object o):删除集合中的指定元素o,当集合中包含了一个或多个元素o时,这些元素将被删除,该方法将返回true。

  • boolean removeAll(Collection c):从集合中删除集合c里包含的所有元素(相当于用调用该方法的集合减集合c),如果删除了一个或一个以上的元素,则该方法返回true。

  • boolean retainAll(Collection c):从集合中删除集合c里不包含的元素(相当于把调用该方法的集合变成该集合和集合c的交集),如果该操作改变了调用该方法的集合,则该方法返回true。

  • int size():该方法返回集合里元素的个数。

  • Object[] toArray():该方法把集合转换成一个数组,所有的集合元素变成对应的数组元素。

    Collection的构造器可以接受另一个Collection,用它来将自身进行初始化。可以使用Arrays.list()来为这个构造器产生输入。但是Collection.addAll()方法运行起来要快,可以构建一个不包含元素的Collection,然后调用Collections.addAll()方法。

    但是这个不如Arrays.asList()或Collections.addAll()灵活,这两个方法都是使用的是可变参数列表。 同样也可以使用Arrays.asList()的输出当做list,但是这个底层是数组,因此不能调整其大小,如果试图使用add()或delete()方法在这种列表中添加或删除元素,就有可能引起Unsupported Operation 的错误

      Collection<String> strings = new ArrayList<>();
      Collection<String> list = new LinkedList<>();
      Collection<String> hahsSet = new HashSet<>();
      strings.add("123");
      strings.add("1234");
      strings.add("1235");
      System.out.println(strings);
      
      // 移除
      boolean flag = strings.remove("123");
      System.out.println(flag);
      
      // 包含:
      boolean fl = strings.contains("as");
      System.out.println(fl);
      
      // 是否为空
      System.out.println(strings.isEmpty());
      // 集合大小
      System.out.println(strings.size());
      // 集合转数组
      Object[] arry= strings.toArray();
      // 清空
      strings.clear();  
    

迭代器Iterator:

Iterator接口也是Java集合框架的成员,但它与Collection系列、Map系列的集合不一样:Collection系列集合、Map系列集合主要用于盛装其他对象,而Iterator则主要用于遍历(即迭代访问)Collection集合中的元素,Iterator对象也被称为迭代器。

Iterator接口隐藏了各种Collection实现类的底层细节,向应用程序提供了遍历Collection集合元素的统一编程接口。Iterator接口里定义了如下三个方法。

  • boolean hasNext():如果被迭代的集合元素还没有被遍历,则返回true。
  • Object next():返回集合里的下一个元素。
  • void remove():删除集合里上一次next方法返回的元素。

Iterator必须依附于Collection对象,若有一个Iterator对象,则必然有一个与之关联的Collection对象。Iterator提供了两个方法来迭代访问Collection集合里的元素,并可通过remove()方法来删除集合中上一次next()方法返回的集合元素

foreach循环中的迭代变量也不是集合元素本身,系统只是依次把集合元素的值赋给迭代变量,因此在foreach循环中修改迭代变量的值也没有任何实际意义。同样,当使用foreach循环迭代访问集合元素时,该集合也不能被改变,否则将引发Concurrent ModificationException异常。 比如下面写的一个集合的遍历:

Iterator实例
public class StuManager {
	private List<Student>list;
//	   构造方法
//	泛型在类中的方法中使用
	public StuManager(List<Student>list){
		this.setList(list);
	}
//	getset方法
	public List<Student> getList() {
		return list;
	}
	public void setList(List<Student> list) {
		this.list = list;   
	}
	

//	删除学生
	public Student Delete(List<Student>  list){
//		System.out.println(list.size());
		Scanner scan=new Scanner(System.in);
		String number=scan.next();
		Iterator<Student> it = list.iterator();  
        while (it.hasNext()) { 
        	Student s=it.next();
            if(s.getNumber().equals(number)){  
            	it.remove();  
            }
        }
        System.out.println("删除后余下的学生信息");
        System.out.println(list.toString());
		return null;
	}
//	根据学生的学号来返回学生信息
	public Student Search(List<Student> list){
		int flag=0;//定义一个标志
		Scanner scan=new Scanner(System.in);
		System.out.println("请你输入你要查询的学号");
		String number=scan.nextLine();
		for(Iterator<Student> it=list.iterator();it.hasNext();){
			Student stu=it.next();
			if(stu.getNumber().equals(number)){
					System.out.println(stu.toString());
			}else{
				flag++;
			}
		}
		if(flag==list.size()){//查寻到表的末尾时,
			System.out.println("没有这个学生的信息!!");
		}
		return null;
	}
//	按姓名查询:
	public Student SearchName(List<Student> list){
		int flag=0;
		Scanner scan=new Scanner(System.in);
		System.out.println("请你输入你要查询的名字");
		String name=scan.nextLine();
		for(Iterator<Student> it=list.iterator();it.hasNext();){
			Student stu=it.next();
			if(stu.getName().equals(name)){
					System.out.println(stu.toString());
			}else{
				flag++;
			}
		}
		if(flag==list.size()){
			System.out.println("没有这个学生的信息!!");
		}
		return null;
	}
//	返回年龄排序姓名//出错误不知如何实现排序

//	根据学号或者姓名来修改
	public Student Modify(List<Student> list){
		int flag=0;
		Iterator<Student>  it=list.iterator();
		Scanner scan=new Scanner(System.in);
		System.out.println("请你输入你学号");
		String number=scan.nextLine();
		while(it.hasNext()){
			Student s=it.next();
			if(s.getNumber().equals(number)){
				System.out.println("请输入新的姓名:");
				String name=scan.nextLine();
				s.setName(name);
				System.out.println("请输入新的地址:");
				String address=scan.nextLine();
				s.setAddress(address);
				System.out.println("新的系别:");
				 String department=scan.nextLine();
				s.setDepartment(department);
				System.out.println("请输入年级:");
				String grade =scan.next();
				s.setGrade(grade);
				System.out.println("请输入总成绩:");
				double score=scan.nextDouble();
				s.setScore(score);
//				System.out.println(s.toString());	
			}else{
				flag++;
			}
		}if(flag==list.size()){
			System.out.println("没有这个学生的信息");
		}
		
		return null;
	}
}
ListIterator:

ListIterator是一个更加强大的iterator的子类型。他只能用于各种list的访问,尽管iterator只能向前移动,而ListIterator可以双向移动,他还可以产生相对于迭代器在列表中指向当前一个和后一个元素的索引,并且可以使用set()方法替换它访问过的最后一个元素。

public class ListIterator {
	List<Pet> pets = Pets.arrayList(8);
	ListIterator<Pet> it = pets.listIterator();
	while(it.hasNext()){
		System.out.println(it.next()+","+ite.nextIndex()+","+it.previousIndex()+";");
	}
	while(it.hasPrevious()){
		System.out.print(it.previous().id()+" ")
	}
	it = pets.listIterator(3);
	while(it.hasNext()){
		it.next();
		it.set(Pets.randmomPet());
	}
}
集合遍历常见的问题及错误:

参看个人博客总结:blog.csdn.net/qq_37256896…

这个说的是比较全面的了www.cnblogs.com/chenpi/p/55…