及源代码课件12java集合1516javabak_第1页
及源代码课件12java集合1516javabak_第2页
及源代码课件12java集合1516javabak_第3页
及源代码课件12java集合1516javabak_第4页
及源代码课件12java集合1516javabak_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Java集合本节主要内容SetListMap数组与集合在创建Java数组时,数组的长度必要要指定.数组一旦创建好之后,长度不嫩改变.在同一个数组种只能存放同一种类型的数据(基本类型和引用类型)为了使程序能方便的存储和操作数目不固定的一组数据,JDK类库种提供了Java集合.所有的Java集合都在java.util包中.在集合中,只能存放对象的引用,而不能存放基本数据类型Java集合的3种类型Set(集):集合中的对象无排列顺序,并且没有重复的对象.它的有些实现类能对集合中的对象按照特定的方式进行排序List(队列):集合中的对象按照索引的顺序排列,可以有重复的对象; 可以按照对象在集合中的索引

2、位置检索对象.List与数组有些相似Map(映射):集合中的每一个元素都是一对一对的,包括一个key对象,一个Value对象(一个Key指向一个Value).集合中没有重复的key对象,但是vaulue对象可以重复.它的有些实现类能对集合怀中的键对象进行排序集合类的类框图Collection接口和Iterator接口在Collection接口中声明了适合的Java集合(List和Set)适合的方法方法描述boolean add(Object obj) 向集合中添加一个对象void clear() 删除集合中所有的对象boolean contains(Objecto) 判断在集合中是否包含特定的

3、对象的引用boolean isEmpty() 判断集合是否为空Iterator iterator() 返回一个Iterator类型的对象,用它来遍历集合boolean remove(Objecto) 从集合中删除一个对象int size() 返回集合中元素的数量Object toArray() 返回一个对象的数组,该数组中包含集合中所有的元素 Iterator接口封装了底层的数据结构,向用户提供了统一遍历集合的 方法,在Iterator接口中声明了如下的方法方法描述boolean hasNext() 判断集合中是否还有下一个元素Object next() 返回下一个元素void remove(

4、) 从集合中删除一个由next()方法返回的元素Collection练习public static void main(String args) CollectionTest test = new CollectionTest();Set set = new HashSet();set.add(Three);test.print(set); Map map = new HashMap();map.put(M, 男);map.put(F, 女);System.out.println(map);public void print(Collection coll) Iterator iter = c

5、oll.iterator();while (iter.hasNext() System.out.println(iter.next();代码参见案例:15-1 Collection与Iterator注意:如果集合中的元素 没有排序,Iterator遍 历集合取出来的元 素的顺序也是无序 的.并不一定与加入 元素的顺序一致SetSet集合中的对象不按照特定的方式排序,并且没有重复的对象 HashSet类按照哈希算法来存取 集合中的对象,速度较快 LinkedHashSet类不仅实现了哈 希算法,而且实现了链表的数据 结构,提高了插入和删除的功能 TreeSet类实现了SortedSet接口, 具

6、有排序的功能Set的一般用法Set中存放的是对象的引用,并且没有重复的对象.参见如下的代码 String s1 = Hello;String s2 = s1; String s3 = World; Set set = new HashSet();set.add(s1); set.add(s2); set.add(s3); System.out.println(set.size();Set的add()方法会用equals方法()判断新加入的对象是否存在与集合之中如果equals方法返回true,add()方法就不会将其加入到Set中.从而保证了在Set中没有重复的对象. String s1 =

7、Hello; String s2 = s1;String s3 = World; String s4 = World;Set set = new HashSet();set.add(s1); set.add(s2); set.add(s3); set.add(s4);System.out.println(set.size() + + set);代码参见案例 :15-2 15-2 Set的非重复性HashSet类HastSet的add方法在对象加入的适合,不光会调用equals()方法判断对象是否相同,而且还调用hashCode方法进一步判断对象是否相同如果在Student类中只覆盖了equal

8、s()方法,而没有覆盖hashCode()方法,会导致HashSet工作不正常.所以在自定义的类中,如果覆盖了equals()方法,最好也要覆盖hashCode()方法代码参见案例:15-3 HashSet的用法TreeSetTreeSet类实现了SortedSet接口,能够对集合中的对象进行排序 参见如下代码: Set set = new TreeSet(); set.add(new Integer(3); set.add(new Integer(2); set.add(new Integer(1); set.add(new Integer(5); Iterator it = set.ite

9、rator(); while (it.hasNext() System.out.println(it.next(); 代码参见案例: 15-4 TreeSet的用法TreeSet的排序方式向TreeSet中加入一个对象时.TreeSet会进行排序:一部分类实现Comparable接口,如String,Integer,Double等. Comparable有个int compareTo() 方法 对于表达式: x. compareTo(y),如果返回值为0 ,表示x,y相等;如果返回值大于0,表示x大于y;如果返回值小于0,表示x小于y. TreeSet真是调用对象的compareTo方法来比较

10、对象的,然后进行升序排列 在使用自然排序时,只能向TreeSet集合中加入同类型的对象,并且这些类必须实现Comparable接口 自定义类型与TreeSet如果自己定义的类要添加到TreeSet中,要实现Comparable接口,并实现该接口唯一的public int compareTo(Object o)方法;为了比较两个对象,还需要覆盖equals和hashCode方法 public int compareTo(Object o) Student stu = (Student) o;if (this.getName() pareTo(stu.getName() 0) return 1;i

11、f (this.getName() pareTo(stu.getName() stu.getAge() ) return 1;if (this.age stu.getAge() return -1;return 0; 代码参见案例:15-5 Tree与自定义类List(列表)List主要特征是其元素以线型方式存储,集合中可以存放重复的对象List的主要实现类包括:ArrayList:代表长度可变的数组。可以对元素快速的随机访问。但是向ArratList插入或删除元素的速度较慢LinkedList:在实现中才用了链表的数据接口,对顺序访问进行了优化。向List中插入和删除数据的速度快,随即访问的

12、速度较慢。访问列表的元素public static void main(String args) List list = new ArrayList();Integer a = new Integer(2);Integer b = new Integer(3);Integer c = new Integer(4);Integer d = new Integer(2);list.add(a); list.add(b); list.add(c); list.add(d);/ 也可以使用Iterator接口的方法遍历列表元素for (int i = 0; i list.size(); i+) Obj

13、ect o = list.get(i); System.out.println(o);代码参见案例:15-6 访问List元素为列表排序如果要对List中的元素进行排序,可以借组Collections类,该类提供了操作集合的各种静态方法,其中sort()方法用于对List中的元素进行排序 例如 list.add(a);list.add(b);list.add(c);list.add(d);Collections.sort(list);代码参见案例:15-7 List排序ListIterator接口和LinkedList类List的ListIterator()方法返回一个ListIterator

14、类型的对象,方法名称作用add()向列表中插入有个元素hasNext()判断列表中是否还有下一个元素hasPrevious() 判断列表中是否还有上一个元素next()返回列表的下一个元素previous() 返回列表的上一个元素public static void insert(List list, int data) ListIterator it = list.listIterator(); while (it.hasNext() Integer in = it.next(); if (data = Value() it.previous();it.add(new Integ

15、er(data);break; 代码参见案例: 15-8 LinkedList与ListIterator固定长度的ListJava.util.Arrays了的asList()方法可以将一个java数组包装成一个List对象,这个List对象的长度是固定的.对这个List不能调用List的add()方法和remove()方法,否则会抛出UnsupportedOperationException异常例如: public static void main(String args) String ss = aaa, ccc, ddd, eee ;List list = Arrays.asList(ss

16、);list.set(0, xxx);System.out.println(list);/list.add(fff); 代码参见案例:15-9 固定长度的List比较数组和各种List对java数组随机访问和迭代操作的速度最快LinkedList进行插入和删除速度最快ArrayList进行随机访问的速度较快MapMap是一种把键对象和值对象进行映射的集合,他的每一个元素都包含一个键对象,一个值对象,键对象相当于值对象的索引,而且值对象仍然可以是Map类型的向Map中插入数据的时候,必须提供一对键对象和值对象.在取出Map元素的时候,通过get(Object key)可以取出对应的值对象 Map

17、 map = new HashMap();map.put(1,AAA);String str = map.get(“1”); / str的值是AAAMap中key对象要求不能重复,但是Value对象的值可以重复.而且后加入的值会覆盖原来的值 Map map = new HashMap();map.put(1,AAA);map.put(1,BBB);map.put(1,CCC); String str = map.get(“1”); / str的值是CCCMap的entrySet方法Map的entrySet()方法可以返回一个Set集合,在Set集合中存放的是Map.Entry类型的对象,每个E

18、ntry代表Map中的一对(键,值) public static void main(String args) map.put(1,AAA); map.put(1,CCC); IteratorMap.Entry it = map.entrySet().iterator(); while(it.hasNext()Map.Entry entry = it.next();System.out.println(entry.getKey() + - + entry.getValue(); 代码参见案例:15-10 Map的entrySet方法HashMap与TreeMapMap有两个比较常用的实现类,H

19、ashMap和TreeMap HashMap安装Hash算法来存取键对象,有 很好的存取性能;为了保证HashMap能正 常工作,和HashSet一样,要求键对象要覆盖 的equals()方法和hashCode()方法 TreeMap类实现了SortedMap接口,能对键对 象进行排序. / map.keySet()方法返回Map对象所有键对象的集合 Set keys = map.keySet(); Iterator it = keys.iterator(); while(it.hasNext() String key = it.next(); String value = map.get(k

20、ey); System.out.println(key + - + value); 代码参见案例:5-11 TreeSet排序集合的编译时类型检查在JDK1.5之前,集合中所有的元素的类型都是Object类型.在从集合中取出数据的时候,要进行相应的类型转换.由于有时类型部匹配,可能造成类型转换异常 private static void addElements() List list = new ArrayList();list.add(AAA);list.add(new StringBuffer(BBB);print(list);private static void print(List

21、list) for (int i = 0; i list.size(); i+) String str = (String) list.get(i);System.out.println(str); 代码参见案例:5-12 集合的类型转换异常JDK1.5集合新特性按照程序中错误的发现时间,错误可以分为两类 1. 编译时错误 2. 运行时错误为了把一些在运行时的错误转换为编译时的错误,在JDK1.5中,引入了范性的概念,能够把运行时的ClassCastException 转换为编译时的类型不匹配错误所谓的范型,是之集合中元素的类型.在声明集合变量和创建集合对象的时候用“”在指明元素的类型.如果在

22、添加元素的时候,元素不是指定的类型,编译器会把错误检查出来 Set set = new HashSet(); set.add(AAA); set.add(new StringBuffer(BBB); 范型例子Set set = new HashSet();set.add(AAA);set.add(new Integer(23);set.add(new Object();/ -List list = new ArrayList();list.add(new StringBuffer(Tom);StringBuffer sb = list.get(0);Object obj = list.get(

23、0);String str = list.get(0).toString();System.out.println(sb + + obj + + str);代码参见案例:5-13 范型例子一范型例子private static void createSet()Set set = new HashSet();set.add(AAA);set.add(BBB);print(set);private static void print(Set set)Iterator it = set.iterator();while(it.hasNext()String str = it.next();Syste

24、m.out.println(str); 代码参见案例:5-13 范型例子二为范型设置上限以下的f1()方法的参数是Set类型,f2()方法调用f1()方法时,只有传入的参数是Set类型时,编译才能通过 public void f1(Set set)public void f2()f1(new HashSet(); /编译通过 f1(new HashSet(); /编译出错f1(new HashSet();/编译出错如果希望f1()接受Set 和Set类型,可以对f1()方法作如下的改动 public void f1(Set set)public void f2()f1(new HashSet(

25、); /编译通过 f1(new HashSet(); /编译通过 f1(new HashSet();/编译通过 Set对Set的范型设置了上限,表示接收Object类型及其子类 代码参见案例:5-14 范型设置上限为范型设置下限如果作如下的改动 public void f1(Set set)public void f2()f1(new HashSet(); /编译通过 f1(new HashSet(); /编译通过 f1(new HashSet();/编译出错表示对Set作了下限,表示接受String类型及其父类型代码参见案例:5-15 范型设置下限用for循环遍历集合在JDK1.5之前,可以使用Iterator遍历集合 public static void print(Set set) Iterator it = set.iterator();while (it.hasNext() String str = it.next();System.out.println(str);从JDK1.5开始,为遍历集合提供了更加简单的方法 public static void

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论