javaAPI_集合基础_Collection
集合基础1_集合概述以及Collection集合
1.为什么会出现集合?
  我们学习的是面向对象语言,而面向对象语言对事物的描述是通过对象体现的,为了方便对多个对象进行操作,我们就必须把这多个对象进行存储。
  而要想存储多个对象,就不能是一个基本的变量,而应该是一个容器类型的变量,在我们目前所学过的知识里面,有哪些是容器类型的呢?
  数组和StringBuffer。但是呢?StringBuffer的结果是一个字符串,不一定满足我们的要求,所以我们只能选择数组,这就是对象数组。
  而对象数组又不能适应变化的需求,因为数组的长度是固定的,这个时候,为了适应变化的需求,Java就提供了集合类供我们使用。
2.数组和集合的区别?
    A:长度区别
  	  数组的长度固定
  	  集合长度可变
  	B:内容不同
  	  数组存储的是同一种类型的元素
  	  而集合可以存储不同类型的元素
  	C:元素的数据类型问题	
  	  数组可以存储基本数据类型,也可以存储引用数据类型
  	  集合只能存储引用类型
  
3.java集合以及体系
   
   
4.Collection类
  (1).Collection类的概述
      Collection:是集合的顶层接口,它的子体系有重复的,有唯一的,有有序的,有无序的。
  (2).Collection类的常用功能
  
       A:添加功能
  		boolean add(Object obj):添加一个元素
  		boolean addAll(Collection c):添加一个集合的元素
		
       B:删除功能
  		void clear():移除所有元素
  		boolean remove(Object o):移除一个元素(移除指定元素)
  		boolean removeAll(Collection c):移除一个集合的元素(只要有一个元素被移除了,那么就返回true)
		
       C:判断功能
  		boolean contains(Object o):判断集合中是否包含指定的元素
  		boolean containsAll(Collection c):判断集合中是否包含指定的集合元素(必须要包含全部)
  		boolean isEmpty():判断集合是否为空
		
       D:获取功能
  		Iterator<E> iterator()(重点):迭代器,集合遍历的特有方式
		E next():获取元素,并移动到下一个位置。
		boolean hasNext():是否还有下一个元素
		
       E:长度功能
  		int size():元素的个数
  		           面试题:数组有没有length()方法呢?字符串有没有length()方法呢?集合有没有length()方法呢?
		
       F:交集功能
  		boolean retainAll(Collection c):两个集合都有的元素,获取俩个集合的交集,谁调用该方法,那么元素就会跑去那一个集合中。
		                                也就是说集合A和集合B做交集,最终结果保存在A中,B集合内容不变,返回值表示的是A集合中
										的内容是否发生过改变。
		
       G:把集合转换为数组
  		Object[] toArray():集合转化为素组,这样可以实现对集合的遍历
  (3).基本功能测试
      public static void main(String[] args) {
		//创建Collection对象,由于Collection是一个接口,所以是不能够实例化的,所以能够使用其子类对象
		Collection c = new ArrayList<>(); 
		c.add("hello");
		c.add("world");
		c.add("java");
		//清空集合
		//c.clear();
		
		//移除指定元素
		//c.remove("hello");
		
		//判断是否包含指定元素
		c.contains("hello");
		
		//判断集合是否为空
		c.isEmpty();
		
		//获取元素个数
		c.size();
	}
	
	
	(4).Collection集合并遍历对象(迭代器)
	    public static void main(String[] args) {
		//创建Collection对象,由于Collection是一个接口,所以是不能够实例化的,所以能够使用其子类对象
		Collection c = new ArrayList<>(); 
		c.add("hello");
		c.add("world");
		c.add("java");
		
		//lterator是一个接口,实际返回的是它的子类对象
		//注意,由于next在调用一次之后,就会移动到下一个对象上面去,所以不要多次的调用next()方法
		Iterator lt = c.iterator();
		while(lt.hasNext()){
			String str = (String) lt.next();
			System.out.println(str);
		}
		
		System.out.println("--------------------------");
		//使用for循环同样可以获得相同的效果,同时lt1在循环完毕就是垃圾,可以提高一点效率
		for(Iterator lt1 = c.iterator();lt1.hasNext();){
			String str = (String) lt1.next();
			System.out.println(str);
		}
	 }
	
	
	(5).迭代器原理
	    A:迭代器是依赖于集合而存在的。
		
		B:迭代器为什么不定已成为一个类,而是定义成为一个接口?
		  假设迭代器定义的是一个类,这样,我们就可以创建该类的对象,并调用该类的方法来实现集合的遍历。但是呢?我们应该思考一个这
		  样的问题。由于java中提供了很多的集合类。而这一些集合类的数据结构是不同的,所以,存储的方式和遍历的方式应该是不一样的。
		  进而他们的遍历方式也应该是不一样的,最终就没有定义迭代器类。
		  而无论你是哪一种集合,都应该具备获取元素的操作,并且,最好在辅助有判断功能,这样在获取前,先判断。这样就不会容易出错。
          也就是说判断和获取功能是每一个集合遍历的时候锁具备的。而每一种集合的方式又不太一样,所以设计者们就把这几个功能提取出来
          并不提供实现,这一种方式就是接口。
          那么,真正的具体的实现类是在哪里呢?
          在真正的具体的子类中,以内部类的方式体现的。
        C:迭代器源码
          a:collection集合继承了一个父接口
             public interface Collection<E> extends Iterable<E> {....}
          b:Iterable接口中只有一个方法
            public interface Iterable<T> {
                          Iterator<T> iterator();
            }		  
	      c:Iterator接口中有三个抽象方法(注意:抽象方法要求继承子类必须继承并重写)
		    //接口中中的方法存在默认修饰符:public abstract
		    public interface Iterator<E> {   
                   boolean hasNext(); 
                   E next();
                   void remove();
            }
	      d:Collection要实现上述三个方法(hasNext(),next(),remove()),但是并没有在Collection中给出具体的实现。
		     那么为什么呢?具体的实现又是在哪里?
			 因为Collection是一个接口,不给出具体实现。
			 我们在创建对象的时候是:Collection c = new ArrayList();那么,我们就往ArrayList里面找,它应该是给出了具体实现。
          e:看ArrayList中的iterator()方法 
             public Iterator<E> iterator() {
                    return new Itr();
             }		  
		  f:这一个时候,我们发现返回的是一个: new Itr();这是一个接口,居然能够作为返回值,那么也就是说这里面一定给出了具体的实现
		  
		  g:Itr()方法 
		     private class Itr implements Iterator<E> {...}//一个内部类,实现了haNext(),next(),remove()方法。
		  
		  
    (6).一个Collection的代码练习:
	    //省略学生对象
		
	public static void main(String[] args) {
      Collection c = new ArrayList<>();
      
      Student s = new Student();
      s.setName("张三");
      s.setAge(12);
      
      Student s1 = new Student();
      s1.setName("李四");
      s1.setAge(13);
      
      //添加元素
      c.add(s);
      c.add(s1);
      
      Iterator lt = c.iterator();
      while (lt.hasNext()) {
		Student getStudent = (Student) lt.next();
		System.out.println(getStudent.getName()+"------"+getStudent.getAge());
		
	  }
                    
                
                
            
        
浙公网安备 33010602011771号