北京MLDN软件实训中心联系电话:010-51283346第(1)页共(34)页E-Mail:mldnqa@163.com1、课程名称:Java常用类库2、知识点2.1、上次课程的主要知识点1、多线程的两种实现方式:·继承Thread类或者是实现Runnable接口,但是不管如何一定要覆写run()方法;·Thread类是Runnable接口的子类,而且多线程的调用中,完全属于代理设计模式的应用;·Runnable接口可以避免单继承局限,而且也可以方便的达到资源共享的目的2、同步与死锁:·当多个线程操作同一个资源的时候一定要进行同步,但是同步会造成性能的下降,可是属于安全的操作;·同步的实现有两种方式:同步代码块、同步方法;·关键字:synchronized;·但是如果过多的同步有可能造成死锁;北京MLDN软件实训中心联系电话:010-51283346第(2)页共(34)页E-Mail:mldnqa@163.com3、Object类本身对线程也有支持,三个方法:wait()、notify()、notfiyAll()。4、线程休眠:Thread.sleep();2.2、本次预计讲解的知识点今天的所有内容的学习方法:首先一定要清楚的知道每一个讲解类的功能,之后具体的操作要通过文档查询,但是一些主要的操作方法,还是有必要背下来的。1、StringBuffer类的特点及使用;2、日期操作类的使用,可以将字符串变为日期型数据;3、掌握大数字的操作;4、掌握垃圾的收集机制,及Runtime、System类的关系;5、掌握反射机制的使用6、理解二叉排序算法的使用,及两个实现的比较器接口7、掌握正则表达式的使用;3、具体内容3.1、StringBuffer(重点)回顾:String类的特点Stringaa=newString(“aa”);·String类的对象一旦声明则不可改变;·String有两种实例化方式,一个是直接赋值,通过关键字new,第一个只开辟一个空间,而通过关键字new会开辟多个空间;·一个字符串就是一个String的匿名对象。一直强调,String的操作中绝对不能频繁的修改内容,因为所谓的修改就指不断的“断开-连接”操作。但是,在实际中不可能避免重复修改字符串内容的方式,所以这个时候就可以使用StringBuffer类完成,但是在使用之前需要先来比较一下String类和StringBuffer类的定义:String类的定义:StringBuffer类的定义:publicfinalclassStringextendsObjectimplementsSerializable,ComparableString,CharSequencepublicfinalclassStringBufferextendsObjectimplementsSerializable,CharSequence可以发现,String类和StringBuffer类都属于CharSequence接口的子类,所以两个类的实例化对象,都可以向CharSequence接口的对象转换,属于向上转型关系。在String类中如果要想进行字符串的连接,应该使用“+”完成,但是如果现在换成了StringBuffer的话,则要使用append()方法完成。packageorg.lxh.apidemo;publicclassAPIDemo{publicstaticvoidmain(String[]args){StringBufferbuf=newStringBuffer();北京MLDN软件实训中心联系电话:010-51283346第(3)页共(34)页E-Mail:mldnqa@163.combuf.append(Hello).append(World);fun(buf);System.out.println(buf);}publicstaticvoidfun(StringBufferbuf){buf.append(!!!);}}发现StringBuffer类中的内容本身是允许改变的,那么这就决定了,StringBuffer主要用于频繁修改字符串内容的地方,就好比如下的操作代码;packageorg.lxh.apidemo;publicclassAPIDemo{publicstaticvoidmain(String[]args){StringBufferbuf=newStringBuffer();for(intx=0;x1000;x++){buf.append(x);}System.out.println(buf);}}但是必须注意的是StringBuffer并不是String,所以如果现在要想让一个StringBuffer的对象变为String型的对象,则需要手工调用toString()方法完成。packageorg.lxh.apidemo;publicclassAPIDemo{publicstaticvoidmain(String[]args){StringBufferbuf=newStringBuffer();buf.append(Hello).append(World);Stringstr=buf.toString();}}可是,在StringBuffer类中也定义了许多String类没有的操作:·在指定位置插入内容:insert()·字符串反转:publicStringBufferreverse()·替换指定范围的内容:publicStringBufferreplace(intstart,intend,Stringstr)·删除指定范围的内容:publicStringBufferdelete(intstart,intend)packageorg.lxh.apidemo;publicclassAPIDemo{publicstaticvoidmain(String[]args){StringBufferbuf=newStringBuffer();buf.append(World).insert(0,Hello).append(!!!);System.out.println(buf);System.out.println(buf.reverse());System.out.println(buf.replace(0,5,你好!));}北京MLDN软件实训中心联系电话:010-51283346第(4)页共(34)页E-Mail:mldnqa@163.com}3.2、Runtime类(了解)3.2.1、认识RuntimeRuntime表示的是运行时,这个类的构造方法被私有化了,一旦被私有化了,就意味着这个类属于单例设计模式的应用,则内部一定会存在一个静态方法,用于取得Runtime类的实例化对象,方法:publicstaticRuntimegetRuntime()。实际上现在可以通过Runtime取得一个JVM进程的内存信息,在Runtime类中定义了如下几个与内存有关的方法:·最大可用内存:publiclongmaxMemory()·总共的内存:publiclongtotalMemory()·剩余的内存:publiclongfreeMemory()范例:观察内存的使用问题packageorg.lxh.apidemo;publicclassAPIDemo{publicstaticvoidmain(String[]args){Runtimerun=Runtime.getRuntime();//取得Runtime类的实例化对象System.out.println(1、maxMemory:+run.maxMemory());System.out.println(1、totalMemory:+run.totalMemory());System.out.println(1、freeMemory:+run.freeMemory());Stringstr=;for(intx=0;x10000;x++){str+=x;}System.out.println(2、maxMemory:+run.maxMemory());System.out.println(2、totalMemory:+run.totalMemory());System.out.println(2、freeMemory:+run.freeMemory());}}此时,由于已经产生了大量的垃圾,而且垃圾又没有及时的回收,所以造成剩余空间的减少,但是如果现在一直等着垃圾自己收集不太现实,下面可以采用Runtime类中的一个方法手工完成垃圾回收:·回收:publicvoidgc()当程序发现内存垃圾较多时,可以直接手工调用gc()以释放垃圾空间。packageorg.lxh.apidemo;publicclassAPIDemo{publicstaticvoidmain(String[]args){Runtimerun=Runtime.getRuntime();//取得Runtime类的实例化对象System.out.println(1、maxMemory:+run.maxMemory());System.out.println(1、totalMemory:+run.totalMemory());System.out.println(1、freeMemory:+run.freeMemory());Stringstr=;for(intx=0;x10000;x++){str+=x;北京MLDN软件实训中心联系电话:010-51283346第(5)页共(34)页E-Mail:mldnqa@163.com}System.out.println(2、maxMemory:+run.maxMemory());System.out.println(2、totalMemory:+run.totalMemory());System.out.println(2、freeMemory:+run.freeMemory());run.gc();//垃圾收集System.out.println(3、maxMemory:+run.maxMemory());System.out.println(3、totalMemory:+run.totalMemory());System.out.println(3、freeMemory:+run.freeMemory());}}3.2.2、调用本机程序在Runtime类中定义了以下的一个方法,可以调用本机操作系统的程序:·方法:publicProcessexec(Stringcommand)throwsIOException但是,此方法返回的是一个Process类的对象,那么此类表示的是一个进程的操作,那么可以通过此进程进行程序的关闭:publicabstractintexitValue()packageorg.lxh.apidemo;publicclassAPIDemo{publicstaticvoidmain(String[]args)throwsException{Runtimerun=Runtime.getRuntime();//取得Runtime类的实例化对象Processpro=run.exec(notepad.exe);Thread.sleep(3000);pro.destroy();}}3.3、System类(理解)3.3.1、基本概念System类应该不陌生了,一直在使用System.out.println()方法进行内容的输出,但是此类本身也有很多其他的方法:·取得当前的时间数:publicstaticlongcurrentTimeMillis()既然现在可以得到时间那么就可以通过此方法计算出一个操作所花费的时间。packageorg.lxh.apidemo;publicclassAPIDemo{publicstaticvoidmain(String[]args)throwsExceptio