JAVA中的数据结构——集合类(序):枚举器、拷贝、集合类的排序
- 枚举器与数据操作
1)枚举器为我们提供了访问集合的方法,而且解决了访问对象的“数据类型不确定”的难题。这是面向对象“多态”思想的应用。其实是通过抽象不同集合对象的共同代码,将相同的功能代码封装到了枚举器的这个接口里,就可以用一套代码来遍历不同类型的集合。
2)每个集合类(Vector或Hashtable等)都有一个iterator方法,各集合对象可以通过这个方法把遍历本类的控制权交给Iterator接口。
3)Iterator接口提供了boolean hasNext()方法判断是否到了集合的最后一个元素;提供了E next()方法获取下一个元素。
4)通过类似于Itetator it=v.iterator();的语句将遍历v的控制权交给it;通过 while(it.hasNext()){ println(it.next().toString()); }访问v的元素。
5)定义统一的访问各集合类的方法:static void readData(Iterator it){ while(it.hasNext()){ println(it.next().toString()); } },之后就可以用readData(v.iterator());、readData(l.iterator());、readData(ht.iterator());来访问vector、list、hashtable集合类了。。。
- 深浅拷贝
1)浅拷贝:实质是对数据的引用,而不是开新的空间去存储。
ShareData sd1=new ShareData(1); ShareData sd2=sd1;//对sd2的操作会影响sd1的内容,因为他们本来就指向同一个内存区域。
2)浅拷贝:通过Object对象的clone方法复制自身,但只能拷贝对象,不能拷贝对象里面的元素。
ArrayList l1=new ArrayList(); List l2=(List)l1.clone();//对l2的操作会影响l1的内容。
3)深拷贝:通过实现Clonalbe接口,并,覆写clone方法,自定义对象克隆的特性。
ArrayList l1=new ArrayList(); List l2=(List)l1.clone(); for{ l2.set( i, ( (item)l1.get(i) ).clone() ); }//对l2的操作【不会】影响l1的内容。
- JAVA集合类中的排序
排序要解决两个问题:i)按什么关系排序;ii)用什么方法排序。Java里为我们提供了sort排序方法,我们要做的是:指定排序规则(怎么判断对象的大小关系)。
1)第一种方法:实现Comparable接口,并,覆写compareTo(Object o)方法,然后调用Collections类的sort(List list)方法对list对象按照compareTo()方法定义的规则进行排序。
public int compareTo(Object o){ CompObj co=(CompObj)o;//类型转换 if(x!=co.x){return x-co.x;}else{return y-co.y;} }
ArrayList l=new ArrayList(); Collections.sort(l);
2)第二种方法:在比较器Comparator中定义排序规则,然后调用Collections类的sort(List list,Comparator c)方法对list对象按照比较器Comparator定义的规则进行排序。
class ObjComparator implements Comparator{ public int compare(Object o1,Object o2){//类型转化; //比较规则;} }
ArrayList l=new ArrayList(); Collections.sort(l,new ObjComparator());