1、collection常用的方法
方法 | 用法 |
---|---|
boolean add(Object element); | 向集合中添加元素 |
void clear(); | 清空集合 |
boolean contains(Object o); | 判断集合中是否包含某个元素 |
boolean isEmpty(); | 判断集合中是否有元素 |
Iterator iterator(); | 获取集合所依赖的迭代器对象 |
boolean remove(Object o) | ;删除集合中某个元素 |
int size(); | 获取集合中元素的个数 |
Object[] toArray(); | 将集合转换为数组 |
2、迭代器Iterator(遍历)
所有的集合通用的遍历方式
import java.util.*;
public class CollectionTest02{
public static void main(String[] args){
//1、创建集合对象
Collection c = new LinkedList();
//添加元素
c.add(100);//自动装箱
c.add(3.14);//自动装箱
c.add(false);//自动装箱
//迭代,遍历
//获取迭代器对象
//不需要关心底层集合的具体类型,所哟集合依赖的迭代器都实现了java.util.Iterator
Iterator it = c.iterator();//迭代器事面向接口编程
//it是引用,保存了内存地址,指向堆中的“迭代器对象”
//2、调用方法完成遍历,迭代
//while循环
while(it.hasnext()){//如果有下一个,那么执行以下代码
Object o = it.next();
System.out.println(o);
}
/*
boolean b = it.hasNext();//判断是否有下一个元素,如果有则返回true
Object o = it.next();//将迭代器向下移动一位,并且取出指向的元素
原则:调用it.next()之前,必须调用hasNext()
*/
//for循环
for(Iterator it = c.iterator();it.hasNext();){
Object o = it.next();
System.out.println(o);
}
}
}
3、contains方法
import java.util.*;
public class CollectionTest03{
public static void main(String[] args){
//创建集合
Collection c = new ArrayList();//多态
//创建Interger类型对象
Integer i1 = new Integer(10);
//添加元素
c.add(i1);
//判断集合中是否包含i1
System.out.println(c.contains(i1));//true
//创建Integer类型对象
Integer i2 = new Integer(10);
//contains方法底层调用的是equals方法,如果equals返回true,就是包含
System.out.println(c.contains(i2));//true
Manager m1 = new Manager(11,"jack");
c.add(m1);
System.out.println(c.contains(m1));//true
Manager m1 = new Manager(11,"jack");
System.out.println(c.contains(m2));//false Manager没有重写equals方法
System.out.println(c.contains(m2));//true 重写之后变为true
//结论:保存在集合中的对象必须重写equals方法
}
}
源码分析
public boolean contains(Object o){
return indexOf(0) >= 0;
}
public int indexOf(Object o){
if(o == null){
for(int i = 0;i<size;i++)
if(elementData[i]==null)//ArrayList底层是数组
return i;//返回集合中有几个null
}else{
for(int i = 0;i<size;i++)
if(o.equals(elementData[i]))//equals已经重写比较的是内容
return i;//返回集合中有集合o
}
return -1;
}
Manager
class Manager{
int no;
String name;
Manager(int no,Stirng name){
this.no = no;
this.name = name;
}
//重写equals方法
//需求:编号和姓名都一样,表示同一个manager
public boolean equals(Object o){
if(this==o) return true;
if(o instanceof Manager){
Manager m = (Manager)o;
if(m.no==this.no&& m.name.equals(this.name)){
return true;
}
}
return false;
}
}
4、remove方法
/*
boolean remove(Object o)
remove和contains方法都需要集合中的元素重写equals方法。
因为Object中的equals方法比较内存地址,在现实的业务逻辑中
不能比较内存地址,要比较内容
*/
import java.util.*;
public class CollectionTest04{
public static void main(String[] args){
//创建集合对象
Collection c = new ArrayList();
Integer i1 = new Integer(10);
//添加元素
c.add(i1);
//删除
Integer i2 = new Integer(10);
c.remove(i2);
System.out.pintln(c.size());//0
Manager m1 = new Manager(100,"smith");
c.add(m1);
Manager m2 = new Manager(100,"smith");
c.remove(m2);
System.out.println(c.size());//0
}
}
5、深入remove方法
/*
深入remove方法
1、迭代器的remove方法
2、集合自身带的remove方法
*/
public class CollectionTest05}{
public static void main(String[] args){
//创建集合
Collection c = new Collectin();
c.add(1);
c.add(2);
c.add(3);
//遍历
Interator it = c.iterator();
while(it.hasNext){
//通过迭代器删除
/*
it.next();//下移
it.remove();//删除
*/
//使用集合的remove方法
Object o = it.next();
c.remove();//删除
}
System.out.println(c.size());//迭代器:0,collection中remove方法:报错
//原因:使用集合的方法删除后,需要重写获取迭代器,如果没有使用迭代器,就会报错
//一般删除多个元素推荐使用迭代器的remove方法
}
}