当前位置首页 > 高等教育 > 大学课件/教案
搜柄,搜必应! 快速导航 | 使用教程  [会员中心]

Java语言程序设计课件:08课ch08 List(列表)

文档格式:PPT| 42 页|大小 387.50KB|积分 15|2023-02-21 发布|文档ID:189281123
第1页
下载文档到电脑,查找使用更方便 还剩页未读,继续阅读>>
1 / 42
此文档下载收益归作者所有 下载文档
  • 版权提示
  • 文本预览
  • 常见问题
  • List(列表)nList的主要特征是按照元素以线性方式存储,允许集合中存放重复对象List接口的主要实现类包括:ArrayList和LinkedListnArrayList:代表长度可以变化的数组允许对元素进行快速的随机访问,但是向ArrayList中插入与删除元素速度较慢10652115headList(列表)nLinkedList:双向链表向LinkedList中插入和删除元素的速度较快,随机访问的速度较慢它单独具有addFirst()、addLast()、getFirst()、getLast()、removeFirst()、removeLast()方法10152156head访问List中的元素nList中的对象按照索引位置排序,程序可以按照对象在集合中的索引位置来检索对象List list=new ArrayList();list.add(new Integer(3);list.add(new Integer(4);list.add(new Integer(3);list.add(new Integer(2);for(int i=0;ilist.size();i+)System.out.print(list.get(i)+”);Iterator it=list.iterator();while(it.hasNext()System.out.print(it.next()+”);List本身不带有排序功能nList本身不带有排序的功能。

    nCollections类是对Java集合类库中的辅助类,它提供操纵集合的各种静态方法nsort(List list):对List中的对象进行自然排序nsort(List list,Comparator comparator):对List中的对象进行自定义排序,comparator参数指定排序方式为List排序List list=new ArrayList();list.add(new Integer(3);list.add(new Integer(4);list.add(new Integer(3);list.add(new Integer(2);Collections.sort(list);for(int i=0;iv3K2-v1K3-v2K1-v1Map(映射)n向Map集合中加入元素时,必须提供一对键对象和值对象nMap的两个主要实现类:HashMap和TreeMapMap(映射)nMap最基本的用法,就是提供类似字典的能力n在Map中检索元素时,只要给出键对象,就会返回值对象Map map=new HashMap();map.put(1,Monday);map.put(one,Monday);map.put(2,Tuesday);map.put(3,Wensday);System.out.println(map.get(“1);System.out.println(map.get(one);Map接口中的方法npublic Set keySet():返回键的集合。

    npublic Set entrySet():返回“键值对”的集合nMap.Entry的对象代表一个“词条”,就是一个键值对可以从中取值或键Map接口中的方法不保证不保证顺序顺序Map map=new HashMap();map.put(1,Monday);map.put(one,Monday);map.put(2,Tuesday);map.put(3,Wensday);Set x=map.entrySet();Iterator i=x.iterator();while(i.hasNext()Map.Entry en=(Map.Entry)i.next();String key=(String)en.getKey();String value=(String)en.getValue();System.out.println(key+value);输出:3 Wensday2 Tuesday1 Mondayone MondayHashMap(不保证顺序)nHashMap按照哈希算法来存取键值对象n为了保证HashMap能正常工作,和HashSet一样,要求当两个键对象通过equals()方法比较为true时,这两个键对象的hashCode()方法的返回的哈希码也一样。

    TreeMapnTreeMap实现了SortedSet接口,能够对的键对象进行排序支持自然排序和自定义排序Map map =new TreeMap();map.put(1,Monday);map.put(one,Monday);map.put(2,Tuesday);map.put(3,Wensday);Set keys=map.keySet();Iterator it=keys.iterator();while(it.hasNext()String key=(String)it.next();String value=(String)map.get(key);System.out.println(key+value);输出:1 Monday2 Tuesday3 Wensdayone Monday泛型 GenericInteger list=(Integer)set.toArray(new Integer0);Object list=set.toArray();sum=sum+(Integer)listi;Iterator it=set.iterator();sum=sum+(Integer)it.next();Iterator it=keys.iterator();while(it.hasNext()String key=(String)it.next();String value=(String)map.get(key);这些错误在编译的时候是无法检查出来的这些错误在编译的时候是无法检查出来的运行时异常Set set=new HashSet();set.add(new StringBuffer(Mike);return set;public void printSet(Set set)Iterator it=set.iterator();while(it.hasNext()String str=(String)it.next();/可能会抛出ClassCastException System.out.println(str);n对于软件来说,错误发现的越早,越能降低软件开发和维护的成本。

    从而提高软件的健壮性n为了做到这一点,在JDK版本升级过程中,致力于把一些运行时异常转变为编译时错误n在JDK1.5版本中,引入泛型的概念,它把ClassCastException运行时异常转变为编译时类型不匹配错误泛型的例子/集合中元素必须为集合中元素必须为String类型类型Set set=new HashSet();set.add(“Tom”);/合法合法/编译出错,类型不匹配编译出错,类型不匹配set.add(new StringBuffer(“Mike”);/元素必须为元素必须为StringList list=new ArrayList();list.add(“Tom”);/合法合法String name=list.get(0);/合法,无需强制类型转换合法,无需强制类型转换Object obj=list.get(0);/合法,允许向上转型合法,允许向上转型/编译出错,无法类型转换编译出错,无法类型转换StringBuffer sb=(StringBuffer)list.get(0);泛型的例子Map map=new HashMap();Iterator it=map.keySet().iterator();while(it.hasNext()String key=it.next();String value=map.get(key);Set set=new HashSet();Iterator it=set.iterator();while(it.hasNext()String key=it.next();如何定义一个支持泛型的类public class MySet T t;public MySet()public void set(T t)this.t=t;public T get()return t;支持泛型的类支持泛型的类public class MyMap private K k;private V v;public MyMap()public void put(K k,V v)this.k=k;this.v=v;public K getK()return k;public V getV()return v;泛型的优点取消了强制类型转换;在编译时候发现问题;List list=new ArrayList();list.put(5);/编译不报错String s=(String)list.get(0);/运行报错List list=new ArrayList();list.put(5);/编译报错String s=list.get(0);java中使用泛型的例子中使用泛型的例子public interface Iterator E next();.public interface Iterable Iterator iterator();.public interface Collection extends Iterable boolean add(E e);.public interface List extends Collection boolean add(E e);.public class ArrayList extends AbstractList implements List,RandomAccess,Cloneable,java.io.Serializable public boolean add(E e).泛型结束后,重新考虑自定义排序泛型结束后,重新考虑自定义排序问题问题 关于关于Comparator nJava.util.Comparator接口提供具体的排序方式,指定被比较的对象的类型,Comparator有个compare(Type x,Type y)方法,用于比较两个对象的大小。

    ncompare(x,y)的返回值为0,则表示x和y相等,如果返回值大于0,则表示x大于y,如果返回值小于0,则表示x小于ypublic interface Comparator int compare(T o1,T o2);下次上课每名同学带下次上课每名同学带笔记本,充满电!笔记本,充满电!排序的实现方法汇总排序的实现方法汇总源代码参见:源代码参见:ch08.SortDemo注意枚举类型:注意枚举类型:EnumField/EnumOrder比较器:比较器:StudentComparator自定义排序n如果希望TreeSet按照Student对象的name属性进行降序排列,可以先创建一个实现Comparator接口的类StudentComparatornStudentComparator类就是一个自定义的比较器List/Set/Map总结Java集合类框图SetCollectionListAbstractCollectionAbstractListAbstracSetSortedSetTreeSetHashSetAbstractSquentialListLinkedList接口接口抽象类抽象类具体类具体类继承继承实现实现ArrayListVectorJava集合类框图MapHashMapSortedMapLinkedHashMapTreeMap接口接口抽象类抽象类具体类具体类继承继承实现实现Collection 方法方法描述描述public boolean add(E e)向集合中增加元素向集合中增加元素public boolean addAll(Collectionc)向集合中加入一组数据向集合中加入一组数据,泛型指泛型指定了操作上限定了操作上限public void clear()清空所有的内容清空所有的内容public boolean contains(Object o)判断是否有指定的内容查找判断是否有指定的内容查找public boolean containsAll(Collection c)查找一组数据是否存在查找一组数据是否存在public boolean equals(Object o)对象比较对象比较public int hashCode()返回返回hash码码public boolean isEmpty()判断集合的内容是否为空判断集合的内容是否为空public iterator()interator()为为interrator接口实例化接口实例化 迭代迭代输出输出public boolean remove(Object o)从集合中删除指定的对象从集合中删除指定的对象boolean removeAll(Collection c)从集合中删除一组对象从集合中删除一组对象public boolea retainAll(Collection c)保留集合中的指定内容保留集合中的指定内容public int size()取得集合的长度取得集合的长度List 在在Collection中增加中增加方法方法描述描述public void add(int index,E element)在指定的位置处加入一个元素在指定的位置处加入一个元素public boolean addAll(Collection c)在指定的位置加入一组元素在指定的位置加入一组元素public E get(int index)通过索引位置可以取出每个元通过索引位置可以取出每个元素素public ListIterator listIterator()为为ListIterator接口实例化接口实例化public E remove(int index)删除指定位置的内容删除指定位置的内容public E set(int index,E element)修改指定位置的内容修改指定位置的内容public List subList(int fromIndex,int toIndex)截取自集合截取自集合Map方法描述V put(K key,V value)增加内容增加内容V get(Object key)取得内容取得内容 很据很据key取内容取内容boolean containsKey(Object key)查找指定的查找指定的key是否存在是否存在boolean containsValue(Object value)查找指定的查找指定的value是否存在是否存在boolean isEmpty()判断集合是否为空判断集合是否为空 Set keySet()将全部的将全部的key变为变为set集合集合Collection values()将全部将全部value变为变为collection集合集合V remove(Object key)根据根据key删除内容删除内容void putAll(Map m)增加一组数据增加一组数据总结nHashSet:如果集合中对象所属的类重新定义了equals()方法,那么这个类也必须重新定义hashCode()方法,并且保证当两个对象用equals()方法比较的结果为true时,这两个对象的hashCode()方法的返回值相等。

    nHashMap要求其中的key同样具有上述属性nTreeSet:如果对集合中的对象进行自然排序,则要求对象所属的类实现Comparable接口,并且保证这个类的compareTo()和equals()方法采用相同的比较规则来比较两个对象是否相等nHashMap:如果集合中键对象所属的类重新定义了equals()方法,那么这个类也必须重新定义hashCode()方法,并且保证当两个键对象用equals()方法比较的结果为true时,这两个键对象的hashCode()方法的返回值相等nTreeMap:如果对集合中的键对象进行自然排序,则要求键对象所属的类实现Comparable接口,并且保证这个类的compareTo()和equals()方法采用相同的比较规则来比较两个键对象是否相等n为了增强程序的健壮性,在编写为了增强程序的健壮性,在编写Java程序程序时要养成以下良好习惯:时要养成以下良好习惯:l如果如果Java类重新定义了类重新定义了equals()方法,那方法,那么这个类也必须重新定义么这个类也必须重新定义hashCode()方法方法,并且保证当两个对象用,并且保证当两个对象用equals()方法比方法比较的结果为较的结果为true时,这两个对象的时,这两个对象的hashCode()方法的返回值相等。

    方法的返回值相等l 如果如果Java类实现了类实现了Comparable接口,那接口,那么就应该重新定义么就应该重新定义compareTo()、equals()方法和方法和hashCode()方法,保证方法,保证compareTo()和和equals()方法采用相同的方法采用相同的比较规则来比较两个对象是否相等,并且保比较规则来比较两个对象是否相等,并且保证当两个对象用证当两个对象用equals()方法比较的结果方法比较的结果为为true时,这两个对象的时,这两个对象的hashCode()方法方法的返回值相等的返回值相等nHashMap和HashSet具有较好的性能,是Map和Set的首选实现类只有在排序的场合,才考虑使用TreeSet和TreeMapLinkedList和ArrayList各有优点,如果经常对元素进行插入和删除操作,那么可以用LinkedList,如果经常随机访问元素,那么可以用Arraylist思考n如果一个对象 其hashCode()方法统统返回0,那么用在HashSet()HashMap的key,会发生什么现象?。

    点击阅读更多内容
    卖家[上传人]:努力学习1983
    资质:实名认证