黑马程序员_集合之Collection接口

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流------

1.集合的概述
集合的由来:
		我们学习的java语言是面向对象的语言, 而面向对象的语言对事物的描述都是通过对象体现的,那么为了方便的操作多个对象
  我们应该将多个对象存储起来! 那么既然要存储多个对象,我们就需要使用一个容器类型的变量进行存储! 
  那么到目前为止我们都学过那些容器呢?  
  数组 : 不能满足我们变化的需求
 字符串缓冲区 : 字符串缓冲区返回的都是字符串
  数组 ,字符串缓冲区都不能满足我们的需求那么怎么办呢? 这个时候java就给我们提供集合!
 
 
 集合和数组的区别:
 		a: 长度的区别
  			数组的长度是固定的
  			集合的长度是可变的
  		b: 存储数据类型的区别
  			数组可以存储基本数据类型,也可以存储引用数据类型(对象数组)
  			集合只能存储引用数据类型
  		c: 内容区别
  			数组只能存储同一种数据类型的元素
  			集合可以存储不同种 数据类型的元素
  
  我们都知道,集合是用来存储多个元素的,那么即使是存储多个元素,有的时候我们的需求也是不同的,比如: 排序 . 针对不同的需求
 java就给我们提供了不同的集合,而这些集合的数据结构不同.而数据结构不同不重要,重要的是你都可以帮我们存储数据,而且我们
  还可以使用这些数据,由此可见这些集合类之间就存在共性的内容,有共性的内容的内容我们因该将其向上抽取,就形成了集合的继承体系
  
  数据结构:	存储数据的方式
  Collection:	Collection 层次结构 中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。
  				一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。
  				JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现。
  Collection的功能概述:
  		a: 添加功能
  			boolean add(Object obj)	:			添加一个元素
  			boolean addAll(Collection c):		添加一个集合的元素
 		b: 删除功能
  			void clear():						移除此 collection 中的所有元素(可选操作)。
 			boolean remove(Object o):			删除一个元素
  			boolean removeAll(Collection c):	删除一个集合的元素,删除一个以上算是删除还是删除所有的算是删除?
  		c: 获取功能
  			Iterator iterator():		迭代器(重点)
  		d: 判断功能
  			boolean contains(Object o):			判断是否包含指定的元素
  			boolean containsAll(Collection c):	判断是否包含一个集合的元素,包含一个以上算是包含,还是包含所有的算是包含呢?
  			boolean isEmpty():					判断集合是否为空
  		e: 长度功能
  			int size():					获取集合的长度
  		f: 获取交集的功能
  			boolean retainAll(Collection c):	获取交集,获取到的交集元素去哪里了,返回的boolean类型的值表示神马意思?
  		g: 集合转数组的功能
  			Object[] toArray():
 
 注意 : 集合转数组的功能
 	 import java.util.ArrayList;
import java.util.Collection;

  //集合转数组的功能 : Object[] toArray():

Collection举例练习
public class CollectionTest {
	
	public static void main(String[] args) {
		
		// 创建集合对象
		Collection c = new ArrayList() ;
		
		// 添加元素
		c.add("hello");				
		c.add("world");
		c.add("java");
		
		// 首先将集合转换成数组,调用toArray方法
		Object[] objs = c.toArray() ;
		
		// 遍历数组
		for(int x = 0 ; x < objs.length ; x++){
			
			// 因为在Object中没有length()所以就报错了
			// System.out.println(objs[x].length());
			
			// 向下转型:多态的形式
			String s = (String)objs[x] ;
			
			// 输出
			System.out.println(s + "----" + s.length());
		}
		
	}

}

2迭代器:
迭代器:		Iterator iterator()
	Iterator遍历使用的两个方法:		
			boolean hasNext(): 判断是否存在元素
 			Object next():	获取元素,并将指针向后移动一位
 
 使用集合存储自定义对象,使用迭代器进行遍历
  
  分析:
  		a: 定义一个类	(Person)
  		b: 创建集合对象
 		c: 创建自定义对象
  		d: 向集合中添加自定义对象(元素)
 		e: 遍历
 			(1): 获取迭代器对象
 			(2): 使用迭代器遍历

练习:
 (1)使用集合存储字符串并使用迭代器进行遍历
class CollectionTest01{
 
 	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 str = (String)it.next();
	 		  
	 		  //输出
	 		  System.out.println(str);
		  }
 	}
 }
 

(2)使用集合存储自定义学生类并使用迭代器进行遍历
//创建学生类
 public class Student {
	
	private String name ;
	
	private int age ;

	public Student() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

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

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
}

 //测试类

public class CollectionTest02 {

	public static void main(String[] args){
	
		//创建集合对象
		Collection c = new ArrayList();
		
		//创建学生对象
		Student s1 = new Student("小强" , 24);
		Student s2 = new Student("小迪" , 21);

		//添加元素
		c.add(s1); 
		c.add(s2); 
		
		//创建迭代器对象
		Iterator it = c.iterator();
	
		//使用循环
		while(it.hasNext()){
		
			//向下转型
			Student s = (Student)it.next();
			
			//输出
			System.out.println(s.getName() + "----" + s.getAge());
		}
	}
}

3 List集合的特点以及遍历方式:
List是Collection的一个子接口, 在该接口中元素是有序(存储和取出的顺序)的,并且元素可以重复 .
 
 List集合遍历方式
 (1)使用List存储自定义对象,然后使用迭代器进行遍历
	分析:
 		(1): 自定义一个类
 		(2): 创建集合对象
 		(3): 创建自定义对象
 		(4): 把自定义对象添加到集合中
 		(5): 使用 迭代器进行遍历
 			  a: 获取迭代器
 			  b: 遍历	

 //遍历举例同上,只是创建集合对象将Collection改为List
 
 (2)List集合特有的遍历方式: 使用get方法以及size方法来完成
代码实现为:
class ListTest{
 
 	public static void main(String[] args){
 	
 		//创建List集合对象
 		List list = new ArrayList();
 		
 		//添加元素
 		list.add("hello");
 		list.add("world");
 		list.add("java");
 		
 		//遍历
 		for(int i = 0 ; i < list.size() ; i++){
 			
 			//向下转型
 			String result = (String)list.get(i);
 			
 			//输出
 			System.out.println(result);
 		}
 		
 		//使用List特有的迭代器遍历 :ListIterator
	
		// ListIterator listIterator()
		ListIterator it = list.listIterator() ;
		
		// 遍历
		while(it.hasNext()){
			System.out.println(it.next());
		}
 	}
 }
 
 

4 集合中元素的修改方法
集合中元素的修改:
 迭代器是依赖于集合存在的.	在获取迭代器的时候之前已经添加过元素了,而在遍历的时候,使用的迭代器进行遍历.
 	而往集合中添加元素的时候,使用的集合在添加元素,这时候迭代器不知道其修改了集合.
  	一句话: 迭代器在遍历集合的时候使用集合来修改元素
  	
  处理方案:
  		a:  迭代器在遍历的时候使用 迭代器修改元素
  		b:  集合自身遍历的时候,只能使用集合修改元素

5 list集合3个子类的特点
list集合3个子类的特点:
 ArrayList
	底层是靠数组实现的:	查询快, 增删慢
	线程不安全 , 效率高
Vector
	底层是靠数组实现的:	查询快, 增删慢
	线程安全 ,效率低
LinkedList
	底层是靠链表实现的:	查询慢, 增删快
	线程不安全 , 效率高

在以后的开发中到底使用哪个集合呢?
	看需求
	
	要安全吗?
		要:	Vector
		不要: LinkedList 或者 ArrayList
			查询多还是增删多呢?
				查询多:	ArrayList
				增删多:	LinkedList

如果不明白,就使用ArrayList

你可能感兴趣的:(黑马程序员_集合之Collection接口)