计算机学院—赵卓君北京理工大学珠海学院Java深入编程计算机学院软件工程教研室赵卓君QQ:290913207手机:13726216286Email:zhao.ywp@gmail.com办公室:HA202计算机学院赵卓君课程简介本课程是《Java程序设计》的后续高级课程。在上学期所学Java基础知识上,进一步深入介绍Java语言的高级特性,包括泛型和泛型接口、序列化和反序列化、GUI图形用户界编程、JDBC数据库连接、线程、Applet和网络编程等。学完本课程后,学生可以开发出基于Swing组件的C/S架构应用系统和Java网络通讯系统,如:学生成绩管理、图书信息管理、网络聊天室等系统。也可参加Java认证的SCJP考试。计算机学院赵卓君课程知识点介绍整个课程共七章:第一章:泛型和泛型接口(重点)第二章:序列化和反序列化第三章:GUI图形用户界面编程(重点、难点)第四章:JDBC数据库连接(重点、难点)第五章:线程和多线程(重点、难点)第六章:Applet和网络编程(难点)第七章:C/S架构应用程序开发(难点)计算机学院赵卓君教学及考核安排本课程是考查课,共48学时(其中理论26学时,实验22学时)考核方式(闭卷、笔试):出勤20%作业10%实验20%期末50%总计100%计算机学院赵卓君学习要求上课认真听讲,做笔记。课后及时消化上课的知识点。保证出勤,不旷课、迟到、早退(包括上机课)因为出勤占了20%。按时交课外作业和实验作业。之后补交作业会酌情扣分,抄袭别人的作业(或者复制粘贴别人的作业)不算提交该次作业。计算机学院—赵卓君北京理工大学珠海学院第一章泛型和泛型接口计算机学院赵卓君主要内容回顾上学期所学的集合概念:List、Set和Map接口,Iterator接口,Comparable和Comparator接口类型安全和泛型的概念和使用(重点)泛型类、泛型方法、泛型接口:ComparableT、ComparatorT(重点)类型通配符?和有限制的通配符(难点)计算机学院赵卓君集合框架包含的内容1接口CollectionListMap2具体类ListArrayListLinkedListMapHashMap3算法Java集合框架为我们提供了一套性能优良、使用方便的接口和类,我们不必再重新发明轮子,只需学会如何使用它们,就可以处理实际应用中出现的问题了。Java集合框架位于java.util包中Collections提供了对集合进行排序、遍历等多种算法实现,如sort()、reverse()、shuffle()采用键-值对的映射存储方式,长度可动态改变采用线性列表的存储方式,长度可动态改变Set不保证元素的顺序,不允许出现重复的元素VectorHashtableSetTreeSetHashSet计算机学院赵卓君集合接口List接口Map接口Set接口元素以线性方式存储存储的顺序与添加的顺序相同以键-值的映射来存储元素键值不允许重复不保证元素的顺序不允许重复元素计算机学院赵卓君List接口允许重复的元素允许null值元素在集合中的顺序与添加顺序一致常用的实现该接口的类:ArrayList–动态数组Vector–向量LinkedList–链表Stack–堆栈(LIFO)ArrayList、Vector、LinkedList区别ArrayList和Vector是采用数组方式存储数据,允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以索引数据快插入数据慢,Vector由于使用了synchronized(线程安全)方法,但是性能上比ArrayList要差LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快!Stack是按照堆栈的原理来存储数据,先进后出计算机学院赵卓君计算机学院赵卓君Set接口Set接口不保证元素的顺序,不允许出现重复的元素实现Set接口的类:HashSet、TreeSetHashSet类不允许出现重复元素,不保证集合中元素的顺序,只允许一个null元素。TreeSet是Set的一种变体,可以实现按照自然顺序排序。在添加元素时会自动将其插入到已经有序的元素序列中。字符串按照“字典”的顺序整数按照数字大小的顺序HashSet和TreeSet的区别:HashSet不保证元素的顺序,而TreeSet可以自然顺序插入添加的元素计算机学院赵卓君Map接口使用键—值的成对映射来存贮元素键值不允许重复常用实现Map接口的类:类名null元素顺序线程安全HashMap允许null键和值不保证元素的顺序线程不安全Hashtable不允许有null键和值不保证元素的顺序线程安全TreeMap不允许有null键可以按键的自然顺序将值排序计算机学院赵卓君Iterator接口Iterator接口可以以统一的方式对各种集合元素进行遍历,也称为“迭代器”。它还可以在遍历元素的同时移除元素。hasNext()方法检测集合中是否还有下一个元素。next()方法返回集合中的下一个元素。Iterator遍历集合元素的语法:Iteratorit=集合对象名.iterator();while(it.hasNext()){Objecto=it.next();System.out.println(o);}计算机学院赵卓君Comparable接口--1Java.lang包中定义的一个比较对象的接口提供抽象方法compareTo(),可以对对象进行整体排序。使用方法:对要进行比较对象的类实现Comparable接口,重写compareTo()方法Comparable接口不仅仅用于集合框架,可用于任何需要进行对象比较的场合。计算机学院赵卓君Comparable接口--2示例:classStudentimplementsComparable{intid;Stringname;……publicintcompareTo(Objectobj){Students=(Student)obj;returnthis.id-s.id;}……}重写Comparable接口的compareTo方法实现Comparable接口计算机学院赵卓君Comparator接口--1Java.util包中提供的一个对某个对象集合进行整体排序的比较接口提供了compare的比较方法来比较对象使用方法:定义实现该接口的类,重写compare方法实例化该类的对象把该对象作为Collections.sort()方法的参数。计算机学院赵卓君Comparator接口--2//实现Comparator接口,比较学生的姓名classNameCompimplementsComparator{//重写compare方法publicintcompare(Objecto1,Objecto2){Students1=(Student)o1;Students2=(Student)o2;returns1.name.compareTo(s2.name);}}……publicstaticvoidmain(String[]args){……NameComparatornc=newNameComparator();Collections.sort(al,nc);}…..计算机学院赵卓君类型安全问题--1任何对象加入集合类后,自动转变为Object类型;取出时,需要进行强制类型转换,恢复为特定的类型ObjectObjectObject加入集合从集合中取出(Rabbit)object(Car)object(Student)objectRabbitCarStudentRabbitCarStudent计算机学院赵卓君类型安全问题--2假设在ArrayList集合对象students中添加Sudent类对象,也添加一个Teacher类的对象,会怎样?classStudent{Stringname;intage;……}classTeacher{Stringname;intage;……}ArrayListstudents=newArrayList();Studentxm=newStudent(小明,20);Studentxh=newStudent(小红,19);Studentxj=newStudent(小杰,18);students.add(xm);students.add(xh);students.add(xj);Teacherjacky=newTeacher(成龙,40);students.add(jacky);for(Objectstuo:students){Studentstu=(Student)stuo;System.out.println(stu.Name);}遍历这个集合是否有问题?能否加入一个Teacher类的对象?计算机学院赵卓君类型安全问题--3students集合小明小红小杰成龙添加对象遍历集合对象存储不易控制类型转换容易出错Teacher对象运行错误计算机学院赵卓君什么是泛型(Generics)?JDK1.5引入的新特性。在创建集合对象时就规定其允许保存的元素类型,然后由编译器负责检查所要添加元素的合法性。在取用元素时就不必再进行强制性的类型转换处理。其实就是将原本确定不变的类型参数化。//例如:定义只能存储字符串的ArrayList集合对象ArrayListStringlist=newArrayListString();list.add(Welcome);//编译通过list.add(Hello);//编译通过list.add(newStudent());//编译错误for(Strings:list){System.out.println();//取出元素时无需进行类型转换}计算机学院赵卓君使用泛型的优点保证集合中所有元素的数据类型相同从泛型集合中取出元素时无需再做类型转换向集合中添加不符合指定类型的数据,编译时会发生错误信息,避免运行时错误的发生是原有Java类型体系的扩充,是编译时的保护。可以提高Java应用程序的安全性、可维护性和可靠性。计算机学院赵卓君泛型的向后兼容性Java中的泛型是可以向后兼容的。即,可以不采用泛型,继续沿用过去的做法。如左图:ArrayListlist=newArrayList();list.add(Welcome);//编译通过list.add(newStudent());//编译通过但编译后会出现以下警告:要想避免该警告,可以在类的前面使用@SuppressWarnings({unchecked})的注解@SuppressWarnings({unchecked})classDemo{publicstaticvoidmain(String[]args){ArrayListlist=newArrayList();list.add(Welcome);}}计算机学院赵卓君泛型高级特性1—泛型类类的定义可在类名后面用尖括号括起一个类型参数。这种由类型参数修饰的类被称为泛型类。泛型类也属于引用类型。publicclassDemoT{privateTm;publicTgetM(){….}……}类型参数DemoStringd=newDemoString();则T代表String类型参数T是一个类型形参,在使用该泛型类时才指定具体类型参数。计算机学院赵卓君泛型高级特性2—泛型方法方法也可以泛型化,如:实际调用该方法时才确定参数,如:evaluate(hello,hello);evaluate(newInteger(100),newInteger(300));类型参数T也可以添加到其所在的类中,该类就变成泛型类。publicTTevaluate(Ta,Tb){……}表示该方法为泛型方法计算机学院赵卓君受限的类型参数实例