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());
}
}
因此,推荐使用迭代器的方式进行删除