起初,Java应该先有的数组。数组是一种高效存储和随机访问对象引用序列的方式,在效率和类型检查方面很有优势,但是当创建一个数组对象的时候,数组的大小也就固定了。为了满足想要多少分配空间,就能占多少,容器就诞生了~~
Java API所提供的一系列类的实例,用于在程序中存放对象。下图是容器的API框架图:
JDK提供的容器:
Set:数据对象无序,不可重复
List:数据对象有序 ,可重复
附:重复就是通过equals方法对比的结果
Map:接口定义了存储“键(key)-值(value)映射对”的方法。
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就是一个统一遍历Collection所有元素的方法。
1、所有实现了Collection接口的容器类都有一个iterator方法用以返回一个实现了Iterator接口的对象。
2、Iterator对象称作迭代器,用以方便的实现对容器元素的遍历实现。
3、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容器,有兴趣的朋友可以继续关注我的博客!