JAVA基础——集合框架(一)对象数组建立,迭代器原理,集合的遍历之集合转数组遍历,迭代器遍历,Collection的基本功能测试

一、引入

案例一:需求: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是我们在是在内存中的堆中存储

二、 集合框架

  1. 集合的由来
    数组长度是固定,当添加的元素超过了数组的长度时需要对数组重新定义,太麻烦,java内部给我们提供了集合类,能存储任意对象,长度是可以改变的,随着元素的增加而增加,随着元素的减少而减少

  2. 数组和集合的区别

  • 区别1 :
  • 数组既可以存储基本数据类型,又可以存储引用数据类型,基本数据类型存储的是值,引用数据类型存储的是地址值
  • 集合只能存储引用数据类型(对象)集合中也可以存储基本数据类型,但是在存储的时候会自动装箱变成对象 如存储一个100,他会自动封装成 new Integer(100)
  • 区别2:
  • 数组长度是固定的,不能自动增长
  • 集合的长度的是可变的,可以根据元素的增加而增长
  1. 数组和集合什么时候用
    如果元素个数是固定的推荐用数组,如果元素个数不是固定的推荐用集合.

  2. 集合框架的体系结构图(该图很重要)
    集合框架
    以下我们介绍Collection部分。也就是所有集合方法的主父类

三、集合框架(Collection集合的基本功能测试

基本功能演示

  1. 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());		//删除指定元素

效果如下:
sa
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()方法,第二,代码有底层内部实现,使用者不用管怎么实现的,会用即可

猜你喜欢

转载自blog.csdn.net/Mr_GYF/article/details/108626398