背景:
起初,Java应该先有的数组。数组是一种高效存储和随机访问对象引用序列的方式,在效率和类型检查方面很有优势,但是当创建一个数组对象的时候,数组的大小也就固定了。为了满足想要多少分配空间,就能占多少,容器就诞生了~~
概念:
Java API所提供的一系列类的实例,用于在程序中存放对象。下图是容器的API框架图:
JDK提供的容器:
Set:数据对象无序,不可重复
List:数据对象有序 ,可重复
附:重复就是通过equals方法对比的结果
Map:接口定义了存储“键(key)-值(value)映射对”的方法。
Collection接口:
Collection接口定义了存储的一组对象的方法,其子接口Set和List分别细化了存储的方式。
Demo代码:
实例化一个ArrayList对象,实现父Collection接口,通过add方法添加两个元素,并打印c容器的大小和内容。
import java.util.*;
public class Main {
public static void main(String[] args) {
Collection c=new ArrayList();//父类Collection实例化一个子类对象ArrayList
//可以放入不同的对象。
c.add("hello");
c.add(new Integer(100));
System.out.println(c.size());
System.out.println(c);
}
}
注意:
为啥要写Collection c=new ArrayList();父类指向子类的接口,这样实例化的对象里面只拥有父类方法的具体实现。假如根据需要,不实例化ArrayList了,改成LinkList了,只需要修改ArrayList出即可使用,体现了代码的灵活性。
Collection Remove代码:
跟上面的代码比,添加了remove方法的使用,调用Collection的add方法后移除remove,输出操作后的结果。
import java.util.*;
public class Main {
public static void main(String[] args) {
Collection c=new HashSet();
//可以放入不同的对象。
c.add("hello");
c.add(new Name("f1","l1"));
c.add(new Integer(100));
//新添加移除remove方法
c.remove("hello");
c.remove(new Integer (100)); //移除的时候,有一个equals的对比。
System.out.println(c.remove(new Name("f1","l1")));
System.out.println(c);
}
}
class Name{
private String firstName,lastName;
public Name(String firstName,String lastName){
this.firstName=firstName;
this.lastName=lastName;
}
public String getFirstName(){return firstName;}
public String getLashName(){return lastName;}
public String toString(){return firstName + " " + lastName;}
public boolean equals(Object obj){
if(obj instanceof Name){
Name name=(Name) obj;
return (firstName.equals(name.firstName)) &&(lastName.equals(name.lastName));
}
return super.equals(obj);
}
public int hashCode(){
return firstName.hashCode();
}
}
输出结果:
在作为索引的时候,重写equals的时候要重写hashcode.
Iterator接口:
Iterator就是一个统一遍历Collection所有元素的方法。
1、所有实现了Collection接口的容器类都有一个iterator方法用以返回一个实现了Iterator接口的对象。
2、Iterator对象称作迭代器,用以方便的实现对容器元素的遍历实现。
3、Iterator实现了下列方法:
Iterator 实例代码:
import java.util.*;
public class Main {
public static void main(String[] args) {
Collection c=new HashSet();
c.add(new Name("f1","l1"));
c.add(new Name("f3","l3"));
c.add(new Name("f5","l5"));
//统一遍历Collection里面所有的元素
Iterator i=c.iterator();
while(i.hasNext()){
Name n=(Name)i.next();
System.out.println(n.getFirstName()+" ");
}
}
}
class Name{
private String firstName,lastName;
public Name(String firstName,String lastName){
this.firstName=firstName;
this.lastName=lastName;
}
public String getFirstName(){return firstName;}
public String getLashName(){return lastName;}
public String toString(){return firstName + " " + lastName;}
public boolean equals(Object obj){
if(obj instanceof Name){
Name name=(Name) obj;
return (firstName.equals(name.firstName)) &&(lastName.equals(name.lastName));
}
return super.equals(obj);
}
public int hashCode(){
return firstName.hashCode();
}
}
输出结果:
注意:
Iterator对象的remove方法是在迭代过程中删除元素的唯一的安全方法。使用的过程中拒绝其他的remove方法。
下面一篇将为大家继续深入讲解Java容器,有兴趣的朋友可以继续关注我的博客!