您好,欢迎访问三七文档
Java集合集合概述为了使程序方便地存储和操纵数目不固定的一组数据,JDK类库中提供了Java集合,所有Java集合类都位于java.util包中。与Java数组不同,Java集合不能存放基本数据类型,而只能存放对象。Java集合主要包括三种类型:Set(集),List(列表),Map(映射)。Java集合类框图SetCollectionListAbstractCollectionAbstractListAbstracSetSortedSetTreeSetHashSetAbstractSquentialListLinkedList接口抽象类具体类继承实现ArrayListVectorJava集合类框图MapHashMapSortedMapLinkedHashMapTreeMap接口抽象类具体类继承实现Collection和Iterator接口在Collection接口中声明了适用于Java集合(只包括Set和List)的通用方法。因此Set和List对象可以调用以上方法,Map对象不可以。Iterator接口隐藏了底层集合的数据结构,向客户程序提供了遍历各种数据集合的统一接口。如果集合中的元素没有排序,Iterator遍历集合中元素的顺序是任意的,并不一定与集合中加入元素的顺序是一致的。Set(集)Set是最简单的集合,集合中的对象不按照特定的方式排序,并且没有重复的对象。Set接口主要有两个实现类:HashSet和TreeSet。Set(集)15728643Set的一般用法Set集合中存放的是对象,并且没有重复对象。Java中实现Set接口的类很多,至于该用哪个,我们不用区分,我们只对接口负责。这样就创建了一个集合对象,我们把它当作抽象的集合接口看待。使用接口的好处在于,实现类将来可以被替换,而程序不用做很多改动。Setset=newHashSet();Set的一般用法Set集合依次把三个引用变量加入到集合中。SetStringset=newHashSetString();Strings1=newString(“Hello”);Strings2=newString(“Hello”);Strings3=newString(“World”);set.add(s1);set.add(s2);set.add(s3);System.out.println(set.size());//对象的数目为2Set的一般用法Set集合存放某单位员工的名单,Set集合中元素的数目是不固定的。SetStringemp=newHashSetString();emp.add(Tom);emp.add(Mike);emp.add(Jack);emp.remove(Tom);emp.remove(Jack);emp.add(Linda);System.out.println(emp.size());//对象的数目为2HashSet类HashSet类按照哈希算法来存取集合中的对象,具有很好的存取和查找性能。当向集合中加入一个对象时,HashSet会调用对象的hashCode()方法来获得哈希码,然后根据哈希码进一步计算出对象在集合中的位置。散列技术的原理把对象的哈希码直接用一个固定的公式计算,得出存储位置的方法。优点是:可以快速命中搜索的目标。最简单的哈希码公式:模9运算冲突的解决方案:顺序检测0123456782615222426152224HashSet类在Object类中定义hashcode()和equals()方法。如果object1.equals(object2)为true,那么object1和object2的哈希码也肯定相同。为保证HashSet正常工作,要求当两个对象用equals()方法比较的结果为true时,它们的哈希码也相等。HashSet类publicclassStudent{privateStringname;privateintage;publicStudent(Stringname,intage){this.name=name;this.age=age;}publicvoidshow(){System.out.println(name++age);}publicbooleanequals(Objectobj){if(objinstanceofStudent){Studentobj2=(Student)obj;returnname.equals(obj2.name);}else{returnfalse;}}publicinthashCode(){returnname.hashCode();}publicstaticvoidmain(String[]args){SetStudents=newHashSetStudent();s.add(newStudent(Tom,15));s.add(newStudent(Mike,25));s.add(newStudent(Tom,45));IteratorStudentit=s.iterator();while(it.hasNext()){Studentstu=it.next();stu.show();}}}TreeSet类TreeSet采用树结构来存储数据,它中的每个元素成为一个节点,节点会按照其存放数据的“大小”顺序,一层一层地依次排列,对于同一层中的节点从左到右按“大小”顺序递增排列,下一层的都比上一层的小。appleboygirlzooSetStringset=newTreeSetString();set.add(“boy”);set.add(“zoo”);set.add(“apple”);set.add(“girl”);rootTreeSet类TreeSet类实现了SortedSet接口,能够对集合中的对象进行排序。SetIntegerset=newTreeSetInteger();set.add(newInteger(8));set.add(newInteger(6));set.add(newInteger(7));IteratorIntegerit=set.iterator();while(it.hasNext()){System.out.println(it.next()+);}输出结果为:678TreeSet类当向集合中加入一个对象时,会把它插入到有序的对象集合中。TreeSet支持来两种排序方式:自然排序和客户化排序。默认情况下采用自然排序。自然排序在JDK类库中,有一部分类实现Comparable接口,如Integer、Double和String等Comparable接口有一个compareTo(Objecto)方法,它返回整数类型。对于表达式x.compareTo(y),如果返回值为0,则表示x和y相等,如果返回值大于0,则表示x大于y,如果返回值小于0,则表示x小于y。自然排序TreeSet调用对象的compareTo()方法比较集合中对象的大小,然后进行升序排列,这种方式称为自然排序。JDK类库中实现了Comparable接口的一些类的排序方式。类排序Byte、Double、Float、Integer、Long、Short按数字大小排序Character按字符Unicode值的大小排序String按字符串中字符的Unicode值的大小排序自然排序使用自然排序时,只能向TreeSet集合中加入同一类型的对象,并且这些对象必须实现Comparable接口。自然排序publicclassPointimplementsComparable{privateintx;privateinty;publicPoint(intx,inty){this.x=x;this.y=y;}publicStringtoString(){return+x+,+y+;}publicintcompareTo(Objectobj){if(objinstanceofPoint){Pointp=(Point)obj;return(x*1000+y)-(p.x*1000+p.y);}else{return-1;}}publicstaticvoidmain(String[]args){SetPoints=newTreeSetPoint();s.add(newPoint(2,1));s.add(newPoint(1,1));s.add(newPoint(2,2));s.add(newPoint(1,2));IteratorPointit=s.iterator();while(it.hasNext()){Pointp=it.next();System.out.println(p.toString());}}}客户化排序Java.util.ComparatorType接口提供具体的排序方式,Type指定被比较的对象的类型,Comparator有个compare(Typex,Typey)方法,用于比较两个对象的大小。compare(x,y)的返回值为0,则表示x和y相等,如果返回值大于0,则表示x大于y,如果返回值小于0,则表示x小于y。客户化排序如果希望TreeSet按照Student对象的name属性进行降序排列,可以先创建一个实现Comparator接口的类StudentComparator。StudentComparator类就是一个自定义的比较器。List(列表)List的主要特征是按照元素以线性方式存储,允许集合中存放重复对象。List接口的主要实现类包括:ArrayList和LinkedList。ArrayList:代表长度可以变化的数组。允许对元素进行快速的随机访问,但是向ArrayList中插入与删除元素速度较慢。10652115headList(列表)LinkedList:双向链表。向LinkedList中插入和删除元素的速度较快,随机访问的速度较慢。它单独具有addFirst()、addLast()、getFirst()、getLast()、removeFirst()、removeLast()方法。10152156head访问List中的元素List中的对象按照索引位置排序,程序可以按照对象在集合中的索引位置来检索对象。ListIntegerlist=newArrayListInteger();list.add(newInteger(3));list.add(newInteger(4));list.add(newInteger(3));list.add(newInteger(2));for(inti=0;ilist.size();i++){System.out.print(list.get(i)+””);}IteratorIntegerit=list.iterator();while(it.hasNext()){System.out.print(it.next()+””);}为List排序List只能对集合中的对象按索引顺序排序,如果希望对List中的对象按照其他特定的方式排序,可以借助Comparator接口和Collections类。Collections类是对Java集合类库中的辅助类,它提供操纵集合的各种静态方法。sort(Listlist):对List中的对象进行自然排序。sort(Listlist,Comparatorcomparator):对List中的对象进行客户化排序,comparator参数指定排序方式。为List排序ListIntegerlist=newArrayListInteger();list.add(newInteger(3));list.add(newInteger(4));list.add(newInteger(3));list.add(newInteger(2));Collec
本文标题:Java集合
链接地址:https://www.777doc.com/doc-4391541 .html