版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第8章 Java泛型与集合类核心内容:1. 集合的作用与概念2. 泛型的作用与用法。3. Set、List、Map的用法4. Iterator、Enumeration的用法8.1 早期的集合类集合可理解为一个容器,该容器主要指映射(map)、集合(set)、列表(list)、散列表(hashtable)等抽象数据结构。容器可以包含有多个元素,这些元素通常是一些Java对象。针对上述抽象数据结构所定义的一些标准编程接口称之为集合框架。集合框架主要是由一组精心设计的接口、类和隐含在其中的算法所组成,通过它们可以采用集合的方式完成Java对象的存储、获取、操作以及转换等功能。集合框架的设计是严格按照
2、面向对象的思想进行设计的,它对上述所提及的抽象数据结构和算法进行了封装。封装的好处是提供一个易用的、标准的编程接口,使得在实际编程中不需要再定义类似的数据结构,直接引用集合框架中的接口即可,提高了编程的效率和质量。此外还可以在集合框架的基础上完成如堆栈、队列和多线程安全访问等操作。在集合框架中有几个基本的集合接口,分别是Collection接口、List接口、Set接口和Map接口,它们所构成的层次关系如图8-1所示。Collection接口Set接口List 接口Map接口 图8-1 集合框架层次关系图(1)Collection接口是一组允许重复的对象。(2)Set接口继承Collectio
3、n,但不允许集合中出现重复元素。(3)List接口继承Collection,允许集合中有重复,并引入位置索引。(4)Map接口与Collection接口无任何关系,Map的典型应用是访问按关键字存储的值,所包含的是键值对,而不是单个独立的元素。作为对上述接口的实现,Java语言目前主要提供下述类的定义,如表8-1所示 表8-1 集合接口及其类的实现接口集合类的实现历史集合类SetHashSetTreeSetListArrayList VectorLinkedList StackMapHashMap HashtableTreeMap由于在JDK1.5当中增加了泛型,我们把JDK1.5之前不支持泛
4、型的集合类称之为早期集合类。早期的集合有个缺点:当我们把一个对象存放到集合里后,集合就会“忘记”这个对象的数据类型,当再次取出该对象时,该对象的编译类型就变成了Object类型。早期的集合之所以被设计成这样,是因为设计集合的程序员不知道我们需要用它来保存什么类型的对象。所以他们把集合设计成能保存任何类型的对象。但这样做也带来了两个问题:一、集合对元素类型没有任何限制,例如只想创建一个保存String类型的集合,但是程序也允许把boolean类型的对象存放在该集合当中,这样容易引发异常。二、由于把对象保存在集合当中时,集合忘记了对象的数据类型,只知道它存放的是Object类型,因此取出集合元素后
5、通常要进行强制类型转换。这种强制类型转换既会增加程序的复杂度,也可能引发ClassCastException。【例8-1】 Test.java 早期集合类1 import java.util.ArrayList;2 import java.util.Iterator;3 import java.util.List;4 public class Test 5 public static void main(String args) 6 List list=new ArrayList();7 list.add(beijing);8 list.add(wuhan);9 list.add(shangh
6、ai);10 /list.add(4);11 for(int i=0;ijava Test beijing wuhan shanghai程序说明:上述程序的第6行是创建一个List集合对象,第7、8、9行是向该集合当中添了一个3个String类型的对象元素,第11、12、13、14行是通过for循环将集合当中的元素取出,转换为String类型并输出。上述程序只是创建了一个List对象,而且只用List对象来保存字符串对象。但是对于保存在List对象当中的数据类型我们不能做任何的限制。如果在程序的第10行,我们不小心把一个int类型的数据保存到List当中,就将导致程序在第12行出现ClassC
7、astException异常。自JDK1.5以后,Java引入了泛型的概念,允许我们在创建集合时指定集合元素的类型。这样添加数据元素到集合中时会做类型检查。如果要添加的数据元素与指定的数据类型不匹配,编译时会报错。8.2 泛型在面向对象编程语言中,多态算是一种泛化机制。例如,你可以将方法的参数类型设为基类,那么该方法就可以接受从这个基类中导出的任何类作为参数。这样的方法更加通用一些,可应用的地方也多一些。但有时候,拘泥于类的单继承体系,也会使程序受限太多。如果方法的参数是一个接口,而不是一个类,这种限制就放松了许多。因为任何实现了该接口的类都能够满足该方法。可是有时候,即便使用了接口,对程序的
8、约束也还是太强了。因为一旦指明了接口,就要求你的代码必须使用特定的接口。而我们希望达到的目的是编写更通用的代码,要使代码能够应用于“某种不具体的类型”,而不是一个具体的接口或类。在Java SE 5中增加了泛型机制。“泛型”这个术语的意思是:“适用于许多的类型”。泛型实现了参数化类型的概念,使代码可以应用于多种类型。8.2.1 泛型类 一个泛型类就是具有一个或多个类型变量的类。本节使用一个简单的Pair类作为例子。public class Pair private T first;private T second;public Pair()first=null; second=null;pub
9、lic Pair(T first,T second)this.first=first; this.second=second;public T getFirst()return first;public T getSecond()return second;public void setFirst(T newValue)first=newValue;public void setSecond(T newValue)second=newValue; Pair类引入了一个类型变量T,用尖括号括起来,并放在类名的后面。泛型类可以有多个类型变量。例如,可以定义Pair类,其中第一个成员变量和第二个成员
10、变量使用不同的类型:public class Pair.类定义中的类型变量指定方法的返回类型以及成员变量和局部变量的类型。例如:private T first;用具体的类型替换类型变量就可以实例化泛型类型,例如:Pair可以将结果想像成带有构造器的普通类:public class Pair private String first;private String second;public Pair()first=null; second=null;public Pair(String first,String second)this.first=first; this.second=secon
11、d;public String getFirst()return first;public String getSecond()return second;public void setFirst(String newValue)first=newValue;public void setSecond(String newValue)second=newValue;【例8-2】 PairTest.java 泛型类1 public class PairTest2 public static void main(String args)3 Pair pair=new Pair(Hello,Java
12、);4System.out.println(first=+pair.getFirst();5System.out.println(second=+pair.getSecond();67输出结果:D:JAVA8java PairTestfirst=Hellosecond=Java程序分析: 上述程序的第3行创建了一个泛型类对象pair,并指定该对象的成员变量的类型为String类型。并调用其带String类型参数的构造方法对其进行初始化。将pair对象的第一个成员变量first的值设置为Hello,第二个成员变量second的值设置为Java。第4,5行分别调用pair对象的getFirst()
13、、getSecond()方法获得成员变量first、second的值并输出到控制台。8.2.2 泛型方法前面已经介绍了如何定义一个泛型类。实际上,还可以定义一个带有参数类型的方法即泛型方法。泛型方法使得该方法能够独立于类而产生变化,泛型方法所在的类可以是泛型类,也可以不是泛型类。创建一个泛型方法常用的形式如下: 访问修饰符 static final 返回值 方法名( 形式参数列表 )下面我们在GenericMethod类当中声明一个f ( )泛型方法,用于返回调用该方法时,所传入的参数类型的类名。【例8-3】 GnericMethodTest.java 泛型方法1class GenericMe
14、thod2 public void f(T x)3 System.out.println(x.getClass().getName();4567 public class GenericMethodTest8 public static void main(String args)9 GenericMethod gm=new GenericMethod();10 gm.f( );11 gm.f(1);12 gm.f(1.0f);13 gm.f(c);14 gm.f(gm);1516输出结果:D:JAVA8java GenericMethodTestjava.lang.Stringjava.la
15、ng.Integerjava.lang.Floatjava.lang.CharacterGenericMethod程序分析: 上述程序的第9行创建了一个GenericMethod类型的对象gm。第10行调用该对象的f()方法,并传递参数为。f()方法通过getClass()方法获取传入参数的类别,并通过getName()方法获取该类别的名字,然后输出到控制台。同理,第1114行分别将1、1.0f、c、gm所属类别的名字输出到标准控制台。 注意:当使用泛型类时,必须在创建对象的时候指定类型参数的值,而使用泛型方法的时候,通常不必指明参数类型,因为编译器会为我们找出具体的类型。这称为类型参数推断。
16、因此我们可以像调用普通方法一样调用f(),编译器会根据调用f()时传入的参数类型与泛型类型进行匹配。8.2.3 泛型接口除了泛型类和泛型方法,还可以使用泛型接口。泛型接口的定义与泛型类非常相似,它的声明形式如下:interface 接口名下面我们创建了一个名为MinMax的接口,用来返回某个对象集的最小值或最大值interface MinMaxT extends ComparableT min();T max();MinMax接口类型参数T是有界类型,它必须是Comparable的子类。注意到Comparable本身也是一个泛型类,它是由系统定义在类库中的,可以用来比较两个对象的大小。接下来我
17、们定义一个类MyClass来实现这个接口class MyClassT extends Comparable implements MinMaxT vals; MyClass(T ob) vals = ob; public T min() T val = vals0; for(int i=1; ivals.length; +i) if (pareTo(val) 0) val = valsi; return val;public T max() T val = vals0; for(int i=1; i 0) val = valsi; return val;注意MyClass的声
18、明部分:它的类型参数T必须和要实现的接口中的声明完全一样.反而是接口MinMax的类型参数T最初是写成有界形式的,现在已经不再需要重写一遍。下面通过一个例子来测试MyClass的运行情况【例8-4】 MyClassTest.java 泛型接口1 public class MyClassTest2 public static void main(String args)3 Integer inums = 56,47,23,45,85,12,55;4 Character chs = x,w,z,y,b,o,p;5MyClass iob = new MyClass(inums);6MyClass c
19、ob = new MyClass(chs);7System.out.println(Max value in inums: +iob.max();8System.out.println(Min value in inums: +iob.min();9System.out.println(Max value in chs: +cob.max();10 System.out.println(Min value in chs: +cob.min();11 12输出结果:D:JAVA8java MyClassTestMax value in inums: 85Min value in inums: 1
20、2Max value in chs: zMin value in chs: b 程序分析: 上述程序的第3行定义了一个Integer类型的数组inums。第4行定义了一个character类型的数组chs。第5行创建了一个MyClass类型的对象iob并指定其参数类型为Integer类型。即iob对象的成员变量T val为数组inums。第6行创建了一个MyClass类型的对象cob.并指定其参数类型为String类型。即cob对象的成员变量T val为数组chs。8.2.4 通配类型参数前面介绍的泛型已经可以解决大多数的实际问题,但在某些特殊情况下,仍然会有一些问题无法轻松地解决。以Stat
21、s类为例,假设在其中存在一个名为doSomething()的方法,这个方法有一个形式参数,也是Stats类型,如下所示:class StatsT nums;Stats (T obj)nums = obj;double average()double sum = 0.0;for (int i=0; inums.length; +i)sum += numsi.doubleValue();return sum / nums.length;void doSomething(Stats ob) System.out.println(ob.getClass().getName();下面我们通过StatsT
22、est类来测试Stats运行情况【例8-4】StatsTest.java 通配类型参数1public class StatsTest2 public static void main(String args)3 Integer inums = 1,2,3,4,5;4 Stats iobj = new Stats(inums);5 Double dnums = 1.1,2.2,3.3,4.4,5.5;6 Stats dobj = new Stats(dnums);7 dobj.doSomething(iobj); /iobj和dobj的类型不相同8 9输出结果:D:JAVA8javac Stat
23、sTest.javaStatsTest.java:7: 无法将 Stats 中的 doSomething(Stats) 应用于 (Stats) dobj.doSomething(iobj); /iobj和dobj的类型不相同程序分析:编译时出错是因为在StatsTest类中,dobj.doSomething(iobj);这条语句有问题。dobj是Stats类型,iobj是Stats类型,由于实际类型不同,而声明时用的是: void doSomething(Stats ob)它的类型参数也是T,与声明对象时的类型参数T相同。于是在实际使用中,就要求iobj和dobj的类型必须相同。 解决这个问题
24、的办法是使用Java提供的通配符?,它的使用形式如下: genericClassName 现将上面Stats类当中的doSomething()可以声明成这个样子: void doSomething(Stats ob)它表示这个参数ob可以是任意的Stats类型,于是调用该方法的对象就不必和实际参数对象类型一致了。现执行StatsTest类,查看通配符的效果,输出结果如下:D:JAVA8java StatsTestStats注意由于泛型类Stats的声明中,T是有上界的:class Stats。故void doSomething(Stats ob) /这里使用了类型通配符其中,通配符?有一个默认
25、的上界,就是Number。如果想改变这个上界,也是可以的,但改变后的上界必须是Number类的子类。比如Stats ob但是不能写成这样: Stats ob因为Integer是Number的子类,而String不是Number的子类。通配符无法将上界改变得超出泛型类声明时的上界范围, 最后读者需要注意一点,通配符是用来声明一个泛型类的变量的,而不能创建一个泛型类。比如下面这种写法是错误的:class Stats8.3 泛型集合类 在JDK1.5中增加了泛型,集合类也开始支持泛型,允许在创建集合对象时通过泛型来指定该集合存储的对象类型。我们把JDK1.5及以后版本中支持泛型的集合类称之为“泛型集
26、合类”,作为对集合接口的实现,Java语言目前主要提供下述集合类的定义,如表9-2所示 表8-2 泛型集合类及对应的非泛型集合类接口泛型集合类非泛型集合类SetHashSetHashSetTreeSetTreeSetListArrayListArrayListLinkedListLinkedListMapHashMap HashMapTreeeMapTreeMap8.3.1 集合(Set)集合是指一个不包含重复元素的对象集合,是数学上“集合”概念的一种抽象。其本身是无序的。集合Set接口定义在java.util包中,所定义的方法主要分为两类:(1)集合和元素之间的方法;(2)集合之间的方法。下
27、面介绍详细的方法描述。1.描述集合和元素之间的关系的方法(1)public boolean add(Object element) 将一个元素添加到集合中,如果该元素成功添加到集合中,返回true。(2)public boolean remove(Object obj) 从这个集合中删除等于obj的对象。如果有匹配的对象被删除,返回true。(3)public boolean contains(Object obj) 如果集合中包含了一个与obj相等的对象,返回true。 (4)public int size( ) 返回当前存储在集合中的元素个数。 (5)public boolean isEm
28、pty( ) 如果集合中没有元素,返回true。 (6)public void clear( ) 从这个集合中删除所有的元素。 2.描述集合之间关系的方法(1)public boolean containsAll(Collection other)如果这个集合包含other集合中的所有元素,返回true。(2)public boolean addAll(Collection other)将other集合中的所有元素添加到这个集合。添加成功返回true。(3)public boolean removeAll(Collection other)从这个集合中删除other集合中存在的所有元素。删除成
29、功返回true。 (4)public boolean retainAll(Collection other)从这个集合中删除所有与other集合中的元素不同的元素。删除成功返回true。在集合框架中,HashSet类和TreeSet类实现了Set接口。这两个类定义在java.util包中一般情况下,采用HashSet类创建一个无序的集合对象,采用TreeSet类创建有序的集合对象。需要注意的是,添加到TreeSet中的元素必须是可排序的。【例8-6】HashSetTest.java HashSet类的应用1 import java.util.HashSet;2 public class Has
30、hSetTest3 public static void main(String args)4 boolean b;5 HashSet s=new HashSet();6 b=s.add(Hello);7 System.out.println(添加单词Hello,返回为+b);8 b=s.add(Java);9 System.out.println(添加单词Java,返回为+b);10 b=s.add(Hello);11 System.out.println(添加单词Hello,返回为+b);12 b=s.add(world);13 System.out.println(添加单词world,返
31、回为+b);14 for(String element:s)15 System.out.println(element);16 17 输出结果:D:JAVA8java HashSetTest添加单词Hello,返回为true添加单词Java,返回为true添加单词Hello,返回为false添加单词world,返回为trueworldJavaHello程序说明: 在上述程序第5行创建了一个存放String类型的HashSet 集合对象s。713行分别向其中添加了“Hello、Java、“Hello、world共4个字符串。由于Set类型的集合不能存放重复的数据。故在第10行中,向集合当中第二次
32、存放Hello字符串时。返回结果为false。第14行调用了for(:)循环来输出集合当中的元素。该循环可以用来输出集合当中的所有元素。类似于迭代器(Iterator)的作用,但使用时要比迭代器更简洁,更方便。由于HashSet集合当中的元素是无序的,故使用for(:)循环输出集合当中的元素时,输出结果也是随机的。该程序每次运行时,结果或都不一样。【例8-7】 TreeSetTest.java TreeSet类的应用1 import java.util.TreeSet;2 public class TreeSetTest3 public static void main(String args
33、)4 boolean b;5 TreeSet s=new TreeSet();6 b=s.add(Hello);7 System.out.println(添加单词Hello,返回为+b);8 b=s.add(Java);9 System.out.println(添加单词Java,返回为+b);10 b=s.add(Hello);11 System.out.println(添加单词Hello,返回为+b);12 b=s.add(world);13 System.out.println(添加单词world,返回为+b);14 for(String element:s)15 System.out.p
34、rintln(element);16 17 输出结果:D:JAVA8java TreeSetTest添加单词Hello,返回为true添加单词Java,返回为true添加单词Hello,返回为false添加单词world,返回为trueHelloJavaWorld程序说明: 在上述程序第5行创建了一个存放String类型的TreeSet 集合对象s。713行分别向其中添加了“Hello、Java、“Hello、world共4个字符串。由于Set类型的集合不能存放重复的数据。故在第10行中,向集合当中第二次存放Hello字符串时。返回结果为false。第14行调用了for(:)循环来输出集合当中
35、的元素。该循环可以用来输出集合当中的所有元素。在本例中采用TreeSet集合,实现了集合元素的有序输出,但这种实现是有代价的,即集合中得元素需要具有可比性。什么是可比性?下面通过例8-8和例8-9说明这个问题。【例8-8】HashSetDemo1.java HashSet类的应用1import java.util.HashSet;2public class HashSetDemo13 public static void main(String args)4 HashSet s=new HashSet();5 s.add(110);6 s.add(new Integer(110);7 for(
36、Object element:s)8 System.out.println(element);910输出结果:D:JAVA8java HashSetDemo1110110程序分析: 上述程序的第4行创建了一个HashSet对象s。第5行向HashSet对象s中添加了一个字符串对象110,第6行向HashSet对象s中添加了一个Integer对象110。第7行通过for(:)循环将HashSet对象中元素输出。【例8-9 】TreeSetDemo1.javaTreeSet类的应用1import java.util.TreeSet;2public class TreeSetDemo13 publi
37、c static void main(String args)4 TreeSet s=new TreeSet()5 s.add(110)6 s.add(new Integer(110);7 for(Object element:s)8 System.out.println(element);9 10输出结果:D:JAVA8java TreeSetDemo1Exception in thread main java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer at java.lang.
38、IpareTo(Unknown Source) at java.util.TreeMap.put(Unknown Source) at java.util.TreeSet.add(Unknown Source) at TreeSetDemo1.main(TreeSetDemo1.java:6)程序分析: 本例与例8-8其他的程序语句相同,唯一的区别在于例8-8中采用的是创建一个HashSet对象,而本例中采用的是创建一个TreeSet对象,但运行结果却并不相同。本例的运行结果出现异常,是因为字符串对象和Integer对象不具备可比性,所以TreeSet在对它们进行排序时得到
39、不正确的结果,故抛出异常。在本例中由于构建TreeSet对象时没有指定其存储的数据类型。故字符串对象和Integer对象这两种不具备可比性的对象都存放到TreeSet对象当中。为了避免这种情况。我们可以在声明TreeSet对象的时候指定其存放的数据类型。即使用泛型。【例8-10】TreeSetDemo2.javaTreeSet类的应用1import java.util.TreeSet;2public class TreeSetDemo13 public static void main(String args)4 TreeSet s=new TreeSet()5 s.add(110)6 s.a
40、dd(new Integer(110);7 for(Object element:s)8 System.out.println(element);9 10 输出结果: The method add(String) in the type TreeSet is not applicable for the arguments (Integer) 程序分析: 该程序在编译时会报错。是因为第6行中。存放一个Integer类型的数据到TreeSet集合对象中时,编译器会作类型检查。若发现存放的数据类型与指定的数据类型不一致,就会报错。从而避免集合当中的数据不具备可比性。8.3.3 列表(List) 列
41、表是指一个有序的对象集合,也称为一个对象序列。通过列表接口,可以利用整数索引(即元素在列表中得位置)对列表中的每个元素有准确的控制,包括访问特定位置的元素对象和查询特定的元素。与集合不同之处在于列表中允许出现重复的元素。在列表接口中,除了在集合中所定义的方法外,还有一系列针对列表中特定位置的方法。列表List接口定义在java.util包中,下面介绍列表接口中针对特定位置的方法。(1)public void add(int index, E element) 在列表的指定位置索引为index处插入指定元素element。(2)public boolean addAll(int index, C
42、ollection c)将指定Collection c中的所有元素都插入到列表中的指定位置。(3)public E get(int index)返回列表中指定位置的元素。(4)public int indexOf(Object o) 返回此列表中第一次出现的指定元素的索引;如果列表不包含该元素,则返回 -1。(5)public int lastIndexOf(Object o) 返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。(6)public E remove(int index) 移除列表中指定位置的元素。(7)public E set(int index, E
43、element) 用指定元素替换列表中指定位置的元素。在集合框架中,实现了列表接口(List)的是ArrayList类和LinkedList类。这两个类定义在java.util包中。ArrayList类是通过数组方式来实现的,相当于可变长度的数组。LinkedList类则是通过链表结构来实现。由于这两个类的实现方式不同,使得相关操作方法的代价也不同。一般说来,若对一个列表结构的开始和结束处有频繁地添加和删除操作时,一般选用LinkedList类所实例化的对象表示该列表。【例8-11】 ArrayListDemo.java ArrayList类应用1import java.util.ArrayL
44、ist;2public class ArrayListDemo3 public static void main(String args)4 ArrayList list=new ArrayList();5 list.add(collection);6 list.add(list);7 list.add(ArrayList);8 list.add(LinkedList);9 for(String s:list);10 System.out.println(s);11 list.set(3,ArrayList);12 int len=list.size();13 for(int n=0;njav
45、a ArrayListDemocollectionlistArrayListLinkedListcollectionlistArrayListArrayList程序分析: 上述程序第4行创建了一个ArrayList类型的对象list,并指定其存储的对象类型为String类型。第58行分别将collection 、list、ArrayList、LinkedList添加到list中,第910行通过for(:)循环输出list集合当中的所有元素。第12行通过set()方法将list集合当中的第4个元素指定为ArrayList,第12行通过size()方法获取list当中的元素个数。第1314行通过f
46、or循环输出list当中的所有元素。通常利用LinkedList对象表示一个堆栈(stack)或队列(queue)。对此LinkedList类中特别定义了一些方法,而这是ArrayList类所不具备的。这些方法用于在列表的开始和结束处添加和删除元素,其方法定义如下:(1)public void addFirst(E element)将指定元素插入此列表的开头。 (2)public void addLast(E element) 将指定元素添加到此列表的结尾。 (3)public E removeFirst() 移除并返回此列表的第一个元素。(4)public E removeLast()移除并
47、返回此列表的最后一个元素。【例8-12】 LinkedListDemo.java LinkedList类应用1 import java.util.LinkedList;2 public class LinkedListDemo3 public static void main(String args)4 LinkedList queue=new LinkedList();5 queue.addFirst(set);6 queue.addLast(HashSet);7 queue.addLast(TreeSet);8 queue.addFirst(List);9 queue.addLast(Ar
48、rayList);10 queue.addLast(LinkedList);11 queue.addLast(map);12 queue.addFirst(collection);13 System.out.println(queue);14 queue.removeLast();15 queue.removeFirst();16 System.out.println(queue);17 18 输出结果:D:JAVA8java LinkedListDemocollection, List, set, HashSet, TreeSet, ArrayList, LinkedList, mapList, set, HashSet, TreeSet, ArrayList, LinkedList程序分析: 上述程序的第4行创建了一个LinkedList类型的对象queue,并指定其存放的元素类型为String。第5行通过addFirst() 方法在queue中的队首放置元素set,第6行通过addLast()方法向queue中添加元素HashSet,该元素位于set元素的后面。第7行通过addLast()方法向queue中添加元素TreeSet,该元素位于HashSe
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广告合规审查员岗前全能考核试卷含答案
- 心梗患者康复护理指导
- 智能楼宇管理员成果测试考核试卷含答案
- 起重机械装配调试工创新方法强化考核试卷含答案
- 制浆备料工道德测试考核试卷含答案
- 房缺微创封堵术麻醉管理
- 康复护理学原理与实践第四版
- 荷斯坦奶牛异常行为与产奶性能及生理指标的内在关联剖析
- 药乌檀化学成分的深度剖析与研究
- 荣乌高速八段路面工程项目质量管理:问题剖析与优化策略
- 《西方文明之源》课件
- 驾照体检表完整版本
- 内分泌科慢性肾上腺皮质功能减退症诊疗规范2023版
- 600吨-年新材料项目环评报告书
- 加密流量检测与分析
- 企业隶属关系证明书1
- 收割小麦协议书
- DB13T 5657-2023 地理标志产品 平泉滑子菇
- 钢铁公司设备管理制度
- 光电检测技术课件(第三章)
- GB/T 31266-2014过磷酸钙中三氯乙醛含量的测定
评论
0/150
提交评论