集合框架是java中非常重要的一部分,它是很好的对象管理器。接下来的文章总结一下所学习的框架知识,包括:equal 和hashcode 方法的重写,常用集合框架的层次,自然排序和指定排序,常用的集合类(List,Set)等等,集合的遍历(迭代器,for-each)。下一篇讲映射类和集合常用操作,以及泛型编程。
Object类
Object是所有的超类,他有很多重要的方法,需要他的子类来重写。toString(),equal(),hashCode()
toString方法:当使用System.out.println方法打印Object时,调用的就是Object的toString方法,如果不重写要打印的类的toString方法,打印出来的东西就很难理解。想打印出自己想要的信息,就要在类中重写public String toString()。
比如
public String toString(){
String st="学生的名字:"+this.name+" 学生的年龄"+this.age+"学生的班级"+this.classNum+"\n";
return st;
}
equal方法:Object类中equal方法用于比较两个对象是否相同,如果不重写object则 A.equal(B)比较的就是A和B两个引用是否指向同一个对象,为了真正比较A和B两个对象是否有相同的内容,就需要重写equal方法。
public boolean equals(Object o){
System.out.println("调用了equals方法和"+((Student3)o).name+"比");
//如果两个引用相同则直接返回true
if(this==o){
return true;
}
//如果对比对象是空,则直接返回false
if(o==null){
return false;
}
//如果对比对象的类型和本对象不符合,则返回false
if(!(o instanceof Student3)){ //object instanceof Class 将return object是否是Class的一个实例
return false;
}
//将引用转换为Student3类型好进行对比
Student3 s=(Student3)o;
//对比Student3的名字,返回结果
if(this.name.equals(s.name)){
return true;
}else{
return false;
}
}
重写equal方法时要注意,参数一定要是object类型,否则不会构成重写,还要遵守几个原则:如果两个类的引用相同,就返回true,如果对比类引用为空或者两个类类型不一样,返回false,其他情况就进行自己的对比逻辑。
hashCode方法:
重写了equal方法就必须重写hashCode方法,equal返回true,hashCode必须相等,hashCode不相等,equal必须false。对于哈希存储结构,两个对象的hashCode相等的情况下,再比较两个对象的equal,这样的结构使查找更简单。
hashCode可以和类中的某些成员联系起来,用成员创建hashCode值。
java中常用集合框架的层次关系如图
其中collection,set,List,Map,SortedMap是接口,其他是类。继承关系如图所示。
对于集合框架中元素的没骗人排序有Ordered和Sorted两种
Ordered是后天指定排序,以下类属于ordered:ArrayList,Venctor,LinkedList
Sorted是指先天顺序排序:TreeSet,TreeMap,SortedSet,SortedMap
列表接口List,它的元素按照索引顺序访问,实现该接口的类都属于Ordered型.它的常用方法有add,addAll,clear,contants,get,remove,set等等
列表的实现主要有:数组实现ArrayList,向量实现Vector,链表实现LinkedList
ArrayList数组实现,基于数组实现的,对元素的随机访问性能较好,但是如果有大量的插入删除,则性能很差。
Vector向量实现,它和ArrayList基本相同,不过该类是同步的,同一时刻只能有一个线程访问。
LinkedList链表实现,它以来内部双链表实现,具有很好的插入删除性能,但是随机访问性能比较差。
如果想把数组转换为List,可以使用静态方法,Arrays.asList(T a)
集合:Setj接口和它的子接口子类都成为集合,Set中不能有重复的元素,Set中元素没有顺序。
HashSet是最常用的实现之一,HashSet既不是ordered也不是sorted,元素存储不保证任何顺序。
LinkedHashSet类是ordered,采用双链表,元素在其中有固定的顺序。也就是插入的顺序。
SortedSet接口与TreeSet类
SortedSet接口是sorted的,其中的元素会按照天然顺序进行排序,TreeSet是这个接口的实现,TreeSet里的元素会按照天然顺序排序。如果要将自己开发的类作为元素放入TreeSet,就必须实现Comparable接口,用于排序。Comparable接口中的int comparaTo(Object o)方法,用于比较对象,返回值为负数就是小于,0就是等于,正数就是大于。
可以为单独制作一个比较器,创建一个类实现Comparator接口,实现其中的int compara(Object o1,Object o2)方法,再把这个比较器类传递给TreeSet构造函数中,就可以按照这个比较器的规则进行排序。
集合的遍历
1迭代器 每个集合(Collection,Set)都有一个迭代器方法,返回一个迭代器, 方法名为iterator。创建一个Iterator 对象,Iterator it=hashset.iteator();就可以使用it对象的next,hasnext,remove方法遍历集合。
2for-each
java5.0以后可以使用这个方法遍历集合,
for(引用类型 引用变量:引用集合){
//操作引用变量
}