java——Collection集合

1、

import java.io.*;
import java.util.*;

/*
Collection接口内方法

boolean add(Object o):向集合内添加元素
void clear():清空集合
boolean isEmpty():判断集合内是否有元素
int size():获取集合内元素个数
Object[] toArray():将集合转换为数组

Iterator iterator():获得集合所依赖的迭代器对象

boolean contains(Object o):判断集合中是否包含某个元素
boolean remove(Object o):删除集合中某个元素

*/
public class Hello {
		
	public static void main(String[] args){
		//1、创建Collection集合,只能单个存储且只能存储引用类型(即对象的内存地址)
		Collection collection=new ArrayList();//多态
		//2、添加元素
		collection .add(1);//自动封箱
		collection .add(new Integer("10"));
		collection .add(new Customer("Tom", 18));
		collection .add(new Object());
		//3、得到元素个数、判断是否为空
		System.out.println(collection .size());
		System.out.println(collection .isEmpty());
		//4、将集合转换为数组
		Object[] objects=collection .toArray();
		for(int i=0;i<objects.length;i++)
		{
			System.out.println(objects[i]);
		}
		//5、清空集合
		collection .clear();
		System.out.println(collection .size());
		System.out.println(collection .isEmpty());
		
	}
}

class Customer{
	String name;
	int age;
	
	Customer(String name,int age)
	{
		this.name=name;
		this.age=age;
	}
	
	public String toString()
	{
		return "The customer's name is "+name+", the customer's age is "+age;
	}
}

在这里插入图片描述
2、
不同的集合类所依赖的迭代器类型不同,但都实现了Iterator接口,是面向接口编程的
可以将迭代器看作是一个指针,初始指向集合元素的上方,为空

import java.io.*;
import java.util.*;

/*

Iterator iterator():获得集合所依赖的迭代器对象

Iterable接口中有iterator()方法,而Collection接口实现了Iterable接口,自然Collection接口中就有iterator()方法
iterator()方法返回的是一个迭代器对象(并不一定是Iterator类型),该对象所属类型实现了Iterator接口,因此Collection接口依赖于Iterator接口

Collection集合通过iterator()方法获得迭代器对象,再通过调用迭代器内的方法,对集合进行遍历

注意,这种方法是所有集合遍历的通用方法

*/
public class Hello {
		
	public static void main(String[] args){
		//1、创建集合对象
		Collection collection =new ArrayList();
		Collection collection1 =new LinkedList();
		Collection collection2 =new HashSet();
		Collection collection3 =new TreeSet();
		
		//2、添加元素
		collection .add(1);//自动封箱
		collection .add(3.14);//自动封箱
		collection .add(false);//自动封箱
		
		collection1 .add(1);//自动封箱
		collection1 .add(3.14);//自动封箱
		collection1 .add(false);//自动封箱
		
		collection2 .add(1);//自动封箱
		collection2 .add(3.14);//自动封箱
		collection2 .add(false);//自动封箱
		collection2 .add(5);//自动封箱
		
		collection3 .add(1);//自动封箱
		collection3 .add(3);//自动封箱
		collection3 .add(0);//自动封箱
		
		//迭代/遍历
			//1、获取迭代器,迭代器是面向接口编程的(不需要关心底层集合的具体类型,所有集合依赖的迭代器都实现了java.util.Iterator接口
			//不同的集合类所依赖的迭代器类型不同,但都实现了Iterator接口,所以是完全面向接口编程的,看不到具体实现类(父类型引用指向子类型对象),也不用管具体的实现类是什么
		Iterator iterator =collection .iterator();//iterator是引用,保存了内存地址,指向堆中的“迭代器对象”
		Iterator iterator1 =collection1 .iterator();
		Iterator iterator2 =collection2 .iterator();
		Iterator iterator3 =collection3 .iterator();
		
			//看到具体的实现类
		System.out.println(iterator);//ArrayList集合所依赖迭代器类型为Itr
		System.out.println(iterator1);//LinkedList集合所依赖迭代器类型为ListItr
		System.out.println(iterator2);//HashSet集合所依赖迭代器类型为KeyIterator
		System.out.println(iterator3);//TreeSet集合所依赖迭代器类型为KeyIterator
		
			//2、开始调用方法,完成集合遍历
			//迭代器初始不指向任何元素
		while(iterator .hasNext())
		{
			System.out.println(iterator .next());
		}
		System.out.println();
		while(iterator1 .hasNext())
		{
			System.out.println(iterator1 .next());
		}
		
		//Set集合的输出顺序与输入不一定相同
		System.out.println();
		while(iterator2 .hasNext())
		{
			System.out.println(iterator2 .next());
		}
		System.out.println();
		while(iterator3 .hasNext())
		{
			System.out.println(iterator3 .next());
		}
	}
}
//面向对象、面向接口其实就是多了父类和子类,不必在意各子类具体是什么,通过多态使程序扩展性提高
//boolean b=iterator.hasNext():判断是否有更多的元素,如果有返回true
//Object o=iterator.next():将迭代器向下移动一位,并且取出指向元素
//原则:调用next方法之前必须调用hasNext方法

在这里插入图片描述
3、
集合类内的contains、remove方法底层调用的都是equals方法,因此使用contains、remove方法都需要集合内元素所属类重写equals方法

/*

boolean contains(Object o):判断集合中是否包含某个元素
底层实际调用的是equals()方法,用Object o与集合内的每个元素进行equals()方法比较
调用的equals()方法是对象o所属类内的equals()方法
存储在集合内的每个元素的所属类都应重写equals方法

*/
public class Hello {
		
	public static void main(String[] args){
		Collection collection =new ArrayList();
		
		Integer integer =new Integer(10);
		collection .add(integer );
		System.out.println(collection .contains(integer ));
		
		//创建元素但并未添加
		Integer integer2 =new Integer(10);
		System.out.println(collection .contains(integer2 ));//true
		
	}
}

/*
ArrayList类内的contains方法

public boolean contains(Object o){
	return indexOf(o)>=0;
}

public int indexOf(Object o){
	if(o==null){
		for(int i=0;i<size;i++)
		{
			if(elementData[i]==null)
				return i;
		}
	}
	else{
		for(int i=0;i<size;i++)
		{
			if(o.equals(elementData[i])//可以看出底层实际调用的是o对象所属类内的equals方法
				return i;
		}
	}
	return -1;
}

*/

在这里插入图片描述

public class Hello {
		
	public static void main(String[] args){
		Collection collection =new ArrayList();
		
		Customer customer =new Customer("Tom", 18);
		collection .add(customer );
		System.out.println(collection .contains(customer ));//true
		
		//重写equals方法之前
		Customer customer2 =new Customer("Tom", 18);
		//collection .contains(customer2)+customer2是Customer类对象,所以实际调用的是Customer类内的equals方法
		//但Customer类内并未重写equals方法,且Customer继承于Object类,因此调用的是Object类内的equals方法,比较的是内存地址
		System.out.println(collection .contains(customer2));//false
	}
}

class Customer{
	String name;
	int age;
	
	Customer(String name,int age)
	{
		this.name=name;
		this.age=age;
	}
}
public class Hello {
		
	public static void main(String[] args){
		Collection collection =new ArrayList();
		
		Customer customer =new Customer("Tom", 18);
		collection .add(customer );
		System.out.println(collection .contains(customer ));//true
		
		//重写equals方法之后
		Customer customer2 =new Customer("Tom", 18);
		System.out.println(collection .contains(customer2));//true
	}
}

class Customer{
	String name;
	int age;
	
	Customer(String name,int age)
	{
		this.name=name;
		this.age=age;
	}
	//注意一:参数是Object o,不是Customer o
	//注意二:类型转换
	//注意三:重中之重!!!!name是String类型,String类型的比较用的是equals方法,不是==
	public boolean equals(Object o)
	{
		if(this==o)
			return true;
		if(o instanceof Customer){
			Customer c = (Customer) o;
			if(c.name.equals(this.name)&&this.age==c.age)
				return true;
		}
		return false;
	}
}
//因此,存储在集合中的元素的所在类都应该去重写equals方法

4、

import java.io.*;
import java.util.*;

/*

boolean remove(Object o):删除集合中的某个元素
实际调用的也是equals方法
contains、remove方法都需要集合内元素的所属类重写equals方法

*/
public class Hello {
		
	public static void main(String[] args){
		Collection collection =new ArrayList();
		
		Customer customer =new Customer("Tom", 18);
		collection .add(customer );
		Customer customer2 =new Customer("Tom", 18);
		
//		//重写equals方法之前
//		System.out.println(collection .remove(customer2 ));//false
//		System.out.println(collection .size());//1
		
		//重写equals方法之后
		System.out.println(collection .remove(customer2 ));//true
		System.out.println(collection .size());//0
				
	}
}

class Customer{
	String name;
	int age;
	
	Customer(String name,int age)
	{
		this.name=name;
		this.age=age;
	}
	
	public boolean equals(Object o){
		if(this==o)
			return true;
		if(o instanceof Customer){
			Customer customer =(Customer) o;
			if(customer.name.equals(this.name)&&customer.age==this.age)
				return true;
		}
		return false;
	}
}

5、
推荐使用迭代器的方式进行删除

/*

区分两大remove方法:
一是Iterator接口中的void remove()
二是集合类内的remove方法:boolean remove(Object o)

*/
public class Hello {
		
	public static void main(String[] args){
		Collection collection =new ArrayList();
		
		collection .add(1);
		collection .add(3);
		collection .add(5);

		//遍历
		Iterator iterator =collection .iterator();//将迭代器看做是一个指针,初始指向集合元素上方
		while(iterator .hasNext())
		{
			Object object=iterator .next();//迭代器(指针)下移
			//使用迭代器的remove方法删除元素
			iterator .remove();
		}
		System.out.println(collection .size());//0
				
	}
}

public class Hello {
		
	public static void main(String[] args){
		Collection collection =new ArrayList();
		
		collection .add(1);
		collection .add(3);
		collection .add(5);

		//遍历
		Iterator iterator =collection .iterator();//将迭代器看做是一个指针,初始指向集合元素上方
		while(iterator .hasNext())
		{
			Object object=iterator .next();//迭代器(指针)下移
			//使用集合类的remove方法删除元素
			collection .remove(object);
			//删除元素后,集合发生变化,必须重新获取集合所依赖的迭代器
		}
		System.out.println(collection .size());
				
	}
}

在这里插入图片描述
因此,推荐使用迭代器的方式进行删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值