一.集合和数组的区别
(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方法 否则输出的是地址。