Java-集合讲解

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

java集合-------高级篇本节内容1、Java集合框架2、Collection接口API3、Iterator迭代器接口(遍历)4、Collection子接口之一:Set接口HashSetLinkedHashSetTreeSet5、Collection子接口之二:List接口ArrayListLinkedListVector(古老)6、Map接口HashMapTreeMapHashtable7、Collections工具类(集合)8、Arrays工具类(数组)Java集合概述为了方便对多个对象的操作,就要对对象进行存储。使用Array(数组)存储对象方面具有一些弊端,如:长度问题,而Java集合就像一种容器,可以动态地把多个对象的引用放入容器中。Java集合类可以用于存储数量不等的多个对象,还可用于保存具有映射关系的关联数组。Java集合概述Java集合可分为Collection和Map两种体系Collection接口:Set:元素无序、不可重复的集合List:元素有序,可重复的集合Map接口:具有映射关系“key-value对”的集合CollectionListSetVectorArrayListLinkedListHashSetSortedSetLinkedHashSetComparableComparatorCollectionsIteratorListIterator迭代器对象排序接口容器工具类Collection接口获取JDK提供的集合API位于java.util包内TreeSetMap接口MapHashtableHashMapSortedMapPropertiesLinkedHashMapTreeMapCollection接口Collection接口是List、Set和Queue接口的父接口,该接口里定义的方法既可用于操作Set集合,也可用于操作List和Queue集合。JDK不提供此接口的任何直接实现,而是提供更具体的子接口(如:Set和List)实现。在Java5之前,Java集合会丢失容器中所有对象的数据类型,把所有对象都当成Object类型处理;从Java5增加了泛型以后,Java集合可以记住容器中对象的数据类型集合与数组间转换操作Collection接口方法使用Iterator接口遍历集合元素Iterator对象称为迭代器(设计模式的一种),主要用于遍历Collection集合中的元素。所有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现了Iterator接口的对象。Iterator仅用于遍历集合,Iterator本身并不提供承装对象的能力。如果需要创建Iterator对象,则必须有一个被迭代的集合。在调用it.next()方法之前必须要调用it.hasNext()进行检测。若不调用,且下一条记录无效,直接调用it.next()会抛出NoSuchElementException异常。Iterator接口的方法使用foreach循环遍历集合元素Java5提供了foreach循环迭代访问Collection要遍历的元素类型要遍历的集合、数组名称遍历后元素名称publicclassTestForandEach{publicstaticvoidmain(String[]args){String[]str=newString[5];//nullfor(StringmyStr:str){myStr=“hello;System.out.println(myStr);//5个hello}for(inti=0;istr.length;i++){System.out.println(str[i]);//5个null}}}练习:判断输出结果为何?List接口Java中数组用来存储数据的局限性List集合类中元素有序、且可重复,集合中的每个元素都有其对应的顺序索引。List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。JDKAPI中List接口的实现类常用的有:ArrayList、LinkedList和Vector(线程安全)。List接口List集合里添加了一些根据索引来操作集合元素的方法voidadd(intindex,Objectele)booleanaddAll(intindex,Collectioneles)Objectget(intindex)intindexOf(Objectobj)intlastIndexOf(Objectobj)Objectremove(intindex)Objectset(intindex,Objectele)ListsubList(intfromIndex,inttoIndex)List实现类之一:ArrayListArrayList是List接口的典型实现类本质上,ArrayList是对象引用的一个变长数组ArrayList是线程不安全的,而Vector是线程安全的,即使为保证List集合线程安全,也不推荐使用VectorArrays.asList(…)方法返回值是一个固定长度的List集合LinkedList对于频繁的插入或删除元素的操作,建议使用LinkedList类,效率较高新增方法:voidaddFirst(Objectobj)voidaddLast(Objectobj)ObjectgetFirst()ObjectgetLast()ObjectremoveFirst()ObjectremoveLast()VectorVector是一个古老的集合,JDK1.0就有了。大多数操作与ArrayList相同,区别之处在于Vector是线程安全的。在各种list中,最好把ArrayList作为缺省选择。当插入、删除频繁时,使用LinkedList;Vector总是比ArrayList慢,所以尽量避免使用。新增方法:voidaddElement(Objectobj)voidinsertElementAt(Objectobj,intindex)voidsetElementAt(Objectobj,intindex)voidremoveElement(Objectobj)voidremoveAllElements()Set接口Set接口是Collection的子接口,set接口没有提供额外的方法Set集合不允许包含相同的元素,如果试把两个相同的元素加入同一个Set集合中,则添加操作失败。Set判断两个对象是否相同不是使用==运算符,而是根据equals方法Set实现类之一:HashSetHashSet是Set接口的典型实现,大多数时候使用Set集合时都使用这个实现类。HashSet按Hash算法来存储集合中的元素,因此具有很好的存取和查找性能。HashSet具有以下特点:不能保证元素的排列顺序HashSet不是线程安全的集合元素可以是null当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据hashCode值决定该对象在HashSet中的存储位置。HashSet集合判断两个元素相等的标准:两个对象通过hashCode()方法比较相等,并且两个对象的equals()方法返回值也相等。hashCode()方法如果两个元素的equals()方法返回true,但它们的hashCode()返回值不相等,hashSet将会把它们存储在不同的位置,但依然可以添加成功。对于存放在Set容器中的对象,对应的类一定要重写equals()和hashCode(Objectobj)方法,以实现对象相等规则。重写hashCode()方法的基本原则在程序运行时,同一个对象多次调用hashCode()方法应该返回相同的值当两个对象的equals()方法比较返回true时,这两个对象的hashCode()方法的返回值也应相等对象中用作equals()方法比较的Field,都应该用来计算hashCode值Set实现类之二:LinkedHashSetLinkedHashSet是HashSet的子类LinkedHashSet根据元素的hashCode值来决定元素的存储位置,但它同时使用链表维护元素的次序,这使得元素看起来是以插入顺序保存的。LinkedHashSet插入性能略低于HashSet,但在迭代访问Set里的全部元素时有很好的性能。LinkedHashSet不允许集合元素重复。Set实现类之三:TreeSetTreeSet是SortedSet接口的实现类,TreeSet可以确保集合元素处于排序状态。Comparatorcomparator()Objectfirst()Objectlast()Objectlower(Objecte)Objecthigher(Objecte)SortedSetsubSet(fromElement,toElement)SortedSetheadSet(toElement)SortedSettailSet(fromElement)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中添加元素时,只有第一个元素无须比较compareTo()方法,后面添加的所有元素都会调用compareTo()方法进行比较。因为只有相同类的两个实例才会比较大小,所以向TreeSet中添加的应该是同一个类的对象对于TreeSet集合而言,它判断两个对象是否相等的唯一标准是:两个对象通过compareTo(Objectobj)方法比较返回值当需要把一个对象放入TreeSet中,重写该对象对应的equals()方法时,应保证该方法与compareTo(Objectobj)方法有一致的结果:如果两个对象通过equals()方法比较返回true,则通过compareTo(Objectobj)方法比较应返回0排序——定制排序TreeSet的自然排序是根据集合元素的大小,进行元素升序排列。如果需要定制排序,比如降序排列,可通过Comparator接口的帮助。需要重写compare(To1,To2)方法。利用intcompare(To1,To2)方法,比较o1和o2的大小:如果方法返回正整数,则表示o1大于o2;如果返回0,表示相等;返回负整数,表示o1小于o2。要实现定制排序,需要将实现Comparator接口的实例作为形参传递给TreeSet的构造器。此时,仍然只能向TreeSet中添加类型相同的对象。否则发生ClassCastException异常。使用定制排序判断两个元素相等的标准是:通过Comparator比较两个元素返回了0。Map接口Map与Collection并列存在。用于保存具有映射关系的数据:Key-ValueMap中的

1 / 39
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功