一、引入
案例一:需求: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内部给我们提供了集合类,能存储任意对象,长度是可以改变的,随着元素的增加而增加,随着元素的减少而减少 -
数组和集合的区别
- 区别1 :
- 数组既可以存储基本数据类型,又可以存储引用数据类型,基本数据类型存储的是值,引用数据类型存储的是地址值
- 集合只能存储引用数据类型(对象)集合中也可以存储基本数据类型,但是在存储的时候会自动装箱变成对象 如存储一个100,他会自动封装成 new Integer(100)
- 区别2:
- 数组长度是固定的,不能自动增长
- 集合的长度的是可变的,可以根据元素的增加而增长
-
数组和集合什么时候用
如果元素个数是固定的推荐用数组,如果元素个数不是固定的推荐用集合. -
集合框架的体系结构图(该图很重要)
以下我们介绍Collection部分。也就是所有集合方法的主父类
三、集合框架(Collection集合的基本功能测试
基本功能演示
- boolean add(E e)
add方法如果是List集合一直返回true,因为List集合一直返回true,因为List集合中是可以重复存储元素的,如果是set集合就返回false
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()); //删除指定元素
效果如下:
3. void clear()
清空集合中的数据
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()); //删除指定元素
效果如下:
4. boolean contains(Object o)
是否包含
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类型的对象, //向下转型。
五、 集合框架(Collection集合的带All功能测试)
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 中
效果如下:
2. boolean removeAll(Collection c)
该方法删除的是两个集合之间的交集,如果没有交集则返回false,且删除不成功
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);
效果如下:
3. boolean containsAll(Collection c)
判断调用的集合是否包含传入的集合,如果传入的集合中有调用集合中没有的元素,返回false。重复值没有关系。
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);
效果如下:
4. boolean retainAll(Collection c)
该方法表示取两个集合之间的交集并赋值给调用的集合,如果调用的集合改变就返回true,如果调用的集合不变就返回false
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()方法,第二,代码有底层内部实现,使用者不用管怎么实现的,会用即可