Java集合集合中常用集合类的继承关系ObjectCollectionListArrayListLinkedListSetHashSetTreeSetMapHashMapTreeMapJava集合可分为Collection和Map两种体系Collection接口:Set:元素无序、不可重复的集合(高中时的集合)List:元素有序,可重复的集合(动态数组)Map接口:具有映射关系“key-value对”的集合(函数)是否有序是否允许重复是否线程同步Collection否是ListArrayList是是否Vector是LinkedList否SetHashSet否否否TreeSet是否MapHashMap否key,value,key不允许重复否TreeMap是否Hashtable否是在Collection接口中定义了如下的几个核心操作:No.方法名称类型描述1publicbooleanadd(Ee)普通向集合中增加元素2publicvoidclear()普通删除集合中的全部内容3publicbooleancontains(Objecto)普通判断指定内容是否存在4publicIteratorEiterator()普通为Iterator接口实例化5publicbooleanremove(Objecto)普通从集合中删除元素6publicintsize()普通取得集合的大小7publicObject[]toArray()普通将集合变为对象数组输出8publicTT[]toArray(T[]a)普通将集合变为对象数组输出允许重复的子接口:ListList接口本身属于Collection的子接口,但是List子接口本身大量的扩充了Collection接口,主要的扩充方法如下:No.方法名称类型描述1publicvoidadd(intindex,Eelement)普通在指定的位置上增加内容2publicEget(intindex)普通取得指定位置上的内容3publicEset(intindex,Eelement)普通修改指定位置的内容4publicListIteratorElistIterator()普通为ListIterator接口实例化5publicEremove(intindex)普通删除指定位置上的内容在各种list中,最好把ArrayList作为缺省选择。当插入、删除频繁时,使用LinkedList;Vector总是比ArrayList慢,所以尽量避免使用。Vector:底层是数组数据结构,jdk1.0出现,线程是同步的,被jdk1.2版本后出现的ArrayList替代,因为效率低。ArrayList:底层是数组数据结构,jdk1.2出现,线程是不同步的,查询的速度快。LinkedList:底层是链表数据结构,线程是不同步的。增删的速度很快,可以使用该集合去模拟出队列(先进先出)或者堆栈(后进先出)数据结构。ArrayList和Vector的区别从代码的最终的操作形式上可以发现,代码的输出结果与之前是一样的,而且没有区别,但是两者的区别还在于其内部的组成上。No.区别点ArrayListVector1推出时间JDK1.2之后JDK1.0的时候推出2线程处理采用异步处理采用同步处理3性能速度较快速度相对较慢4安全性非线程安全性的操作属于线程安全的操作不允许重复的子接口:SetList接口中的内容是允许重复的,但是如果现在要求集合中的内容不允许重复的话,则就可以使用set子接口完成,Set接口并不像List接口那样对Collection接口进行了大量的扩充,而与Collection接口的定义是完全一样的。与List接口一样,如果要想使用set接口则一定也要通过子类进行对象的实例化,常用的两个子类:HashSet、TreeSet。在set接口中不允许有重复的元素出现,而且发现与List接口不同的是,List采用的是顺序的方式加入的元素,而HashSet中的内容并没有任何的顺序,属于散列存放的。HashSetHashSet是Set接口的典型实现,大多数时候使用Set集合时都使用这个实现类。HashSet按Hash算法来存储集合中的元素,因此具有很好的存取和查找性能。HashSet具有以下特点:不能保证元素的排列顺序HashSet不是线程安全的集合元素可以是null当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据hashCode值决定该对象在HashSet中的存储位置。HashSet集合判断两个元素相等的标准:两个对象通过equals()方法比较相等,并且两个对象的hashCode()方法返回值也相等。hashCode()方法如果两个元素的equals()方法返回true,但它们的hashCode()返回值不相等,hashSet将会把它们存储在不同的位置,但依然可以添加成功。对于存放在Set容器中的对象,对应的类一定要重写equals()和hashCode(Objectobj)方法,以实现对象相等规则。重写hashCode()方法的基本原则1.在程序运行时,同一个对象多次调用hashCode()方法应该返回相同的值2.当两个对象的equals()方法比较返回true时,这两个对象的hashCode()方法的返回值也应相等3.对象中用作equals()方法比较的Field,都应该用来计算hashCode值LinkedHashSetLinkedHashSet是HashSet的子类LinkedHashSet根据元素的hashCode值来决定元素的存储位置,但它同时使用链表维护元素的次序,这使得元素看起来是以插入顺序保存的。LinkedHashSet插入性能略低于HashSet,但在迭代访问Set里的全部元素时有很好的性能。LinkedHashSet不允许集合元素重复。TreeSetTreeSet是SortedSet接口的实现类,TreeSet可以确保集合元素处于排序状态。TreeSet两种排序方法:自然排序和定制排序。默认情况下,TreeSet采用自然排序。排序——自然排序自然排序:TreeSet会调用集合元素的compareTo(Objectobj)方法来比较元素之间的大小关系,然后将集合元素按升序排列。如果试图把一个对象添加到TreeSet时,则该对象的类必须实现Comparable接口。实现Comparable的类必须实现compareTo(Objectobj)方法,两个对象即通过compareTo(Objectobj)方法的返回值来比较大小。Comparable的典型实现:BigDecimal、BigInteger以及所有的数值型对应的包装类:按它们对应的数值大小进行比较Character:按字符的unicode值来进行比较Boolean:true对应的包装类实例大于false对应的包装类实例String:按字符串中字符的unicode值进行比较Date、Time:后边的时间、日期比前面的时间、日期大向TreeSet中添加元素时,只有第一个元素无须实现Comparable接口,后面添加的所有元素都必须实现Comparable接口因为只有相同类的两个实例才会比较大小,所以向TreeSet中添加的应该是同一个类的对象对于TreeSet集合而言,它判断两个对象是否相等的唯一标准是:两个对象通过compareTo(Objectobj)方法比较返回值当需要把一个对象放入TreeSet中,重写该对象对应的equals()方法时,应保证该方法与compareTo(Objectobj)方法有一致的结果:如果两个对象通过equals()方法比较返回true,则通过compareTo(Objectobj)方法比较应返回0在进行排序的时候实际上每一个类中的属性最好都进行判断。importjava.util.Iterator;importjava.util.Set;importjava.util.TreeSet;classPersonimplementsComparablePerson{privateStringname;privateintage;publicPerson(Stringname,intage){this.name=name;this.age=age;}publicStringtoString(){return姓名:+this.name+,年龄:+this.age;}@OverridepublicintcompareTo(Persono){if(this.ageo.age){return1;}elseif(this.ageo.age){return-1;}else{returnthis.name.compareTo(o.name);}}}publicclassTreeSetDemo02{publicstaticvoidmain(String[]args){SetPersonall=newTreeSetPerson();all.add(newPerson(张三,20));all.add(newPerson(李四,20));all.add(newPerson(李四,20));all.add(newPerson(王五,19));IteratorPersonit=all.iterator();while(it.hasNext()){System.out.println(it.next());}}}输出姓名:张三,年龄:20姓名:李四,年龄:20姓名:王五,年龄:19此时加入了验证之后,可以发现,如果加入的对象重复的话,是不会正常加入的,可以去掉重复的内容。排序——定制排序TreeSet的自然排序是根据集合元素的大小,进行元素升序排列。如果需要定制排序,比如降序排列,可通过Comparator接口的帮助。需要重写compare(To1,To2)方法。利用intcompare(To1,To2)方法,比较o1和o2的大小:如果方法返回正整数,则表示o1大于o2;如果返回0,表示相等;返回负整数,表示o1小于o2。要实现定制排序,需要将实现Comparator接口的实例作为形参传递给TreeSet的构造器。此时,仍然只能向TreeSet中添加类型相同的对象。否则发生ClassCastException异常。使用定制排序判断两个元素相等的标准是:通过Comparator比较两个元素返回了0。面试题:List转成SetTherearetwowaystodoso,dependingonhowyouwantequaldefined.ThefirstpieceofcodeputsalistintoaHashSet.DuplicationisthenidentifiedmostlybyhashCode().Inmostcases,itwillwork.Butifyouneedtospecifythewayofcomparison,itisbettertousethesecondpieceofcodewhereyoucandefineyourowncomparator.SetIntegerset=newHashSetInteger(list);SetIntegerset=newTreeSetInteger(aComparator);set.addAll(list);面试题:去除List中重复值SetStringset=newHashSet(list);list.clear();list.addAll(set);集合输出在正常情况中,只要是集合的输出基本上都不会采用将其变为对象数组的方式,而是采用以下的四种形式完成的:Iterator(95%)ListIterator(1%,双向迭代输出)Enumeration(4%,几乎废弃)foreach(0%)只要是碰见集合的输出问题,不要思