博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA基础——集合框架(一)对象数组建立,迭代器原理,集合的遍历之集合转数组遍历,迭代器遍历,Collection的基本功能测试
阅读量:3506 次
发布时间:2019-05-20

本文共 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是我们在是在内存中的堆中存储

二、 集合框架

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

转载地址:http://zpxmj.baihongyu.com/

你可能感兴趣的文章
缓存:局部性
查看>>
mysql原理:b+树索引
查看>>
mysql原理:最左原则
查看>>
mysql原理:join标到底是什么,为什么有军规不建议超过三个
查看>>
redis缓存穿透
查看>>
redis缓存雪崩
查看>>
mysql的事务隔离
查看>>
mvc架构
查看>>
ElasticSearch(0) ES的认识
查看>>
JPA入门
查看>>
JPA关系
查看>>
4.spring注解和生命周期相关的(了解)
查看>>
3.spring 的纯注解配置
查看>>
4.Spring 整合 Junit
查看>>
安装配置 Kali Linux 笔记
查看>>
持久加密U盘安装 Kali Linux 笔记
查看>>
[ 笔 记 ] netcat 传输信息 / banner
查看>>
[ 笔 记 ] 主动信息收集_002
查看>>
[ CTF ] ssh私钥泄漏_笔记
查看>>
设计模式学习
查看>>