Java面向对象程序设计第13章_泛型与集合框架资料
- 格式:pdf
- 大小:7.43 MB
- 文档页数:40
第三章集合和泛型一.集合的框架:集合:也称之为容器,它可以将一系列元素组合成一个单元,用于储存,处理,管理数据。
JDK提供的集合API都包含在Java.util中。
Java集合的框架主要分为俩部分,一个为Collection接口;另一个为Map接口;集合//绿色表示的是主要学习的接口//红色表示的是主要学习的实现类Collection接口主要有三个接口:Set接口,List接口,Queue接口。
Set接口集合的特点:无序的,不可以重复的,不可以根据元素的索引进行访问元素(索引即元素对应的下标)。
List接口集合的特点:有序的,可以重复的,可以根据元素的索引进行访问元素。
二.Set接口Set接口主要有俩个实现类TreeSet和HashSet。
Set接口继承自Collection接口的主要方法:Boolean add (Object obj)返回属性类型添加方法添加元素的类型添加元素的名称(Object代表为所有类型)向集合中添加元素,不能添加相同的元素。
若添加后视为操作无效返回false值。
void clear()移除此集合中的所有的元素,即集合清空。
Boolean contains(Object obj)判断此集合中是否包含该元素,如包含返回值为true。
Boolean isEmpty()判断该集合是否为空,为空返回true。
Iterator itweator()返回一个Iterator对象,可用它遍历集合中的所有元素。
Boolean remove(Object obj)删除此集合包含的元素,并返回true。
Int size()返回集合中元素的个数。
Object[] toArray 但会一个数组,该数组包含集合中的所有元素。
.......HashSet 实现类和TreeSet实现类都实现的是set接口,所以set接口可以使用的方法俩个实现类都可以实现。
TreeSet实现类在实现了set接口的同时,也实现了SortedSet接口,所以TreeSet是一个具有有排序功能的Set接口类。
Java泛型集合与泛型类泛型的本质是什么什么是泛型,泛型是⼀种模板技术,就好⽐排序,所有的排序策略,核⼼问题是⽐较和交换,如果⼀种算法对double有效,则只要提供⽐较⼤⼩的规则,该算法也对String甚⾄任意数据类型有效,⽽泛型可以使得这样的排序算法⼀个实现就应⽤到多中情形。
结合这种概念,就有了泛型集合,好⽐ArrayList集合的实现,⽆论对于什么数据类型,其算法结构都是⼀样的,于是从JDK5后有了泛型集合。
泛型有什么好处当然,有了泛型集合和泛型技术后,泛型带来的好处就不只是代码重⽤了,还包括类型安全,以及更好的可读性。
要知道下⾯的代码,在编写代码的时候是不会报错的,要命的是在运⾏的时候就会:1 List list1 = new ArrayList();// ⾮泛型集合2 list1.add("testString");3 list1.add(Integer.valueOf(10));4for (Object s : list1) {5 Integer num = (Integer) s;6// 类型不安全,会抛出异常7 }但是如果是泛型集合,你在编写代码的时候JDK就直接告诉你这⾥不可以这么使⽤了:List<String> list2 = new ArrayList<String>();//list2.add(1);//类型检查,不是允许的类型⽆法放⼊集合这就是所谓的类型安全了。
这是泛型的第⼆个好处。
当然泛型的另外⼀个好处就是增强可读性,取出数据的时候不再有完全没有意义的强制类型转换,因为程序员应该知道这个类型是什么。
泛型的⾮协变性Java中的泛型集合不是协变的,下⾯的代码你觉得可以编译通过吗:List<String> list3 = new ArrayList<String>();List<Object> list4 = list3;看起来没什么问题对吧,⼀个是Object集合,⼀个是String集合,完全兼容啊,事实上是不⾏的,如果⾏的话,泛型集合ArrayList的实例就可以装⼊任何对象了不是吗?这⾥还有个⼩知识:Java的泛型⽀持是编译期技术,所谓的类型擦除就是这个意思,我们后⾯再详细聊。
集合框架1,集合概述为了保存数量不确定的数据,以及保存具有映射关系的数据,Java提供了集合类,集合类主要保存、盛装其它数据(集合里只能保存对象,实际上保存的是对象的引用变量),因此集合类也被称为容器类。
Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些子接口或实现类,所有的集合类都位于java.util包下。
下图是部分集合框架的梗概:2,CollectionCollection接口是List、Set和Queue接口的父接口,该接口里定义了List、Set和Queue 的共性方法,必须要掌握。
2.1,boolean add(Object o):用于向集合中添加元素,如果集合对象被添加操作改变了,则返回true。
2.2,boolean addAll(Collection c):将集合c里的所有元素添加到指定的集合里,如果集合被添加操作改变了,返回true。
2.3,void clear():清除集合里的所有元素。
2.4,bolean contains(Object o):返回集合里是否包含指定元素。
2.5,boolean containsAll(Collection c):返回集合里是否含集合c里的所有元素。
2.6,boolean isEmpty():返回集合是否为空。
当集合长度为0时,返回true;否则返回false。
2.7,Iterator iterator():返回一个Iterator对象,用于遍历集合里的元素。
2.8,boolean remove(Object o):删除集合中指定元素o,当集合中包含了一个或多个元素o 时,全部删除,返回true。
2.9,boolean removeAll(Collection c):从该集合中删除集合c里包含的元素,删除一个或一个以上元素,返回true。
2.10,boolean retainAll(Collection c):从该集合中删除集合c里不包含的元素,取交集,操作改变了该集合,返回true。
集合框架之泛型详解泛型(Generics)什么是泛型?泛型是在jdk1.5以后出现的新特性,用于解决安全问题,是一个类型安全机制。
泛型格式:通过<>来定义要操作的引用数据类型。
例如以下的例子:import java.util.*;class GenericsDemo{public static void main(String[] args){ArrayList<String> list=new ArrayList<String>();list.add("zhangsan");list.add("lisi");list.add("huangsan");//list.add(new Integer(3));//会出编译时错误for(Iterator<String> it=list.iterator();it.hasNext();){String s=it.next();System.out.println(s);}}}我们可以看到使用泛型有很多好处。
a)将运行时期出现问题ClassCastException,转移到了编译时期。
方便程序员解决问题。
让运行时期问题减少,安全。
b)避免了强制转换的麻烦。
什么时候使用泛型呢?是在使用java提供的API的一些对象时,只要见到<>就要定义泛型,通常在集合框架中很常见。
<>就是用来接受类型的,当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。
自定义泛型自定义泛型类自定义泛型有什么好处呢?自定义泛型最大的好处就是扩展性好。
我们看看如下的例子:class GenericsTool<T>{private T t;public T getObject(){return t;}public void setObject(T t){this.t=t;}}class CustomGenericsDemo{public static void main(String[] args){/*Objcet*/ObjectTool ot=new ObjectTool();ot.setObject(new Student());Student stu=(Student)ot.getObject();/*Generics,T也可以是Student*/GenericsTool<Person> gt=new GenericsTool<Person>();gt.setObject(new Person());Person p=gt.getObject();//不需要强制转换}}我们可以看出自定义泛型的可扩展性高。
Java语言程序设计C实验报告集合框架及泛型机制学生姓名专业、班级________________________________________ 指导教师 _______________________________________ 成绩_______________________________计算机与信息工程学院年月日一、实验目的学习课程相关章节知识,通过上机练习,掌握以下知识:1.掌握List 接口下ArrayList 及LinkedList 的使用方法。
2.掌握Map 接口下HashMap 及HashTable 的使用方法3.掌握集合中泛型的使用二、实验内容利用集合完成象数据库那样存储数据,并且可以简单查询,利用map 存储学生信息,字段如下:id ,name,age ,实现步骤:(1)创建类,类图如下:2)在main 方法编写逻辑代码3)运行程序并测试结果package ;public class Student {private String name ;private int age ;private String id ;public String getName() {return namepublic void setName(String name ) {this .name = name ;}public int getAge() {return age ;}public void setAge( int age ) {this .age = age ;}public String getId() {return id ;}public void setId(String id) {this .id = id;}public Student(String name , int age , String id ) { super ();this .name = name ;this .age = age ;this .id = id;}public void sayHi(){System. out .println( "name=" + this .getName()+ "age=" + this .getAge()+ " "+ "id=" + this .getId());}//Databace 类package ;import java.util.Collection;import java.util.HashMap;import java.util.Iterator;public class Databace {private Student a;public Databace() {super ();map = new HashMap<String,Student>();}public Student getA() {return a;}public void setA(Student a) {this .a = a;}HashMap<String,Student> map ;public void delete(){ID" );System. out .println( " 请输入要删除表中元素String id =Test. sc.next();if (map .containsKey( id)){map .remove( id);Collection<Student> c= map .values();IteratorvStude nt> it= c.iterator();while (it .hasNext()){a= it .n ext();a.sayHi();}}else{System. out .println("表中没有该元素");}}public void in sert(){System. out .println("按顺序输入id、age、name");String name =Test. sc.next();int age =Test. sc.n ext In t();String id =Test. sc.next();a= new Student( name ,age ,id );map .put( id , a);System. out .println("成功的插入一条记录”);public void update(){System. out .println("请输入要修改表中元素ID");String id =Test. sc.next();if (map .containsKey( id)){map .remove( id);System. out .println("按顺序输入name,age,id");id =Test. sc.next();String name =Test. sc.next();int age =Test. sc.nextInt();a= new Student( id ,age ,name );map .put( id , a);}else{System. out .println("表中没有该元素");}}public void select()System. out .println("请输入要查询的方式 1.查询单行 2.查询全部"); int i=Test. sc.nextInt();switch (i){case 1:{System. out .println("请输入要查询表中元素ID");String id =Test. sc.next();{a= map .get( id);a.sayHi();}else{System. out .println("表中没有该元素");}}break ;case 2:{Collection<Student> c=map .values();Iterator<Student> it= c.iterator();while (it .hasNext()){a= it .next();a.sayHi();}}break ;}}}//testpackage ;import java.util.*;public class Test {/*** @param args */public static Scanner sc= new Scanner(System. public static void main(String[] args ){// TODO Auto-generated method stuint i=0;Databace d = new Databace();while (i==0){int j=Test. sc.nextInt(); switch (j){case 1:d .insert(); breakcase 2: d .select(); breakcase 3: in);System. out .println( System. out .println( System. out .println( System. out .println( System. out .println( "1.储存学生信息") "2.查询学生信息") "3.修改学生信息") "4.删除学生信息") "退出");d .update(); breakcase 4:d .delete(); break default :i=1;}}}}提示:用id 做map 集合的键部分,用student 对象做map 集合的值部分效果显示:三、实验思想四、实验结果五、实验心得。