集合_01_Collection

一.集合和数组的区别

(1)长度有区别  数组长度是固定的  集合长度是可变化的

(2)内容不同   数组存储的同一种类型的元素  集合可以存储不同类型的元素

(3)类型不同  数组可以存储基本数据类型也可以存储引用数据类型   集合只能存储引用类型

二.Collection

  Collection这是集合的最顶层的类接口

三.Collection的功能

1.添加功能
  boolean add(Object object)   //添加一个元素
  boolean addAll(Collection c)//添加多个元素
 2.删除功能
  void clear() //移除此 collection 中的所有元素
  boolean remove(Object o) //移除一个元素
  boolean removeAll(Collection c)//移除多个元素 
 3.获取功能
  Iterator iterator()//获取迭代器
 4.判断功能
  boolean contains(Object o) //判断集合中是否有此元素
  boolean containsAll(Collection c) //判断集合中是否有此集合中的元素
  boolean isEmpty() //判断集合是否为空
 5.长度功能
  int size() //返回集合中的元素个数
 6:交集功能
  boolean retainAll(Collection c) //求交集
 7:把集合转换为数组

  Object[] toArray() //把集合转换为一个数组

import java.util.ArrayList;
public class CollectionDemo {

	public static void main(String[] args) {
		//创建集合对象
		Collection c = new ArrayList();  //多态
		//c = null;
		//boolean add(Object object)   //添加一个元素
//		c.add("hello");
//		c.add("world");
//		c.add("java");
		//System.out.println("add:"+c.add("hello"));
		//System.out.println("add:"+c.add("hello"));
		
		//void clear() //移除此 collection 中的所有元素
		//c.clear();
		
		//boolean remove(Object o) //移除一个元素
		
//		System.out.println("remove:"+c.remove("hello"));
//		System.out.println("remove:"+c.remove("javaee"));
		
		//boolean contains(Object o) //判断集合中是否有此元素
//		System.out.println("contains:"+c.contains("hello"));
//		System.out.println("contains:"+c.contains("javaee"));
		
//		Object[] objects = c.toArray();
//		System.out.println("objects.length:"+objects.length);
//		for(int i=0;i<objects.length;i++){
//			System.out.println(objects[i]);
//		}
		//int size() //返回集合中的元素个数
		//boolean isEmpty() //判断集合是否为空
		System.out.println("isEmpty:"+c.isEmpty());
		
		System.out.println("size:"+c.size());
		System.out.println("c:"+c);
		
	}

}

 
 
 
 

四.集合和集合之间的功能  即带All 的

import java.util.ArrayList;
import java.util.Collection;

/*
 * 1.添加功能
 	boolean addAll(Collection c)	//添加多个元素(一个还是所有)
 2.删除功能
 	boolean removeAll(Collection c)	//移除多个元素 (一个还是所有)
 4.判断功能
 	boolean containsAll(Collection c) //判断集合中是否有此集合中的元素(一个还是所有)
 6:交集功能
 	boolean retainAll(Collection c) //求交集
 7:把集合转换为数组
 	Object[] toArray() //把集合转换为一个数组
 */
public class CollectionDemo2 {

	public static void main(String[] args) {
		Collection c1 = new ArrayList();
		c1.add("abc1");
//		c1.add("abc2");
//		c1.add("abc3");
//		c1.add("abc4");
		
		Collection c2 = new ArrayList();
//		c2.add("abc1");
//		c2.add("abc2");
//		c2.add("abc3");
//		c2.add("abc4");
		c2.add("abc5");
		c2.add("abc6");
		c2.add("abc7");
		//boolean addAll(Collection c)	//添加多个元素(一个还是所有)
		//c1.addAll(c2);
		
		//System.out.println("addAll:"+c1.addAll(c2));
		
		//boolean removeAll(Collection c)	//移除多个元素 
		//System.out.println("removeAll:"+c1.removeAll(c2));
		
		//boolean containsAll(Collection c) //判断集合中是否有此集合中的元素
		//System.out.println("containsAll:"+c1.containsAll(c2));
		
		//boolean retainAll(Collection c) //求交集
		System.out.println("retainAll:"+c1.retainAll(c2));
		
		System.out.println("c1:"+c1);
		System.out.println("c2:"+c2);
		
	}

}

五.遍历集合

(1)字符串的  采用的是数组的方式

import java.util.ArrayList;
import java.util.Collection;

/*
 * 遍历集合,其实就是获取集合中的每个元素
 * 	
 * 	Object[] toArray() //把集合转换为一个数组
 */
public class CollectionDemo {

	public static void main(String[] args) {
		Collection c = new ArrayList();
		c.add("hello");  //String -- Ojbect 向上转型
		c.add("world");
		c.add("java");
		
		Object[] objects = c.toArray();
		for(int i=0;i<objects.length;i++){
			//System.out.println(objects[i]);
			//我知道集合中放的是字符串
			//输出字符串内容的同时,我想输出字符串的长度
			String s = (String)objects[i]; //向下转型
			//System.out.println(objects[i]+"---"+objects[i].length());
			System.out.println(s+"---"+s.length());
		}
	}

}

(2)集合遍历__学生对象,利用数组遍历那个方法

import java.util.ArrayList;
import java.util.Collection;

/*
 * 需求:用集合存储5个学生对象,并把学生对象进行遍历
 * 
 * 分析:
 *   A.创建学生类
 *   B.创建集合对象
 *   C.创建5个学生对象
 *   D.把c步骤的元素放到集合中
 *   E.把集合转换为数组
 *   F.遍历数组
 */
public class CollectionDemo2 {

	public static void main(String[] args) {
		Collection c = new ArrayList();
		Student s1 = new Student("张一",20);
		Student s2 = new Student("张二",20);
		Student s3 = new Student("张三",20);
		Student s4 = new Student("张四",20);
		Student s5 = new Student("张五",20);
		
		c.add(s1); //向上转型
		c.add(s2);
		c.add(s3);
		c.add(s4);
		c.add(s5);
		
		Object[] array = c.toArray();
		for(int i=0;i<array.length;i++){
			//System.out.println(array[i]);
			
			Student s = (Student)array[i]; //向下转型
			System.out.println(s.getName()+"--"+s.getAge());
		}
	}

}

public class Student {
	private String name;
	private int age;
	public Student() {
		super();
	}
	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;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
	
	
}

六.迭代器

集合的专用遍历方式

(1)遍历字符串  采用迭代器

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/*
 * Iterator iterator() //迭代器,集合的专用遍历方式
 *	
 *Iterator接口中的方法:
 *
 *	boolean hasNext() //如果仍有元素可以迭代,则返回 true
 *	
 *	Object next() //返回迭代的下一个元素
 *	//java.util.NoSuchElementException
 *
 *  void remove() //从迭代器指向的集合中移除迭代器返回的最后一个元素
 *	
 *
 */
public class CollectionDemo {

	public static void main(String[] args) {
		Collection c = new ArrayList();
		c.add("hello");
		c.add("world");
		c.add("java");
		
		Iterator it = c.iterator();  //多态。c.iterator()方法返回Iterator接口的一个子类对象
		//Object obj = it.next();
//		System.out.println(it.next());
//		System.out.println(it.next());
//		System.out.println(it.next());
//		System.out.println(it.next());
//		System.out.println(it.next());
		
//		if(it.hasNext()){
//			System.out.println(it.next());
//		}
//		
//		if(it.hasNext()){
//			System.out.println(it.next());
//		}
//		
//		if(it.hasNext()){
//			System.out.println(it.next());
//		}
//		
//		if(it.hasNext()){
//			System.out.println(it.next());
//		}
//		
//		if(it.hasNext()){
//			System.out.println(it.next());
//		}
		
		//最终版的遍历
		while(it.hasNext()){
				//System.out.println(it.next());
				
				//获取字符串内容的同时,获取字符串长度
				String s = (String)it.next();
				//System.out.println(it.next()+"---"+it.next());
				System.out.println(s+"---"+s.length());
		}
	}
}

(2)遍历学生类 用的是迭代器

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/*
 * 需求:用集合存储5个学生对象,遍历集合获取学生信息。使用迭代器进行遍历
 * 
 * 分析:
 *  A.创建一个学生类
 *  B.创建集合
 *  C.创建5个学生对象
 *  D.把c步骤的元素添加到集合中
 *  E.获取集合的迭代器
 *  F.通过迭代器遍历
 *  
 *  使用迭代器的两个问题研究
 * 		问题1.能用while循环写这个程序,能不能用for循环写呢?
 * 		问题2.在while循环中不要多次使用it.next()方法,因为每次使用都会指向一个对象
 */
public class CollectionTest {

	public static void main(String[] args) {
		Collection c = new ArrayList();
		
		Student s1 = new Student("张一",20);
		Student s2 = new Student("张二",20);
		Student s3 = new Student("张三",20);
		Student s4 = new Student("张四",20);
		Student s5 = new Student("张五",20);
		
		c.add(s1);
		c.add(s2);
		c.add(s3);
		c.add(s4);
		c.add(s5);
		
//		Iterator it = c.iterator();
//		
//		while(it.hasNext()){
//			//System.out.println(it.next());
//			//it.next().getName();
//			Student s = (Student)it.next();
//			System.out.println(s.getName() + "---" + s.getAge());
//		}
		
//		for(Iterator i = c.iterator();i.hasNext();){
//			System.out.println(i.next());
//		}
		
		
		Iterator it = c.iterator();
		
		while(it.hasNext()){
			//Student s = (Student)it.next();
			System.out.println(((Student)it.next()).getName() + "---" + ((Student)it.next()).getAge());
		}
	}

}

七.程序存在问题  与迭代器的六中两个问题

 当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。 
 * 产生的原因:
 * 迭代器是依赖于集合而存在的,在判断成功后,集合的中新添加了元素,而迭代器却不知道,所以就报错了,这个错叫并发修改异常。
 * 其实这个问题描述的是:迭代器遍历元素的时候,通过集合是不能修改元素的。
 * 如何解决呢?
 * 解决:
 * 方案1:
 * 用迭代器遍历,用迭代器修改
 * 元素是跟在刚才迭代的元素后面的。
 * 方案2:
 * 用for循环遍历,用集合修改
 * 元素在最后添加的。

java.util.ConcurrentModificationException
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
/*
 * 需求:判断集合中是否有"world",如果有就添加"javaee"
 * 
 * java.util.ConcurrentModificationException
 */


public class CollectionTest2 {

	public static void main(String[] args) {
		Collection c = new ArrayList();
		c.add("hello");
		c.add("world");
		c.add("java");
		
		Iterator it = c.iterator();  //多态,返回ArrayList中的内部类对象,这个内部类是实现了Iterator接口
		
		while(it.hasNext()){
			String s = (String)it.next();
			if(s.equals("world")){
				c.add("javaee");
			}
		}
		System.out.println("c"+c);
	}

}

(2)迭代器的执行过程

有一个注意点   每调用一次 it.next()方法 箭头就会执行一次。就是往下挪一次。  提示:it 是用来接收的那个名字。

采用get name  和get age 时候 ,就容易出现 张一 20,  张三 。跳过了张二,就是因为上面这个原因。

(2)retainAll这个 无法比较的时候才会输出false  S1,S2  S1.retainAll(S2);    S1和S2都不相同也是true

         S1=null;  此时输出false 没法比较。

领悟

(1)会用那个get  set方法

(2)注意要去重写tostring方法  否则输出的是地址。

猜你喜欢

转载自blog.csdn.net/latesummer_/article/details/80170089