《Java应用开发》课件-第5章 Java API_第1页
《Java应用开发》课件-第5章 Java API_第2页
《Java应用开发》课件-第5章 Java API_第3页
《Java应用开发》课件-第5章 Java API_第4页
《Java应用开发》课件-第5章 Java API_第5页
已阅读5页,还剩182页未读 继续免费阅读

下载本文档

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

文档简介

第5章JavaAPI·字符串类·System类和Runtime类·Math类与Random类·日期时间类·包装类·正则表达式5.1字符串类在程序开发中经常会用到字符串,所谓字符串就是指一连串的字符,它是由许多单个字符连接而成的,如多个英文字母所组成的一个英文单词。字符串中可以包含任意字符,这些字符必须包含在一对双引号“”之内,例如“abc”。Java中定义了三个封装字符串的类,分别是String、StringBuffer和StringBuilder,它们位于java.lang包中,并提供了一系列操作字符串的方法,这些方法不需要导包就可以直接使用。5.1.1String类的初始化1.使用字符串常量直接初始化一个String对象,具体代码如下:Stringstr1="abc";由于String类比较常用,所以提供了这种简化的语法,用于创建并初始化String对象,其中“abc”表示一个字符串常量。5.1.1String类的初始化2.使用String类的构造方法初始化字符串对象,String类的常见构造方法如下表。方法声明功能描述String()创建一个内容为空的字符串String(Stringvalue)根据指定的字符串内容创建对象String(char[]value)根据指定的字符数组创建对象String(byte[]bytes)根据指定的字节数组创建对象5.1.1String类的初始化接下来通过一个案例学习String类的使用。1publicclassExample01{2publicstaticvoidmain(String[]args)throwsException{3 //创建一个空的字符串4 Stringstr1=newString();5 //创建一个内容为abcd的字符串6 Stringstr2=newString("abcd");7 //创建一个内容为字符数组的字符串8 char[]charArray=newchar[]{'D','E','F'};9 Stringstr3=newString(charArray);5.1.1String类的初始化10//创建一个内容为字节数组的字符串11byte[]arr={97,98,99}; 12 Stringstr4=newString(arr);13 System.out.println("a"+str1+"b");14 System.out.println(str2);15 System.out.println(str3);16System.out.println(str4);17 }18}5.1.1String类的初始化程序运行结果如下图。5.1.1String类的初始化上述代码中,第4行代码创建了名称为str1的空字符串;第6行代码创建名称为str2的字符串,其内容为“abcd”;第8~9行代码创建了名称为charArray的char类型字符数组,并将charArray赋值给名称为str3的字符串,第11~12行代码创建了名称为arr的byte类型的字节数组,并将arr赋值给名称为str4的字符串;最后在第13~16行代码打印了str1、str2、str3和str4的值。5.1.2String类的常见操作String类常用方法如下表。方法声明功能描述intindexOf(intch)返回指定字符ch在字符串中第一次出现位置的索引intlastIndexOf(intch)返回指定字符ch在字符串中最后一次出现位置的索引intindexOf(Stringstr)返回指定子字符串str在字符串第一次出现位置的索引intlastIndexOf(Stringstr)返回指定子字符串str在此字符串中最后一次出现位置的索引charcharAt(intindex)返回字符串中index位置上的字符,其中index的取值范围是0~(字符串长度是-1)BooleanendsWith(Stringsuffix)判断此字符串是否以指定的字符串结尾intlength()返回此字符串的长度booleanequals(ObjectanObject)将此字符串与指定的字符串比较5.1.2String类的常见操作booleanisEmpty()判断字符串长度是否为0,如果为0则返回true,反之则返回flasebooleanstartsWith(Stringprefix)判断此字符串是否以指定的字符串开始booleancontains(CharSequencecs)判断此字符串中是否包含指定的字符序列StringtoLowerCase()使用默认语言环境的规则将String中的所有字符都转换为小写StringtoUpperCase()使用默认语言环境的规则将String中的所有字符都转换为大写staticStringvalueOf(int

i)将int变量i转换成字符串char[]toCharArray()将此字符串转换为一个字符数组Stringreplace(CharSequenceoldstr,CharSequencenewstr)返回一个新的字符串,它是通过用newstr替换此字符串中出现的所有oldstr得到的String[]split(Stringregex)根据参数regex将原来的字符串分割为若干个子字符串Stringsubstring(intbeginIndex)返回一个新字符串,它包含从指定的beginIndex处开始,直到此字符串末尾的所有字符Stringsubstring(intbeginIndex,intendIndex)返回一个新字符串,它包含从指定的beginIndex处开始,直到索引endIndex-1处的所有字符Stringtrim()返回一个新字符串,它去除了原字符串首尾的空格5.1.2String类的常见操作1.字符串的获取功能在Java程序中,需要对字符串进行一些获取的操作,如获得字符串长度、获得指定位置的字符等。5.1.2String类的常见操作1publicclassExample02{2publicstaticvoidmain(String[]args){3 Strings="ababcdedcba";//定义字符串s4//获取字符串长度,即字符个数5 System.out.println("字符串的长度为:"+s.length());6 System.out.println("字符串中第一个字符:"+s.charAt(0));7 System.out.println("字符c第一次出现的位置:"+s.indexOf('c'));8 System.out.println("字符c最后一次出现的位置:"+s.lastIndexOf('c'));9 System.out.println("子字符串ab第一次出现的位置:"+s.indexOf("ab"));10 System.out.println("子字符串ab字符串最后一次出现的位置:"+11s.lastIndexOf("ab"));12 }13}5.1.2String类的常见操作程序运行结果如下图。5.1.2String类的常见操作上述代码中,第3行代码创建一个名称为s的String字符串,并赋值为“ababcdedcba”,第5~10行代码依次打印了字符串长度、字符串中第一个字符内容、字符c第一次出现的位置、子字符串ab第一次出现的位置和子字符串ab最后一次出现的位置。从图5-2中可以看出,String类提供的方法可以很方便地获取字符串的长度,获取指定位置的字符以及指定字符和字符串的位置。5.1.2String类的常见操作2.字符串的转换操作程序开发中,经常需要对字符串进行转换操作。例如,将字符串转换成数组的形式,将字符串中的字符进行大小写转换等。5.1.2String类的常见操作1publicclassExample03{2 publicstaticvoidmain(String[]args){3 Stringstr="abcd";4 System.out.print("将字符串转为字符数组后的结果:");5 char[]charArray=str.toCharArray();//字符串转换为字符数组6 for(inti=0;i<charArray.length;i++){7 if(i!=charArray.length-1){8 //如果不是数组的最后一个元素,在元素后面加逗号9 System.out.print(charArray[i]+",");10 }else{11 //数组的最后一个元素后面不加逗号12 System.out.println(charArray[i]);13 }

5.1.2String类的常见操作14 }15 System.out.println("将int值转换为String类型之后的结果:"+16String.valueOf(12));17 System.out.println("将字符串转换成大写之后的结果:"+18str.toUpperCase());19System.out.println("将字符串转换成小写之后的结果:"+20 str.toLowerCase());21 }22}5.1.2String类的常见操作程序运行结果如下图。5.1.2String类的常见操作上述代码中,第5行代码使用String类的toCharArray()方法将一个字符串转为一个字符数组,第16行代码使用静态方法valueOf()将一个int类型的整数转为字符串,第18行代码使用toUpperCase()方法将字符串中的字符都转为大写,第20行代码使用toLowerCase()方法将字符串中的字符都转换为小写。其中valueOf()方法有多种重载的形式,float、double、char等其他基本类型的数据都可以通过valueOf()方法转为String字符串类型。5.1.2String类的常见操作3.字符串的替换和去除空格操作程序开发中,用户输入数据时经常会有一些错误和空格,这时可以使用String类的replace()和trim()方法,进行字符串的替换和去除空格操作。5.1.2String类的常见操作1publicclassExample04{2 publicstaticvoidmain(String[]args){3 Strings="itcast";4 //字符串替换操作5 System.out.println("将it替换成cn.it的结果:"+s.replace("it",6"cn.it"));7 //字符串去除空格操作8 Strings1="itcast";9 System.out.println("去除字符串两端空格后的结果:"+s1.trim());10 System.out.println("去除字符串中所有空格后的结果:"+s1.replace("",11""));12 }13}5.1.2String类的常见操作程序运行结果如下图。5.1.2String类的常见操作上述代码中,第3行代码定义了名称为s的字符串,第5~6行代码使用replace()方法将字符串s的“it”替换为“cn.it”;在第8行代码中定义了名称为s1的字符串,并在第9行代码使用trim()去除字符串两端的空格;在第10行代码使用replace()方法将字符串s1的“”替换为“”,这样做是为了去除字符串中所有的空格。5.1.2String类的常见操作trim()方法只能去除两端的空格,不能去除中间的空格。若想去除字符串中间的空格,需要调用String类的replace()方法。注意5.1.2String类的常见操作4.字符串的判断操作操作字符串时,经常需要对字符串进行一些判断,如判断字符串是否以指定的字符串开始、结束,是否包含指定的字符串,字符串是否为空等。5.1.2String类的常见操作1publicclassExample05{2 publicstaticvoidmain(String[]args){3 Strings1="String";//声明一个字符串4 Strings2="Str";5 System.out.println("判断是否以字符串Str开头:"+6s1.startsWith("Str"));7 System.out.println("判断是否以字符串ng结尾:"+s1.endsWith("ng"));8 System.out.println("判断是否包含字符串tri:"+s1.contains("tri"));9 System.out.println("判断字符串是否为空:"+s1.isEmpty());10 System.out.println("判断两个字符串是否相等"+s1.equals(s2));11 }12}5.1.2String类的常见操作程序运行结果如下图。5.1.2String类的常见操作在程序中可以通过“==”和equals()两种方式对字符串进行比较,但这两种方式有明显的区别。equals()方法用于比较两个字符串中的字符是否相等,==方法用于比较两个字符串对象的地址是否相同。也就是说,对于两个内容完全一样的字符串对象,使用equals判断的结果是true,使用==判断的结果是false。5.1.2String类的常见操作Stringstr1=newString("abc");Stringstr2=newString("abc");//结果为false,因为str1和str2是两个对象System.out.println(str1==str2);//结果为true,因为str1和str2字符内容相同System.out.println(str1.equals(str2));5.1.2String类的常见操作5.字符串的截取和分割

在String类中,substring()方法用于截取字符串的一部分,split()方法用于将字符串按照某个字符进行分割。5.1.2String类的常见操作1publicclassExample06{2 publicstaticvoidmain(String[]args){3 Stringstr="石家庄-武汉-哈尔滨";4 //下面是字符串截取操作5 System.out.println("从第5个字符截取到末尾的结果:"+6str.substring(4));7 System.out.println("从第5个字符截取到第6个字符的结果:"+8str.substring(4,6));9 //下面是字符串分割操作10 System.out.print("分割后的字符串数组中的元素依次为:");

5.1.2String类的常见操作11 String[]strArray=str.split("-");//将字符串转换为字符串数组12 for(inti=0;i<strArray.length;i++){13 if(i!=strArray.length-1){14 //如果不是数组的最后一个元素,在元素后面加逗号15 System.out.print(strArray[i]+",");16 }else{17 //数组的最后一个元素后面不加逗号18 System.out.println(strArray[i]);19 }20 }21 }22}5.1.2String类的常见操作程序运行结果如下图。5.1.2String类的常见操作上述代码中,第3行代码定义了名称为str的字符串;第6行代码在substring()方法中传入参数4,表示截取字符串中第5个之后的所有字符;第8行代码在substring()方法中传入参数4和6,表示从第5个字符截取到第6个字符;第10~19行代码先使用split()方法将字符串以“-”进行分割,并将分割后的字符串数组命名为strArray,最后在for循环中使用if条件语句判断元素是否为最后一个元素,若不是最后一个元素则在该元素末尾添加“,”。

脚下留心:字符串角标越界异常String字符串在获取某个字符时,会用到字符的索引,当访问字符串中的字符时,如果字符的索引不存在,则会发生StringIndexOutOfBoundsException(字符串角标越界异常)。

脚下留心:字符串角标越界异常1publicclassExample07{2 publicstaticvoidmain(String[]args){3 Strings="itcast";4 System.out.println(s.charAt(8));5 }6}

脚下留心:字符串角标越界异常程序运行结果如下图。

脚下留心:字符串角标越界异常通过运行结果可以看出,访问字符串中的字符时,不能超出字符的索引范围,否则会出现异常,这与数组中的角标越界异常非常相似。5.1.3StringBuffer类由于字符串是常量,因此一旦创建,其内容和长度是不可改变的。如果需要对一个字符串进行修改,则只能创建新的字符串。为了对字符串进行修改,Java提供了一个StringBuffer类(也称字符串缓冲区)。StringBuffer类和String类最大的区别在于它的内容和长度都是可以改变的。StringBuffer类似一个字符容器,当在其中添加或删除字符时,并不会产生新的StringBuffer对象。5.1.3StringBuffer类StringBuffer类的常见操作如下表。方法声明功能描述StringBufferappend(charc)添加参数到StringBuffer对象中StringBufferinsert(intoffset,Stringstr)将字符串中的offset位置插入字符串strStringBufferdeleteCharAt(intindex)移除此序列指定位置的字符StringBufferdelete(intstart,intend)删除StringBuffer对象中指定范围的字符或字符串序列StringBufferreplace(intstart,intend,Strings)在StringBuffer对象中替换指定的字符或字符串序列voidsetCharAt(intindex,charch)修改指定位置index处的字符序列StringtoString()返回StringBuffer缓冲区中的字符串StringBufferreverse()将此字符序列用其反转形式取代5.1.3StringBuffer类接下来通过一个案例学习StringBuffer类的常用方法。1publicclassExample08{2 publicstaticvoidmain(String[]args){3 System.out.println("1、添加------------------------");4 add();5 System.out.println("2、删除------------------------");6 remove();7 System.out.println("3、修改------------------------");8 alter();9 }

5.1.3StringBuffer类 10publicstaticvoidadd(){ 11 StringBuffersb=newStringBuffer();//定义一个字符串缓冲区 12 sb.append("abcdefg");//在末尾添加字符串 13 System.out.println("append添加结果:"+sb); 14 sb.insert(2,"123");//在指定位置插入字符串 15 System.out.println("insert添加结果:"+sb); 16} 17publicstaticvoidremove(){ 18 StringBuffersb=newStringBuffer("abcdefg"); 19 sb.delete(1,5);//指定范围删除 20 System.out.println("删除指定位置结果:"+sb); 21 sb.deleteCharAt(2);//指定位置删除 22 System.out.println("删除指定位置结果:"+sb); 23 sb.delete(0,sb.length());//清空缓冲区 24 System.out.println("清空缓冲区结果:"+sb); 25}

5.1.3StringBuffer类26 publicstaticvoidalter(){27 StringBuffersb=newStringBuffer("abcdef");28 sb.setCharAt(1,'p');//修改指定位置字符29 System.out.println("修改指定位置字符结果:"+sb);30 sb.replace(1,3,"qq");//替换指定位置字符串或字符31 System.out.println("替换指定位置字符(串)结果:"+sb);32 System.out.println("字符串翻转结果:"+sb.reverse());33 }34}5.1.3StringBuffer类程序运行结果如下图。5.1.3StringBuffer类第10~16行代码创建了add()方法,用于演示StringBuffer的添加操作,在第11行代码中创建了一个StringBuffer类型的字符串sb,第12行代码使用append()方法在字符串sb的末尾添加了新的字符串,第14行代码使用insert()方法在字符串sb索引为2的位置插入字符串“123”。不同的是,使用append()方法插入的新字符串始终位于字符串sb的末尾,而insert()方法则可以将新字符串插入指定位置。5.1.3StringBuffer类第17~25行代码创建了remove()方法,用于演示StringBuffer的字符串删除操作,在第18行代码中创建了一个StringBuffer类型的字符串sb,在第19行代码使用delete()方法删除字符串下标从1到5的字符,第21行代码使用deleteCharAt()方法删除字符串下标2之后的所有字符,第23的delete()方法用于清空缓冲区结果。5.1.3StringBuffer类第26~33行代码创建了alter()方法,用于演示StringBuffer的字符串替换和反转的操作,在第27行代码中创建了一个StringBuffer类型的字符串sb,在第28行代码中使用setCharAt()方法修改下标为1的字符为“p”,第30行代码中使用replace()方法替换下标从1到3的字符为“qq”,第32行代码中使用reverse()方法将字符串反转。5.1.4StringBiuld类StringBuilder类也可以对字符串进行修改,StringBuffer类和StringBuilder类的对象都可以被多次修改,并不产生新的未使用对象,StringBuilder类是JDK5中新加的类,它与StringBuffer之间最大不同在于StringBuilder的方法是线程安全的,也就是说StringBuffer不能被同步访问,而StringBuilder可以。5.1.4StringBiuld类下面通过一个案例对比StringBuilder和StringBuffer的运行效率。1publicclassExample09{2privatestaticfinalintTIMES=100000;3publicstaticvoidmain(String[]args){4 Example09.testString();5 Example09.testStringBuffer();6 Example09.testStringBuilder();7}

8//String时间效率测试9publicstaticvoidtestString(){10longstartTime=System.currentTimeMillis();11Stringstr="";12for(inti=0;i<TIMES;i++){13str+="test";14}15longendTime=System.currentTimeMillis();16System.out.println("Stringtestusedtime:"17+(endTime-startTime));18}5.1.4StringBiuld类19//StringBuffer时间效率测试(线程安全)20publicstaticvoidtestStringBuffer(){21longstartTime=System.currentTimeMillis();22StringBufferstr=newStringBuffer();23for(inti=0;i<TIMES;i++){24str.append("test");25}26longendTime=System.currentTimeMillis();27System.out.println("StringBuffertestusedtime:"+(endTime–28startTime));29}5.1.4StringBiuld类30//StringBuffer时间效率测试(非线程安全)31publicstaticvoidtestStringBuilder(){32longstartTime=System.currentTimeMillis();33StringBuilderstr=newStringBuilder();34for(inti=0;i<TIMES;i++){35str.append("test");36}37longendTime=System.currentTimeMillis();38System.out.println("StringBuildertestusedtime:"+(endTime–39startTime));40}41}5.1.4StringBiuld类程序运行结果如下图。5.1.4StringBiuld类上述代码中,第9~18行代码定义了一个testString()方法,并在testString()方法中利用for循环测试String对于字符串修改的时间;第20~29行代码定义了一个testStringBuffer()方法,并在testStringBuffer()方法中利用for循环测试StringBuffer对于字符串修改的时间;第31~40行代码定义了一个testStringBuilder()方法,并在testStringBuilder()方法中利用for循环测试StringBuilder对于字符串修改的时间;最后在4~6行代码中调用testString()方法、testStringBuffer()方法和testStringBuilder()方法,目的主要是想通过一个简单的方法去测试String、StringBuffer和StringBuilder三个操作字符串的效率。从图5-11的运行结果可以看出三者的工作效率为StringBuilder>StringBuffer>String。5.1.4StringBiuld类StringBuilder类和StringBuffer类、String类有很多相似之处,初学者在使用时很容易混淆。接下来针对这三个类进行对比,简单归纳一下三者的不同。5.1.4StringBiuld类(1)String类表示的字符串是常量,一旦创建后,内容和长度都是无法改变的。而StringBuilder和StringBuffer表示字符容器,其内容和长度可以随时修改。在操作字符串时,如果该字符串仅用于表示数据类型,则使用String类即可,但是如果需要对字符串中的字符进行增删操作,则使用StringBuffer与StringBuilder类。如果有大量字符串拼接操作,不要求线程安全的情况下,采用StringBuilder更高效。相反如果需要线程安全则需要使用StringBuffer。5.1.4StringBiuld类(2)对于euals()方法的使用我们已经有所了解,但是在StringBuffer类与StringBuilder类中并没有被Object类的equals()方法覆盖,也就是说,equals()方法对于StringBuffer类与StringBuilder类来言并不起作用。5.1.4StringBiuld类Strings1=newString("abc");Strings2=newString("abc");System.out.println(s1.equals(s2));//打印结果为trueStringBuffersb1=newStringBuffer("abc");StringBuffersb2=newStringBuffer("abc");System.out.println(sb1.equals(sb2));//打印结果为falseStringBuildersbr1=newStringBuilder("abc");StringBuildersbr2=newStringBuilder("abc");System.out.println(sbr1.equals(sbr2));5.1.4StringBiuld类(3)String类对象可以用操作符“+”进行连接,而StringBuffer类对象之间不能。Strings1="a";Strings2="b";Strings3=s1+s2;//合法System.out.println(s3);//打印输出abStringBuffersb1=newStringBuffer("a");StringBuffersb2=newStringBuffer("b");StringBuffersb3=sb1+sb2;//编译出错【案例5-1】模拟订单号生成在超市购物时,小票上都会有一个订单号,而且每个订单号都是唯一的。本例要求编写一个程序,模拟订单系统中订单号的生成。在生成订单号时,使用年月日和毫秒值组合生成唯一订单号。例如,给定一个包括年月日以及毫秒值的数组arr={2020,0504,1101},将其拼接成字符串s:[202005041101],作为一个订单号。【案例5-2】模拟默认密码自动生成本例要求编写一个程序,模拟默认密码的自动生成策略,手动输入用户名,根据用户名自动生成默认密码。在生成密码时,将用户名反转即为默认的密码。【案例5-3】模拟用户登录在使用一些APP时,通常都需要填写用户名和密码。用户名和密码输入都正确才会登录成功,否则会提示用户名或密码错误。本例要求编写一个程序,模拟用户登录。程序要求如下:(1)用户名和密码正确,提示登录成功。(2)用户名或密码不正确,提示“用户名或密码错误”。【案例5-3】模拟用户登录(3)总共有3次登录机会,在3次内(包含三次)输入正确的用户名和密码后给出登录成功的相应提示。超过3次用户名或密码输入有误,则提示登录失败,无法再继续登录。。在登录时,需要比较用户输入的用户名密码与已知的用户名密码是否相同,本案例可以使用Scanner类以及String类的相关方法实现比较操作。5.2.1System类System类对读者来说并不陌生,因为在之前所学知识中,需要打印结果时,使用的都是“System.out.println();”语句,这句代码中就使用了System类。System类定义了一些与系统相关的属性和方法,它所提供的属性和方法都是静态的,因此,想要引用这些属性和方法,直接使用System类调用即可。5.2.1System类System类的常用方法如下表。方法名称功能描述staticvoidexit(intstatus)该方法用于终止当前正在运行的Java虚拟机,其中参数status表示状态码,若状态码非0,则表示异常终止staticvoidgc()运行垃圾回收器,并对垃圾进行回收staticvoidcurrentTimeMillis()返回以毫秒为单位的当前时间staticvoidarraycopy(Objectsrc,intsrcPos,Objectdest,intdestPos,intlength)从src引用的指定源数组复制到dest引用的数组,复制从指定的位置开始,到目标数组的指定位置结束staticPropertiesgetProperties()取得当前的系统属性staticStringgetProperty(Stringkey)获取指定键描述的系统属性5.2.1System类1.arraycopy()方法arraycopy()方法用于将数组从源数组复制到目标数组,声明格式如下:staticvoidarraycopy(Objectsrc,intsrcPos,Objectdest, intdestPos,intlength)5.2.1System类关于声明格式中参数的相关介绍如下:●src:表示源数组。●dest:表示目标数组。●srcPos:表示源数组中拷贝元素的起始位置。●destPos:表示拷贝到目标数组的起始位置。●length:表示拷贝元素的个数。5.2.1System类在进行数组复制时,目标数组必须有足够的空间来存放拷贝的元素,否则会发生角标越界异常。注意5.2.1System类接下来通过一个案例演示数组元素的拷贝。1publicclassExample10{2 publicstaticvoidmain(String[]args){3 int[]fromArray={10,11,12,13,14,15};//源数组4 int[]toArray={20,21,22,23,24,25,26};//目标数组5 System.arraycopy(fromArray,2,toArray,3,4);//拷贝数组元素6 //打印拷贝后数组的元素7System.out.println("拷贝后的数组元素为:");8 for(inti=0;i<toArray.length;i++){9 System.out.println(i+":"+toArray[i]);10 }11 }12}5.2.1System类程序运行结果如下图。5.2.1System类上述代码中,第3~4行代码创建了两个数组fromArray和toArray,分别代表源数组和目标数组,第5行代码中当调用arraycopy()方法进行元素拷贝时,由于指定了从源数组中索引为2的元素开始拷贝,并且拷贝4个元素存放在目标数组中索引为3的位置,因此,在打印目标数组的元素时,程序首先打印的是数组toArray的前三个元素20、21、22,然后打印的是从fromArray中拷贝的四个元素12、13、14、15。5.2.1System类2.currentTimeMillis()方法currentTimeMillis()方法用于获取当前系统的时间,返回值是long类型的值,该值表示当前时间与1970年1月1日0点0分0秒之间的时间差,单位是毫秒,通常也将该值称作时间戳。5.2.1System类接下来通过一个for循环的求和的案例计算程序运行时所消耗的时间。1publicclassExample11{2 publicstaticvoidmain(String[]args){3 longstartTime=System.currentTimeMillis();//循环开始时的当前时间4 intsum=0;5 for(inti=0;i<1000000000;i++){6 sum+=i;7 }8 longendTime=System.currentTimeMillis();//循环结束后的当前时间9 System.out.println("程序运行的时间为:"+(endTime-startTime)+"毫10秒");11 }12}5.2.1System类程序运行结果如下图。5.2.1System类上述代码中,第4~7行代码演示了数字的求和操作,程序在求和开始和结束时,分别调用了currentTimeMillis()方法获得了两个时间戳(系统当前时间),两个时间戳之间的差值便是求和操作所耗费的时间。5.2.1System类3.getProperties()和getProperty()方法System类的getProperties()方法用于获取当前系统的全部属性,该方法会返回一个Properties对象,其中封装了系统的所有属性,这些属性是以键值对形式存在的。getProperty()方法用于根据系统的属性名获取对应的属性值。5.2.1System类1importjava.util.*;2publicclassExample12{3 publicstaticvoidmain(String[]args){4 //获取当前系统属性5 Propertiesproperties=System.getProperties();6 //获得所有系统属性的key,返回Enumeration对象7 EnumerationpropertyNames=pertyNames();8 while(propertyNames.hasMoreElements()){9 //获取系统属性的键key10 Stringkey=(String)propertyNames.nextElement();11 //获得当前键key对应的值value12 Stringvalue=System.getProperty(key);13 System.out.println(key+"--->"+value);14 }15 }16}5.2.1System类程序运行结果如下图。5.2.1System类上述代码中,第5行代码通过System的getProperties()方法获取了系统的所有属性,第7行代码通过Properties的propertyNames()方法获取所有的系统属性的key,并使用名称为propertyNames的Enumeration对象接受获取到的key值,第8~14行代码对Enumeration对象进行迭代循环,通过Enumeration的nextElement()方法获取系统属性的key,再通过System的getProperty(key)方法获取当前key对应的value,最后将所有系统属性的键以及对应的值打印出来。5.2.1System类从运行结果中可以看出,这些系统属性包括虚拟机版本号,用户的国家、操作系统的版本等。关于集合将在下一章进行讲解,在这里读者只需知道通过System.getProperties()方法可以获得系统属性和通过System.getProperty()方法可以根据系统属性名获得系统属性值即可。5.2.1System类4.gc()方法在Java中,当一个对象成为垃圾后仍会占用内存空间,时间一长,就会导致内存空间的不足。针对这种情况,Java中引入了垃圾回收机制。有了这种机制,程序员不需要过多关心垃圾对象回收的问题,Java虚拟机会自动回收垃圾对象所占用的内存空间。5.2.1System类一个对象在成为垃圾后会暂时地保留在内存中,当这样的垃圾堆积到一定程度时,Java虚拟机就会启动垃圾回收器将这些垃圾对象从内存中释放,从而使程序获得更多可用的内存空间。除了等待Java虚拟机进行自动垃圾回收外,还可以通过调用System.gc()方法通知Java虚拟机立即进行垃圾回收。当一个对象在内存中被释放时,它的finalize()方法会被自动调用,因此可以在类中通过定义finalize()方法观察对象何时被释放。5.2.1System类接下来通过一个案例演示Java虚拟机进行垃圾回收的过程。1classPerson{2 //下面定义的finalize方法会在垃圾回收前被调用3 publicvoidfinalize(){4 System.out.println("对象将被作为垃圾回收...");5 }6}7publicclassExample13{8publicstaticvoidmain(String[]args){9 //下面是创建了两个Person对象10 Personp1=newPerson();11 Personp2=newPerson();

5.2.1System类12 //下面将变量置为null,让对象成为垃圾13 p1=null;14 p2=null;15 //调用方法进行垃圾回收16 System.gc();17for(inti=0;i<1000000;i++){18 //为了延长程序运行的时间19 }20 }21}5.2.1System类程序运行结果如下图。5.2.1System类上述代码中,第3~5行代码定义了一个finalize()方法,该方法的返回值必须为void。第10~11行代码创建了两个对象p1和p2,然后将两个对象设置为null,这意味着新创建的两个对象成为垃圾了,第16行代码通过“System.gc()”语句通知虚拟机进行垃圾回收。需要注意的是,Java虚拟机的垃圾回收操作是在后台完成的,程序结束后,垃圾回收的操作也将终止。因此,程序的第17~19行代码使用了一个for循环,延长程序运行的时间,从而能够更好地看到垃圾对象被回收的过程。5.2.1System类从运行结果可以看出,虚拟机针对两个垃圾对象进行了回收,并在回收之前分别调用两个对象的finalize()方法。除了以上案例涉及到的方法,System类还有一个常见的方法exit(intstatus),该方法用于终止当前正在运行的Java虚拟机,其中参数status用于表示当前发生的异常状态,通常指定为0,表示正常退出,否则表示异常终止。5.2.2Runtime类Runtime类用于表示虚拟机运行时的状态,它用于封装JVM虚拟机进程。每次使用java命令启动虚拟机都对应一个Runtime实例,并且只有一个实例,因此在Runtime类定义的时候,它的构造方法已经被私有化了(单例设计模式的应用),对象不可以直接实例化。若想在程序中获得一个Runtime实例,只能通过以下方式:Runtimerun=Runtime.getRuntime();由于Runtime类封装了虚拟机进程,因此,在程序中通常会通过该类的实例对象来获取当前虚拟机的相关信息。5.2.2Runtime类Runtime类常用方法如下表。方法声明功能描述getRuntime()该方法用于返回当前应用程序的运行环境对象。exec(Stringcommand)该方法用于根据指定的路径执行对应的可执行文件freeMemory()该方法用于返回Java虚拟机中的空闲内存量,以字节为单位。maxMemory()该方法用于返回Java虚拟机的最大可用内存量。availableProcessors()该方法用于返回当前虚拟机的处理器个数totalMemory()该方法用于返回Java虚拟机中的内存总量5.2.2Runtime类1.获取当前虚拟机信息Runtime类可以获取当前Java虚拟机的处理器的个数、空闲内存量、最大可用内存量和内存总量的信息。5.2.2Runtime类1publicclassExample14{2 publicstaticvoidmain(String[]args){3 Runtimert=Runtime.getRuntime();//获取4 System.out.println("处理器的个数:"+rt.availableProcessors()+"个5");6 System.out.println("空闲内存数量:"+rt.freeMemory()/1024/10247+"M");8 System.out.println("最大可用内存数量:"+rt.maxMemory()/1024/91024+"M");10System.out.println("虚拟机中内存总量:"+rt.totalMemory()/1024/111024+"M");12 }13}5.2.2Runtime类程序运行结果如下图。5.2.2Runtime类在上述代码中,第3行代码中通过Runtime的getRuntime()方法创建一个名称为rt的Runtime实例对象,在第4~5行代码通过Runtime的availableProcessors()方法获取了Java虚拟机的处理器个数;第6~7行代码通过Runtime的freeMemory()方法获取了Java虚拟机的空闲内存数;第8~9行代码通过Runtime的maxMemory()方法获取了Java虚拟机的最大可用内存数量;第10~11行代码通过Runtime的totalMemory()方法获取了Java虚拟机中内存总量。5.2.2Runtime类由于每个人的机器配置不同,该文件的打印结果可能不同,另外空闲内存数、可用最大内存数和内存总量都是以字节为单位计算的,上述运行结果已经将字节换算成了兆(M)。

注意5.2.2Runtime类2.操作系统进程Runtime类中提供了一个exec()方法,该方法用于执行一个dos命令,从而实现和在命令行窗口中输入dos命令同样的效果。例如,通过运行“notepad.exe”命令打开一个Windows自带的记事本程序。1importjava.io.IOException;2publicclassExample15{3 publicstaticvoidmain(String[]args)throwsIOException{4 Runtimert=Runtime.getRuntime();//创建Runtime实例对象5 rt.exec("notepad.exe");//调用exec()方法6 }7}5.2.2Runtime类上述代码中,第4行代码中通过Runtime的getRuntime()方法创建一个名称为rt的Runtime实例对象,在第5行代码中调用Runtime的exec()方法,并将“otepad.exe”作为参数传递给exec()方法。运行程序会在桌面上打开一个记事本。5.2.2Runtime类程序运行后,会在Windows系统中产生一个新的进程notepad.exe,可以通过任务管理器进行观察。5.2.2Runtime类查阅API文档会发现,Runtime类的exec()方法返回一个Process对象,该对象就是exec()所生成的新进程,通过该对象可以对产生的新进程进行管理,如关闭此进程只需调用destroy()方法即可。具有代码如下所示:publicclassExample{ publicstaticvoidmain(String[]args)throwsException{ Runtimert=Runtime.getRuntime();//创建一个Runtime实例对象 Processprocess=rt.exec("notepad.exe");//得到表示进程的Process对象 Thread.sleep(3000);//程序休眠3秒 process.destroy();//杀掉进程 }}5.2.2Runtime类上述代码中,通过调用Process对象的destroy()方法关闭了打开的记事本。为了突出演示的效果,使用了Thread类的静态方法sleep(longmillis)使程序休眠了3秒,因此,程序运行后,会看到打开的记事本在3秒后自动关闭了。5.3.1Math类Math类提供了大量的静态方法来便于我们实现数学计算,如求绝对值、取最大或最小值等。方法声明功能描述abs()该方法用于计算绝对值sqrt()该方法用于计算方根ceil(a,b)该方法用于计算大于参数的最小整数floor()该方法用于计算小于参数的最小整数round()该方法用于计算小数进行四舍五入后的结果max()该方法用于计算两个数的较大值min()该方法用于计算两个数的较小值random()该方法用于生成一个大于0.0小于1.0的随机值sqrt()该方法用于计算开平方的结果pow()该方法用于计算指数函数的值5.3.1Math类1publicclassExample16{2publicstaticvoidmain(String[]args){3System.out.println("计算绝对值的结果:"+Math.abs(-10));4System.out.println("求大于参数的最小整数:"+Math.ceil(5.6));5System.out.println("求小于参数的最大整数:"+Math.floor(-4.2));6System.out.println("对小数进行四舍五入后的结果:"+Math.round(-4.6));7System.out.println("求两个数的较大值:"+Math.max(2.1,-2.1));8System.out.println("求两个数的较小值:"+Math.min(2.1,-2.1));9System.out.println("生成一个大于等于0.0小于1.0随机值:"+10Math.random());11System.out.println("开平方的结果:"+Math.sqrt(4));12System.out.println("指数函数的值:"+Math.pow(2,3));13}14}5.3.1Math类程序运行结果如下图。5.3.1Math类上述代码对Math类的常用方法进行了演示,在第3行代码中,使用Math的abs()方法计算-10的绝对值;在第4行代码中,使用Math的ceil()方法计算5.6的最小整数;在第5行代码中,使用Math的floor()方法计算-4.2的最大整数;在第6行代码中,使用Math的rount()方法计算-4.6的四舍五入结果;在第7行代码中,使用Math的max()方法求2.1与-2.1的较大值;在第8行代码中,使用Math的min()方法求2.1与-2.1的较小值,第9~10行代码中,使用random()方法生成一个大于等于0小于1.0的随机值;第11行代码中,使用sqrt()方法求4的开平方结果;第12行代码使用pow()方法求2与3的指数函数值,此方法前面的数是底数,后边的数是指数。5.3.2Random类Java的java.util包中有一个Random类,它可以在指定的取值范围内随机产生数字。Random类中提供了两个构造方法如下表。方法声明功能描述Random()构造方法,用于创建一个伪随机数生成器Random(longseed)构造方法,使用一个long型的seed种子创建伪随机数生成器5.3.2Random类Random类的两个构造方法,其中第一个构造方法是无参的,通过它创建的Random实例对象每次使用的种子是随机的,因此每个对象所产生的随机数不同。如果希望创建的多个Random实例对象产生相同的随机数,则可以在创建对象时调用第二个构造方法,传入相同的参数即可。5.3.2Random类接下来先采用第一种构造方法来产生随机数。1importjava.util.Random;2publicclassExample17{3 publicstaticvoidmain(Stringargs[]){4 Randomr=newRandom();//不传入种子5 //随机产生10个[0,100)之间的整数6 for(intx=0;x<10;x++){7 System.out.println(r.nextInt(100));8 }9 }10}5.3.2Random类第一次运行结果如下图。5.3.2Random类第二次运行结果如下图。5.3.2Random类从两次运行结果可知,两次产生的随机数序列是不一样的。这是因为当创建Random的实例对象时,没有指定种子,系统会以当前时间戳作为种子,产生随机数。5.3.2Random类接下来采用第二种构造方法产生随机数。1importjava.util.Random;2publicclassExample18{3 publicstaticvoidmain(Stringargs[]){4 Randomr=newRandom(13);//创建对象时传入种子5 //随机产生10个[0,100)之间的整数6 for(intx=0;x<10;x++){7 System.out.println(r.nextInt(100));8 }9 }10}5.3.2Random类第一次运行结果如下图。5.3.2Random类第二次运行结果如下图。5.3.2Random类相对于Math的random()方法而言,Random类提供了更多的方法来生成各种伪随机数,不仅可以生成整数类型的随机数,还可以生成浮点类型的随机数。Random类常用的方法如下表。方法声明功能描述doublenextDouble()随机生成double类型的随机数floatnextFloat()随机生成float类型的随机数intnextInt()随机生成int类型的随机数intnextInt(intn)随机生成0~n之间int类型的随机数5.3.2Random类Random类的nextDouble()方法返回的是0.0和1.0之间double类型的值,nextFloat()方法返回的是0.0和1.0之间float类型的值,nextInt(intn)返回的是0(包括)和指定值n(不包括)之间的值。5.3.2Random类接下来通过一个案例学习这些方法的使用。1importjava.util.Random;2publicclassExample19{3 publicstaticvoidmain(String[]args){4 Randomr1=newRandom();//创建Random实例对象5 System.out.println("产生float类型随机数:"+r1.nextFloat());6 System.out.println("产生double类型的随机数:"+r1.nextDouble());7System.out.println("产生int类型的随机数:"+r1.nextInt());8System.out.println("产生0~100之间int类型的随机数:"+9r1.nextInt(100));10 }11}5.3.2Random类程序运行结果如下图。【案例5-4】

温馨提示

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

评论

0/150

提交评论