概念
装其他各种东西的器皿,而对程序来说就是存放对象的
容器API类图如下:
其中,
Collection代表了一个容器Collection集合
Set是没有顺序并且不可以重复
List是有顺序并且可以重复
Map是一对一对的装东西
Collection接口——定义了存取一组对象的方法,其子接口Set和List分别定义了存储方式
- Set中的数据对象没有顺序且不可以重复
- List中的数据对象有顺序且可以重复
Map接口定义了存储“键(key)——值(value)映射对”的方法
Collection接口
定义的方法
Collection用法
import java.util.*; public class Name{ private String firstName,lastName; public Name(String firstName,String lastName){ this.firstName= firsName; this.lastName= lastName; } public String getFirsName(){ return firstName;} public String getLastName(){ return lastName;} public String toString(){ return firstName + " " + lastName;} } public class Teat { public static void main(string[] args){ Collection c =new ArrayList(); //可以放入不同类型的对象 c.add("hello"); c.add(new Name("f1","11")); c.add(new Integer(100)); System.out.println(c.size()); System.out.println(c); } } 输出结果:3 [hello,f1 11,100]
- 容器类对象在调用remove、contains等方法时需要比较对象是否相等,这会涉及到对象类型的equals方法和hashCode方法;对于自定义的类型,需要要重写equals和hashCode方法以实现自定义的对象相等规则
- 注意:相等的对象应该具有相等的hash codes
- 增加Name类的equals和hashCode方法如下:
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接口的容器类都有一个iterator方法用以返回一个实现了Iterator接口的对象
- Iterator对象称作迭代器,用以方便的实现对容器内元素的遍历操作
- Iterator接口定义了如下方法
boolean hasNext (); //判断游标右边是否有元素
Object next(); //返回游标右边的元素并将游标移动到下一个位置
void remove(); // 删除游标左面的元素,在执行完next之后该操作只能执行一次
List接口
- List接口是Collection的子接口,实现List接口的容器类中的元素是有顺序的,而且可以重复
- List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可根据序号存取容器中的元素
常用算法
Comparable接口
问:上面的算法根据什么确定容器中对象的“大小”顺序?
所有可以“排序”的类都实现了java.lang.Comparable接口,Comparable接口中只有一个方法:public int compareTo(Object obj),
该方法:
- 返回 0 表示this==obj
- 返回正数表示this>obj
- 返回负数表示this<obj
实现了Comparable接口的类通过实现comparaTo方法从而确定该类对象的排序方式
如何选择数据结构
- 衡量标准:读的效率和改的效率
- Array读快改慢
- Linked改快读慢
- Hash两者之间
Map接口
- 实现Map接口的类用来存储 键—值 对
- 实现类有HashMap和TreeMap
- 存储的 键—值 对通过键来标识,所以键值不能重复
JDK1.5泛型
起因:
- JDK1.4以前类型不明确
- 装入集合的类型都被当作Object对待,从而失去自己的实际类型
- 从集合中取出时往往需要转型,效率低,容易产生错误
解决方法:
- 在定义集合时同时定义集合中对象的类型
好处:
- 增强程序的可读性和稳定性