本文共 7643 字,大约阅读时间需要 25 分钟。
案例一:需求:5个学生请把这5个学生的信息存到数组中,遍历数组,获取每一个学生信息
第一步:创建Student类public class Student { private String name; private int 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 Student() { super(); } public Student(String name, int age) { super(); this.name = name; this.age = age; }//注意此处一定要写一个toString方法,//否则打印出的结果会是对象数组的单个地址 @Override public String toString() { return "Student [name=" + name + ", age=" + age + "]"; }}
第二步:主函数
public class ObjectArray { public static void main(String[] args) { // TODO Auto-generated method stub //int[]arr = new int[5]; //创建基本数据类型 Student [] arr = new Student[5]; //创建引用数据类型 arr[0]=new Student("张三",11); //创建一个学生对象,存储在数组的第一个位置 arr[1]=new Student("李四",12); //创建一个学生对象,存储在数组的第二个位置 arr[2]=new Student("王二",13); //创建一个学生对象,存储在数组的第三个位置 arr[3]=new Student("汾九",14); //创建一个学生对象,存储在数组的第四个位置 for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } }}
效果如下:
tips:数组中存储的并不是对象,而是存储的是记录对象地址值。当我们new是我们在是在内存中的堆中存储
集合的由来
数组长度是固定,当添加的元素超过了数组的长度时需要对数组重新定义,太麻烦,java内部给我们提供了集合类,能存储任意对象,长度是可以改变的,随着元素的增加而增加,随着元素的减少而减少数组和集合的区别
数组和集合什么时候用
如果元素个数是固定的推荐用数组,如果元素个数不是固定的推荐用集合.集合框架的体系结构图(该图很重要)
基本功能演示
Collection collection =new ArrayList(); //父类引用指向子类对象 boolean b1 =collection.add("abc"); boolean b2 =collection.add(true); //自动装箱 new Boolean() boolean b3 =collection.add(100); boolean b4 =collection.add(new Student("zhangsan",123)); boolean b5 =collection.add("abc"); //当存储重复的时候ArrayList方法永远返回true, //但是Collection方法中List集合添加对象返回true即可 //但是set集合不能放置重复对象 System.out.println(b1); System.out.println(b2); System.out.println(b3); System.out.println(b4); System.out.println(b5); System.out.println(collection.toString()); //ArrayList中没有toString方法的重写,但是父类有toString()方法
效果如下:
2. boolean remove(Object o)
删除指定元素
Collection collection =new ArrayList(); collection.add("a"); collection.add("b"); collection.add("c"); collection.add("d"); collection.remove("b"); System.out.println(collection.toString()); //删除指定元素
效果如下:
Collection collection =new ArrayList(); collection.add("a"); collection.add("b"); collection.add("c"); collection.add("d"); //collection.remove("b"); collection.clear(); //清空集合 System.out.println(collection.toString()); //删除指定元素
效果如下:
Collection collection =new ArrayList(); collection.add("a"); collection.add("b"); collection.add("c"); collection.add("d");//collection.remove("b"); //collection.clear(); //清空集合collection.contains("c"); //判断是否包含某某 System.out.println(collection.toString()); //删除指定元素
效果如下:
返回true 5. boolean isEmpty() 判断集合是否为空,如果为空返回true,如果不为空返回false 6. int size() 输出集合的长度,几个元素表示几个长度其实就是依次获取集合中的每一个元素,把集合转成数组,可以实现集合的遍历
运用 toArray()方法。该方法不常用,但是有方法往这边转换public static void main(String[] args) { //demo1(); Collection collection =new ArrayList(); collection.add(new Student("张三",12)); //Object obj = new Student("张三",12);父类引用指向子类 collection.add(new Student("李四",13)); collection.add(new Student("王五",14)); Object[] arr =collection.toArray(); //将集合转为数组 for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); Student s =(Student)arr[i]; //向下转型 System.out.println(s.getName());//报错,因为存放在数组的时候,已经转换为Object[]数组,虽然存储了Student的对象,但是已经提升为Object//这就是多态的弊端,不能使用子类特有的属性和行为。所以我们需要把Object数组中存储的Object类型的对象,//向下转型。 } } private static void demo1() { Collection collection = new ArrayList(); collection.add("a"); collection.add("b"); collection.add("c"); collection.add("d"); Object[] arr =collection.toArray(); //将集合转换为数组 for (int i = 0; i < arr.length; i++) { System.out.print(arr[i]); } }
报错,因为存放在数组的时候,已经转换为Object[]数组,虽然存储了Student的对象,但是已经提升为Object
这就是多态的弊端,不能使用子类特有的属性和行为。所以我们需要把Object数组中存储的Object类型的对象, //向下转型。
1. boolean addAll(Collection c)
Collection collection1 = new ArrayList(); collection1.add("a"); collection1.add("b"); collection1.add("c"); Collection collection2 = new ArrayList(); collection2.add("d"); collection2.add("e"); collection2.add("f"); collection1.addAll(collection2);//如果我们写成了collection1.add(collection2); //此时会把集合2当成一个对象添加到集合1中System.out.println(collection1); //将集合2 放到集合1 中
效果如下:
Collection collection1 = new ArrayList(); collection1.add("a"); collection1.add("b"); collection1.add("c");Collection collection2 = new ArrayList(); collection2.add("a"); collection2.add("b"); collection2.add("z");boolean b = collection1.removeAll(collection2); System.out.println(b); System.out.println(collection1);
效果如下:
Collection collection1 = new ArrayList(); collection1.add("a"); collection1.add("b"); collection1.add("c"); Collection collection2 = new ArrayList(); collection2.add("a"); collection2.add("b"); collection2.add("b"); boolean b = collection1.removeAll(collection2); //判断调用的集合是否包含传入的集合 System.out.println(b); System.out.println(collection1);
效果如下:
Collection collection1 = new ArrayList(); collection1.add("a"); collection1.add("b"); collection1.add("c"); Collection collection2 = new ArrayList(); collection2.add("a"); collection2.add("b"); collection2.add("z"); boolean b = collection1.retainAll(collection2); // System.out.println(b); System.out.println(collection1);
效果如下:
如果collection2和collection1相同就返回false。
迭代器概述
集合是用来存储元素,存储的元素需要查看,那么就需要迭代(遍历),迭代就是遍历Collection collection1 =new ArrayList(); collection1.add("a"); collection1.add("b"); collection1.add("c"); //对集合的元素迭代(遍历) Iterator it =collection1.iterator(); //获取迭代器 boolean b1 = it.hasNext(); //判断集合中是否有元素,有就返回false Object object1 =it.next(); System.out.println(b1); System.out.println(object1); boolean b2 = it.hasNext(); //判断集合中是否有元素,有就返回false Object object2 =it.next(); //指针会向后移动一位 System.out.println(b1); System.out.println(object2);
效果如下:
// TODO Auto-generated method stub Collection collection1 =new ArrayList(); collection1.add("a"); collection1.add("b"); collection1.add("c"); Iterator it =collection1.iterator(); while (it.hasNext()) { System.out.println(it.next()); }}
效果如下:
Collection collection1 =new ArrayList(); collection1.add(new Student("张三",12)); collection1.add(new Student("李四",13)); collection1.add(new Student("王五",14)); //获取迭代器 Iterator it =collection1.iterator(); while (it.hasNext()) { System.out.println(it.next()); Student student =(Student) it.next(); System.out.println(student.getName()+student.getAge());}
迭代器原理:迭代器是对集合进行遍历,而每一个集合内部的存储结构都是不同的,所以每一个集合存和取都是不一样,那么就需要在每一个类中定义hasNext()和next()方法,这样做是可以的,但是会让整个集合体系过于臃肿,迭代器是将这样的方法向上抽取出接口,然后在每个类的内部,定义自己迭代方式,这样做的好处有二,第一规定了整个集合体系的遍历方式都是hasNext()和next()方法,第二,代码有底层内部实现,使用者不用管怎么实现的,会用即可
转载地址:http://zpxmj.baihongyu.com/