PPT注意事项:当前PPT课件文件必须和提供的源代码文件夹"代码"在同一目录中即不要移动文件夹"代码"的默认位置.
第8章常用实用类配合例子源代码一起使用课件制作人:张跃平导读主要内容String类StringTokenizer类Scanner类StringBuffer类Date与Calendar类日期格式化Math、BigInteger与Random类数字格式化Class类与Console类Pattern与Match类重点和难点重点:字符串的常用方法;字符串分析器使用;类Date和类Calendar以及类Math的使用难点:字符串分析器的使用;各常用类的实际运用§8.
1String类Java专门提供了用来处理字符序列的String类.
String类在java.
lang包中,由于java.
lang包中的类被默认引入,因此程序可以直接使用String类.
需要注意的是Java把String类声明为final类,因此用户不能扩展String类,即String类不可以有子类.
§8.
1.
1构造字符串对象1.
常量对象:字符串常量对象是用双引号括起的字符序列,例如:"你好"、"12.
97"、"boy"等.
Java把用户程序中的String常量放入常量池.
因为String常量是对象,所以也有自己的引用和实体,如图8.
1所示.
例如String常量对象"你好"的引用是12AB,实体里是字符序列:你好.
可以这样简单的理解常量池:常量池中的数据在程序运行期间再也不允许改变§8.
1.
1构造字符串对象可以使用String类声明对象并创建对象,例如:Strings=newString("wearestudents");Stringt=newString("wearestudents");2.
String对象对象变量s中存放着引用,表明自己的实体的位置,即new运算符首先分配内存空间并在内存空间中放入字符序列,然后计算出引用.
将引用赋值给字符串对象s后,String对象s的内存模型如图8.
2所示意(凡是new运算符构造出的对象都不在常量池).
尽管s和t的实体相同,都是字符序列:wearestudents,但二者的引用是不同的(如图8.
2所),即表达式s==t的值是false(new运算符如它名字一样.
每次都要开辟新天地).
另外,用户无法输出String对象的引用:Syste.
out.
println(s);输出的是对象的实体,即字符序列wearestudents.
也可以用一个已创建的String对象创建另一个String对象,如:Stringtom=newString(s);String类还有两个较常用的构造方法.
(1)String(chara[])用一个字符数组a创建一个String对象,如:chara[]={'J','a','v','a'};Strings=newString(a);过程相当于Strings=newString("Java");(2)String(chara[],intstartIndex,intcount)提取字符数组a中的一部分字符创建一个String对象,参数startIndex和count分别指定在a中提取字符的起始位置和从该位置开始截取的字符个数,如:chara[]={'零','壹','贰','叁','肆','伍','陆','柒','捌','玖'};Strings=newString(a,2,4);相当于Strings=newString("贰叁肆伍");§8.
1.
1构造字符串对象3.
引用String常量String常量是对象,因此可以把String常量的引用赋值给一个String对象,例如Strings1,s2;s1="你好";s2="你好";s1,s2具有相同的引用(12AB),表达式s1==s2的值是true,因而具有相同的实体.
s1,s2内存示意如图8.
3所示.
由于用户程序无法知道常量池中"你好"的引用,那么把String常量的引用赋值给一个String对象s1时,Java让用户直接写常量的实体内容来完成这一任务,但实际上赋值到String对象s1中的是String常量"你好"的引用(见图8.
3).
s1是用户声明的String对象,s1中的值是可以被改变的,如果再进行s1="boy",那么s1中的值将发生变化(变成78CD).
8.
1.
2字符串的并置String对象可以用"+"进行并置运算,即首尾相接得到一个新的String对象.
Stringyou="你";Stringhi="好";StringtestOne;you和hi进行并置运算you+hi得到一个新的String对象,可以将这个新的String对象的引用赋值给一个String声明的对象:testOne=you+shi;那么testOne的实体中的字符序列是"你好".
需要注意的是,参与并置运算的String对象,只要有一个是变量,那么Java就会在动态区存放所得到的新String对象的实体和引用,you+hi相当于newString("你好").
如果是两个常量进行并置运算,那么得到的仍然是常量,如果常量池没有这个常量就放入常量池.
"你"+"好"的结果就是常量池中的"你好"仔细阅读例子1,理解程序的输出结果.
publicclassExample8_1{publicstaticvoidmain(Stringargs[Stringhello="你好"StringtestOne="你"+"好"代码1】System.
out.
println(hello==testOne);//输出结果是trueSystem.
out.
println("你好"==testOne);//输出结果是trueSystem.
out.
println("你好"==hello);//输出结果是trueStringyou="你"Stringhi="好"StringtestTwo=you+hi;代码2】System.
out.
println(hello==testTwo);//输出结果是falseStringtestThree=you+hi;System.
out.
println(testTwo==testThree);//输出结果是false}}例子1代码讲解【代码1】:StringtestOne="你"+"好";的赋值号的右边是两个常量进行并置运算,因此,结果是常量池中的常量"你好"(如果读者学习过编译原理,可能知道所谓的常量优化技术,常量折叠是一种Java编译器使用的优化技术,StringtestOne="你"+"好",被编译器优化为StringtestOne="你好",就像intx=1+2被优化为intx=3一样),所以表达式"你好"==testOne和表达式hello==testOne的值都是true.
例子1代码讲解续【代码2】:testTwo=you+hi;的赋值号的右边有变量,例如变量you参与了并置运算,那么you+hi相当于newString("你好");因此结果在动态区诞生新对象,testTwo存放着引用BCD5,testTwo的实体中存放者字符序列:你好(如图8.
4),所以表达式hello==testTwo的结果是false.
程序更关心两个String对象的实体,而不是二者的引用是否相同.
判断两个String对象的实体,即字符序列是否相同见稍后的8.
1.
2(例子2)§8.
1.
2String类的常用方法_11.
publicintlength():获取一个字符串的长度2.
publicbooleanequals(Strings):判断当前String对象的字符序列是否与参数s指定的String对象的字符序列相同例题2说明了equals的用法.
3.
publicbooleanstartsWith(Strings)判断当前String对象的字符序列前缀是否是参数指定的String对象s的字符序列,例如:Stringtom="天气预报,阴有小雨",jerry="比赛结果,中国队赢得胜利";tom.
startsWith("天气")的值是true;tom.
endsWith("大雨")的值是false,§8.
1.
2String类的常用方法_24.
publicintcompareTo(Strings):按字典序与参数s指定的字符序列比较大小.
如果当前String对象的字符序列与s的相同,该方法返回值0,如果大于s的字符序列,该方法返回正值;如果小于s的字符序列,该方法返回负值.
例如,字符a在Unicode表中的排序位置是97,字符b是98,那么对于Stringstr="abcde";str.
compareTo("boy")小于0,str.
compareTo("aba")大于0,str.
compareTo("abcde")等于0其相关方法publicintcompareToIgnoreCase(Strings)例题3SortString.
javaExample8_2.
java使用java.
util包中的Arrays调用sort方法和自己编写SortString类中的sort方法将一个String数组中的String对象的字符序列按字典序排序.
§8.
1.
2String类的常用方法_35.
publicbooleancontains(Strings):String对象调用contains方法判断当前String对象的字符序列是否包含参数s的字符序列,例如,tom="student",那么tom.
contains("stu")的值就是true,而tom.
contains("ok")的值是false.
.
6.
publicintindexOf(Stringstr):String对象调用方法从当前String对象的字符序列的0索引位置开始检索首次出现str的字符序列的位置,并返回该位置.
如果没有检索到,该方法返回的值是–1,其相关方法:indexOf(Strings,intstartpoint)lastIndexOf(Strings)例如Stringtom="Iamagoodcat"tom.
indexOf("a");//值是2tom.
indexOf("good",2);//值是7tom.
indexOf("a",7);//值是13tom.
indexOf("w",2);//值是-17.
publicStringsubstring(intstartpoint):字符串对象调用该方法获得一个新的String对象,新的String对象的字符序列是复制当前String对象的字符序列中的startpoint位置至最后位置上的字符所得到的字符序列.
String对象调用substring(intstart,intend)方法获得一个新的String对象,新的String对象的字符序列是复制当前String对象的字符序列中的start位置至end–1位置上的字符所得到的字符序列.
8.
publicStringtrim():得到一个新的String对象,这个新的String对象的字符序列是当前String对象的字符序列去掉前后空格后的字符序列.
§8.
1.
3符串与基本数据的相互转化_1Java.
lang包中的Integer类调用其类方法:publicstaticintparseInt(Strings)可以将由"数字"字符组成的字符串,如"876",转化为int型数据,类似地,使用java.
lang包中的Byte、Short、Long、Float、Double类调相应的类方法可以将由"数字"字符组成的字符串,转化为相应的基本数据类型.
如:例如:intx;Strings="876"x=Integer.
parseInt(s);publicstaticbyteparseByte(Strings)throwsNumberFormatExceptionpublicstaticshortparseShort(Strings)throwsNumberFormatExceptionpublicstaticlongparseLong(Strings)throwsNumberFormatExceptionpublicstaticfloatparseFloat(Strings)throwsNumberFormatExceptionpublicstaticdoubleparseDouble(Strings)throwsNumberFormatException§8.
1.
3符串与基本数据的相互转化_2可以使用String类的类方法publicstaticStringvalueOf(byten)publicstaticStringvalueOf(intn)publicstaticStringvalueOf(longn)publicstaticStringvalueOf(floatn)publicstaticStringvalueOf(doublen)将形如123、1232.
98等数值转化为字符串,如:Stringstr=String.
valueOf(12313.
9876);例题4求若干个数之和,程序输出结果如图8.
4.
注应用程序中的main方法中的参数args能接受用户从键盘键入的字符串.
比如,使用解释器java.
exe来执行主类C:\ch8\>javaExample8_478.
86122512598这时程序中的args[0]、arg[1]、arg[2]、arg[3]和args[4]分别得到字符串"78.
86"、"12"、"25"、"125"和"98".
§8.
1.
4对象的字符串表示在子类中我们讲过,所有的类都默认是java.
lang包中Object类的子类或间接子类.
Object类有一个publicStringtoString()方法,一个对象通过调用该方法可以获得该对象的字符序列表示.
一个对象调用toString()方法返回的String对象的字符序列的一般形式为:创建对象的类的名字@对象的引用的字符串表示例题5TV.
javaExample8_5.
javaTV类重写了toString()方法,并使用super调用隐藏的toString()方法§8.
1.
5字符串与字符、字节数组_11.
字符串与字符数组String类的构造方法:String(char[]);String(char[],intoffset,intlength)分别用字符数组中的全部字符和部分字符创建字符串对象将String对象的部分字符序列存放到数组中的方法:publicvoidgetChars(intstart,intend,charc[],intoffset)将String对象的字符序列存放到数组中的方法publicchar[]toCharArray()例题6具体地说明了getChars()和toCharArray()方法的使用§8.
1.
5字符串与字符、字节数组_12.
字符串与字节数组String(byte[])用指定的字节数组构造一个字符串对象.
String(byte[],intoffset,intlength)用指定的字节数组的一部分,即从数组起始位置offset开始取length个字节构造一个字符串对象.
publicbyte[]getBytes()使用平台默认的字符编码,将当前String对象的字符序列存放到字节数组,并返回数组的引用.
publicbyte[]getBytes(StringcharsetName)使用参数指定字符编码,将当前String对象的字符序列存放到字节数组,并返回数组的引用.
String常量:"Java你好",调用getBytes()返回一个字节数组d,其长度为8,该字节数组的d[0]、d[1]、d[2]和d[3]单元分别是字符J、a、v和a的编码,第d[4]和d[5]单元存放的是字符'你'的编码(GB2312编码中,一个汉字占2个字节),第d[6]和d[7]单元存放的是字符'好'的编码.
程序运行效果如图8.
10.
例题7假设机器的默认编码是:GB2312.
字符串:"Java你好"调用getBytes()返回一个字节数组d,其长度为8,注意该字节数组的d[0]~d[7]单元存放字符的编码的情况.
3.
字符串的加密算法使用一个String对象password的字符序列作为密码对另一个String对象sourceString的字符序列进行加密,操作过程如下.
将password的字符序列存放到一个字符数组中,char[]p=password.
toCharArray();假设数组p的长度为n,那么就将待加密的sourceString的字符序列按顺序以n个字符为一组(最后一组中的字符个数可小于n),对每一组中的字符用数组a的对应字符做加法运算.
比如,某组中的n个字符是a0a1…an-1那么按如下方式得到对该组字符的加密结果:上述加密算法的解密算法是对密文做减法运算例子8在下面的例子8中EncryptAndDecrypt.
java,Example8_8.
java用户输入密码来加密"今晚十点进攻",运行效果如图8.
11.
§8.
1.
6正则表达式及字符串的替换与分解_11.
正则表达式正则表达式是一个String对象的字符序列,该字符序列中含有具有特殊意义字符,这些特殊字符称做正则表达式中的元字符.
比如,"\\dcat"中的\\d就是有特殊意义的元字符,代表0到9中的任何一个,"0cat","1cat","2cat",…,"9cat"都是和正则表达式"\\dcat"匹配的字符序列.
String对象调用publicbooleanmatches(Stringregex)方法可以判断当前String对象的字符序列是否和参数regex指定的正则表达式匹配.
参考表8.
1,表8.
2.
在正则表达式中可以用方括号括起若干个字符来表示一个元字符,该元字符代表方括号中的任何一个字符.
例如Stringregex="[159]ABC",那么"1ABC"、"5ABC"和"9ABC"都是和正则表达式regex匹配的字符序列.
例如,[abc]:代表a、b、c中的任何一个;[^abc]:代表除了a、b、c以外的任何字符;[a-zA-Z]:代表英文字母(包括大写和小写)中的任何一个"[a-zA-Z|0-9|_]+"任何由英文字母,数字或下划线组成的字符序列都和正则表达式匹配例子9程序判断用户从键盘输入的字符序列是由英文字母,数字或下划线所组成§8.
1.
6正则表达式及字符串的替换与分解_12.
字符串的替换publicStringreplaceAll(Stringregex,Stringreplacement)String对象调用publicStringreplaceAll(Stringregex,Stringreplacement)方法返回一个新的String对象,这个新的String对象的字符序列是把当前String对象的字符序列中所有和参数regex匹配的子字符序列,用参数replacement的字符序列替换后得到字符序列,例如:Stringstr="12hello567bird".
replaceAll("[a-zA-Z]+","你好");那么str的字符序列就是将"12hello567bird"中所有英文字符序列替换为"你好"后得到的字符序列,即str的字符序列是"12你好567你好".
例题10String对象str调用replaceAll()方法返回一个新的String对象,该对象的字符序列是str的字符序列中的网站链接地址被替换为"******"后的字符序列.
§8.
1.
6正则表达式及字符串的替换与分解_23.
字符串的分解publicString[]split(Stringregex)使用参数指定的正则表达式regex做为分隔标记分解出其中的单词,并将分解出的单词存放在字符串数组中.
例如,对于字符串strStringstr="1949年10月1日是中华人民共和国成立的日子";如果准备分解出全部由数字字符组成的单词,就必须用非数字字符串做为分隔标记,因此,可以使用正则表达式:Stringregex="\\D+";做为分隔标记分解出str中的单词:StringdigitWord[]=str.
split(regex);那么,digitWord[0]、digitWord[1]和digitWord[2]就分别是"1949"、"10"和"1".
例题11用户从键盘输入一行文本,程序输出其中的单词.
需要特别注意的是,split方法认为分隔标记的左面应该是单词,因此如果和当前String对象的字符序列的前缀和regex匹配,那么split(Stringregex)方法分解出的第一个单词是不含任何字符的字符序列(长度为0的字符序列),即"".
例如,对于:Stringstr="公元1949年10月1日是中华人民共和国成立的日子";使用正则表达式Stringregex="\\D+"作为分隔标记分解str的字符序列中的单词:StringdigitWord[]=str.
split(regex);那么,数组digitWord的长度是4,不是3.
digitWord[0]、digitWord[1],digitWord[2]和digitWord[3]分别是:"","1949"、"10"和"1".
注意事项§8.
2StringTokenizer类本节学习怎样使用StringTokenizer对象分解String对象的字符序列.
StringTokenizer类在java.
util包中,有两个常用的构造方法:StringTokenizer(Strings):为String对象s构造一个分析器.
使用默认的分隔标记,即空格符、换行符、回车符、Tab符、进纸符做分隔标记.
StringTokenizer(Strings,Stringdelim为String对象s构造一个分析器.
参数delim的字符序列中的字符的任意排列被作为分隔标记.
例如:StringTokenizerfenxi=newStringTokenizer("you#*are*##welcome"如果指定字符#和字符*是分隔标记,那么字符#和字符*的任意排列,比如,###*#*就是一个分隔标记,即"You#are#*welcome"和"You***#are*#*#welcome"都有三个单词,分别是we,are和welcome.
具体使用步骤:StringTokenizer对象称作一个字符串分析器可以使用下列方法:(1)nextToken():逐个获取字符串中的语言符号(单词),字符串分析器中的负责计数的变量的值就自动减一.
(2)hasMoreTokens():只要字符串中还有语言符号,即计数变量的值大于0,该方法就返回true,否则返回false.
(3)countTokens():得到分析器中计数变量的值.
wearestudents!
wearestudents!
3例子12计算购物小票的中的商品价格的和程序关心是购物小票中的数字,因此需要分解出这些数字,以便单独处理,这样就需要把非数字的字符序列替换成统一的字符,以便使用分隔标记分解出数字,例如,对于"12#25#39.
87",如果用字符#做分隔标记,就很容易分解出数字单词.
在例子12的PriceToken类中,把购物小票中非数字的字符序列都替换成#,然后再分解出数字单词(价格),并计算出这些数字的和,运行效果如图8.
14.
PriceToken.
javaExample8_12.
java§8.
3Scanner类使用Scanner类从字符串中解析程序所需要的数据.
Scanner对象可以解析字符序列中的单词,例如,对于String对象NBAStringNBA="ILoveThisGame";为了解析出NBA的字符序列中的单词,可以如下构造一个Scanner对象.
Scannerscanner=newScanner(NBA);Scanner对象可以调用方法useDelimiter(正则表达式);将正则表达式作为分隔标记,即让Scanner对象在解析操作时,把与正则表达式匹配的字符序列作为分隔标记.
如果不指定分隔标记,那么Scanner对象默认地用空白字符:空格,制表符,回行符作为分隔标记来解析String对象的字符序列中的单词.
§8.
3Scanner类scanner将空格做为分隔标记来解析字符序列中的单词,具体解析操作:scanner调用next()方法依次返回NBA中的单词,如果NBA最后一个单词已被next()方法返回,scanner调用hasNext()将返回false,否则返回true.
对于被解析的字符序列中的数字型的单词,比如618,168.
98等,scanner可以用nextInt()或nextDouble()方法来代替next()方法,即scanner可以调用nextInt()或nextDouble()方法将数字型单词转化为int或double数据返回.
如果单词不是数字型单词,scanner调用nextInt()或nextDouble()方法将发生InputMismatchException异常,在处理异常时可以调用next()方法返回该非数字化单词.
§8.
3Scanner类2.
使用正则表达式作为分隔标记解析字符串Scanner对象可以调用useDelimiter(正则表达式);方法将一个正则表达式作为分隔标记,即和正则表达式匹配的字符串都是分隔标记.
例题14使用正则表达式(匹配所有非数字字符串)Stringregex="[^0123456789.
]+";作为分隔标记解析字符串:"话费清单:市话费76.
89元,长途花费167.
38元,短信费12.
68元"中的全部价格数字,并计算了总的通信费用.
例子13使用正则表达式:Stringregex="[^0123456789.
]+"//(匹配所有非数字字符序列)作为分隔标记,解析"市话76.
8元,长途:167.
38元,短信12.
68元",以及"牛奶:8.
5圆,香蕉3.
6圆,酱油:2.
8圆"中的价格,并计算价格之和.
程序运行效果如图8.
15Example8_13.
javaGetPrice.
java8.
4StringBuffer类String对象的字符序列是不可修改的,也就是说,String对象的字符序列的字符不能被修改、删除,即String对象的实体是不可以再发生变化的,例如,对于Strings=newString("我喜欢散步");如图8.
16所示意.
StringBuffer类的对象的实体的内存空间可以自动地改变大小,便于存放一个可变的字符序列.
比如,对于:StringBuffers=newStringBuffer("我喜欢");对象s可调用append方法追加一个字符序列,如图8.
17.
s.
append("玩篮球");§8.
4StringBuffer类_续1)StringBufferappend(Strings):将String对象s的字符序列追加到当前StringBuffer对象的字符序列中,并返回当前StringBuffer对象的引用StringBufferappend(intn):将int型数据n转化为String对象,再把该String对象的字符序列追加到当前StringBuffer对象的字符序列中,并返回当前StringBuffer对象的引用StringBufferappend(Objecto):将一个Object对象o的字符序列表示追加到当前String-Buffer对象的字符序列中,并返回当前StringBuffer对象的引用类似的方法还有:StringBufferappend(longn),StringBufferappend(booleann),StringBufferappend(floatn),StringBufferappend(doublen),StringBufferappend(charn)2)publicchatcharAt(intn):得到参数n指定的置上的单个字符publicvoidsetCharAt(intn,charch):将当前StringBuffer对象实体中的字符串位置n处的字符用参数ch指定的字符替换2StringBuffer类的常用方法_1§8.
4StringBuffer类_续3)StringBufferinsert(intindex,Stringstr):将参数str指定的字符串插入到参数index指定的位置4)publicStringBufferreverse():将该对象实体中的字符翻转5)StringBufferdelete(intstartIndex,intendIndex):从当前StringBuffer对象实体中的字符串中删除一个子字符串其相关方法:deleteCharAt(intindex)删除当前StringBuffer对象实体的字符串中index位置处的一个字符.
6)StringBufferreplace(intstartIndex,intendIndex,Stringstr):将当前StringBuffer对象实体中的字符串的一个子字符串用参数str指定的字符串替换例题14使用StringBuffer类的常用方法2StringBuffer类的常用方法_2§8.
5Date与Calendar类1.
Date类Date类在java.
util包中.
Date类的构造方法之一:Date()使用Date类的无参数构造方法创建的对象可以获取本地当前时间.
例:DatenowTime=newDate();当前nowTime对象中含有的日期、时间就是创建nowTime对象时的本地计算机的日期和时间.
例如,假设当前时间是:2011年3月10日23:05:32(CST时区),那么System.
out.
println(nowTime);输出结果是:ThuMar1023:05:32CST2011.
Date对象表示时间的默认顺序是:星期、月、日、小时、分、秒、年.
§8.
5Date与Calendar类Date类的构造方法之二:Date(longtime)使用long型参数创建指定的时间计算机系统将其自身的时间的"公元"设置在1970年1月1日0时(格林威治时间),可以根据这个时间使用Date的带参数的构造方法:Date(longtime)来创建一个Date对象,例如:Datedate1=newDate(1000),date2=newDate(-1000);其中的参数取正数表示公元后的时间,取负数表示公元前的时间,其中1000表示1000毫秒,那么,date1含有的日期、时间就是计算机系统公元后1秒时刻的日期、时间.
如果运行Java程序的本地时区是北京时区(与格林威治时间相差8个小时),那么上述date1就是1970年01月01日08时00分01秒、date2就是1970年01月01日07时59分59秒.
System类的静态方法publiclongcurrentTimeMillis()获取系统当前时间.
§8.
5Date与Calendar类2.
Calendar类Calendar类在java.
util包中.
使用Calendar类的static方法getInstance()可以初始化一个日历对象,如:Calendarcalendar=Calendar.
getInstance();calendar对象可以调用方法:publicfinalvoidset(intyear,intmonth,intdate)publicfinalvoidset(intyear,intmonth,intdate,inthour,intminute)publicfinalvoidset(intyear,intmonth,intdate,inthour,intminute,intsecond)其作用是将日历翻到任何一个时间§8.
5Date与Calendar类calendar对象可以调用方法:publiclonggetTimeInMillis()可以将时间表示为毫秒.
publicfinalvoidsetTime(Datedate)使用给定的Date设置此Calendar的时间publicintget(intfield):可以获取有关年份、月份、小时、星期等信息例如:calendar.
get(Calendar.
MONTH);返回一个整数,如果该整数是0表示当前日历是在一月,该整数是1表示当前日历是在二月等.
例如:calendar.
get(Calendar.
DAY_OF_WEEK);返回一个整数,如果该整数是1表示星期日,如果是2表示是星期一,依次类推,如果是7表示是星期六.
例题15计算了2012-9-01和2016-07-01之间相隔的天数例题16Example8_16.
javaCalendaBean.
java输出2016年7月的"日历"§8.
5日期的格式化1format方法Formatter类的format方法:format(格式化模式,日期列表)按着"格式化模式"返回"日期列表"中所列各个日期中所含数据(年,月,日,小时等数据)的字符串表示.
Java已经将format方法做为了String类的静态方法,因此,程序可以直接使用String类调用format方法对日期进行格式化.
1)格式化模式format方法中的"格式化模式"是一个用双引号括起的字符序列(字符串),该字符序列中的字符由时间格式符和普通字符所构成.
例如:"日期:%ty-%tm-%td"Strings=String.
format("%tY年%tm月%td日",newDate(),newDate(),newDate());那么s就是"2011年02月10日§8.
6日期的格式化2)日期列表format方法中的"日期列表"可以是用逗号分隔的Calendar对象或Date对象.
format方法默认按从左到右的顺序使用"格式化模式"中的格式符来格式"日期列表"中对应的日期,而"格式化模式"中的普通字符保留原样.
3)格式化同一日期可以在"格式化模式"中使用"<",比如:"%ty-%
6日期的格式化2不同区域的星期格式如果想用特定地区的星期格式来表示日期中的星期,可以用format的重载方法:format(Localelocale,格式化模式,日期列表);其中的参数locale是一个Locale类的实例,用于表示地域.
Locale类的static常量都是Locale对象,其中US是表示美国的static常量.
比如,假设当前时间是2011-02-10,对于(%ta表示简称的星期):Strings=String.
format(Locale.
US,"%ta(%
JAPAN,"%tA(%
CHINA.
§8.
7Math、BigInteger和Random类1.
Math类Math类在java.
lang包中.
Math类包含许多用来进行科学计算的类方法,这些方法可以直接通过类名调用.
另外,Math类还有两个静态常量,它们分别是:E2.
7182828284590452354和PI3.
14159265358979323846.
以下是Math类的常用类方法:publicstaticlongabs(doublea)返回a的绝对值.
publicstaticdoublemax(doublea,doubleb)返回a、b的最大值.
publicstaticdoublemin(doublea,doubleb)返回a、b的最小值.
publicstaticdoublerandom()产生一个0到1之间的随机数(不包括0和1).
publicstaticdoublepow(doublea,doubleb)返回a的b次幂.
publicstaticdoublesqrt(doublea)返回a的平方根.
publicstaticdoublelog(doublea)返回a的对数.
publicstaticdoublesin(doublea)返回正弦值.
publicstaticdoubleasin(doublea)返回反正弦值.
§8.
6Math、BigInteger和Random类2BigInteger类java.
math包中的BigInteger类提供任意精度的整数运算.
可以使用构造方法:publicBigInteger(Stringval)构造一个十进制的BigInteger对象.
以下是BigInteger类的常用类方法:publicBigIntegeradd(BigIntegerval)返回当前大整数对象与参数指定的大整数对象的和.
publicBigIntegersubtract(BigIntegerval)返回当前大整数对象与参数指定的大整数对象的差.
publicBigIntegermultiply(BigIntegerval)返回当前大整数对象与参数指定的大整数对象的积.
publicBigIntegerdivide(BigIntegerval)返回当前大整数对象与参数指定的大整数对象的商.
publicBigIntegerremainder(BigIntegerval)返回当前大整数对象与参数指定的大整数对象的余.
publicintcompareTo(BigIntegerval)返回当前大整数对象与参数指定的大整数的比较结果,返回值是1、-1或0,分别表示当前大整数对象大于、小于或等于参数指定的大整数.
publicBigIntegerpow(inta)返回当前大整数对象的a次幂.
publicStringtoString()返回当前大整数对象十进制的字符串表示.
publicStringtoString(intp)返回当前大整数对象p进制的字符串表示.
例题17计算5的平方根以及两个大整数的和与积§8.
7Math、BigInteger和Random类3.
Random类复习:使用Math类调用其类方法random()返回一个0至1之间的随机数(不包括0和1).
例如,下列代码得到1至100之间的一个随机整数(包括1和100),(int)(Math.
random()*100)+1;新内容:Java提供了更为灵活的用于获得随机数的Random类(该类在java.
util包中).
Random类的如下构造方法:publicRandom();publicRandom(longseed);使用参数seek指定的种子创建一个Random对象随机数生成器random调用不带参数的nextInt()方法:Randomrandom=newRandom(random.
nextInt();返回一个0至n之间(包括0,但不包括n)的随机数随机数生成器random调用带参数的nextInt(intm)方法(参数m必须取正整数值)例如:random.
nextInt(100);返回一个0至100之间的随机整数(包括0,但不包括100).
例如:随机得到true和false两个表示真和假的boolean值,随机数生成器random调用nextBoolean()方法例如:random.
nextBoolean();返回一个随机boolean值.
例子18演示是从1-100之间随机得到6个不同的数需要注意的是,对于具有相同种子的两个Random对象,二者依次调用nextInt()方法获取的随机数序列是相同的.
Example8_18.
java得到随机数类GetRandomNumber§8.
8数字格式化1Formatter类_1Formatter类提供了一个和C语言printf函数类似的format方法:format(格式化模式,值列表)该方法按着"格式化模式"返回"值列表"的字符串表示.
Java已经将format方法做为了String类的静态方法,因此,程序可以直接使用String类调用format方法对数字进行格式化.
1)格式化模式format方法中的"格式化模式"是一个用双引号括起的字符序列(字符串),该字符序列中的字符由格式符和普通字符所构成.
例如:"输出结果%d,%f,%d"中的%d和%f是格式符号.
format方法返回的字符串就是"格式化模式"中的格式符被替换为它得到的格式化结果后的字符串.
例如:Strings=String.
format("%.
2f",3.
141592);那么s就是"3.
14".
2)值列表format方法中的"值列表"是用逗号分隔的变量、常量或表达式.
例如:Strings=format("%d元%0.
3f公斤%d台",888,999.
777666,123);那么,s就是"888元999.
778公斤123台".
§8.
8数字格式化3)格式化顺序format方法默认按从左到右的顺序使用"格式化模式"中的格式符来格式化"值列表"中对应的值,而"格式化模式"中的普通字符保留原样.
例如,假设int型变量x和double型变量y的值分别是888和3.
1415926,那么对于Strings=format("从左向右:%d,%.
3f,%d",x,y,100);字符串s就是:从左向右:888,3.
142,100注1:改变默认的顺序(从左向右)进行格式化,在格式符前面添加索引符号index$,例如,1$表示"值列表"中的第1个,2$表示"值列表"中的第2个,对于:Strings=String.
format("不是从左向右:%2$.
3f,%3$d,%1$d",x,y,100);字符串s就是不是从左向右:3.
142,100,888注2:如果准备在"格式化模式"中包含普通的%,在编写代码时需要连续键入两个%,如:Strings=String.
format("%d%%",89);输字符串s是:"89%"§8.
8数字格式化2格式化整数1)%d,%o,%x和%格式符可格式化byte、Byte、short、Short、int、Integer、long和Long型数据,详细说明见Page204.
例如,对于:Strings=String.
format("%d,%o,%x,%X",703576,703576,703576,703576)字符串s就是:703576,2536130,abc58,ABC582)修饰符加号修饰符"+"格式化正整数时,强制添加上正号,例如,%+d将123格式化为"+123".
逗号修饰符","格式化整数时,按"千"分组,例如,对于:Strings=String.
format("按千分组:%,d.
按千分组带正号%+,d",1235678,9876);字符串s就是:按千分组:1,235,678.
按千分组带正号+9,8763)数据的宽度数据的宽度就是format方法返回的字符串的长度.
规定数据宽度的一般格式为"%md",其效果是在数字的左面增加空格;或"%-md",其效果是在数字的右面增加空格,例如,将数字59格式化为宽度为8的字符串:Strings=String.
format("%8d",59)字符串s就是:"59",其长度(s.
length())为8,即s在59左面添加了6个空格字符.
对于:Strings=String.
format("%-8d",59);字符串s就是:"59",其长度(s.
length())为8.
对于:Strings=String.
format("%5d%5d%8d",59,60,90);字符串s就是:"596090"(长度为18).
注:如果实际数字的宽度大于格式中指定的宽度,就按数字的实际宽度进行格式化.
可以在宽度的前面增加前缀0,表示用数字0(不用空格)来填充宽度左面的富裕部分,例如:Strings=String.
format("%08d",12);字符串s就是:"00000012",其长度(s.
length())为8,即s在12的左面添加了6个数字0.
§8.
8数字格式化3格式化浮点数_11)%f,%e(%E),%g(%G)和%a(%A)格式符可格式化float、Float、double和Double:%f将值格式化为十进制浮点数,小数保留6位.
%e(%E)将值格式化为科学记数法的十进制的浮点数(%E在格式化时将其中的指数符号大写,例如5E10).
例如,对于:Strings=String.
format("%f,%e",13579.
98,13579.
98)字符串s就是:13579.
980000,1.
357998e+042)修饰符加号修饰符"+"格式化正数时,强制添加上正号,例如%+f将123.
78格式化为"+123.
78",%+E将123.
78格式化为"+1.
2378E+2".
逗号修饰符","格式化浮点数时,将整数部分按"千"分组,例如,对于:Strings=String.
format("整数部分按千分组:%+,f",1235678.
9876);字符串s就是:整数部分按千分组:+1,235,678.
987600§8.
8数字格式化3)限制小数位数与数据的"宽度"nf"可以限制小数的位数,其中的n是保留的小数位数,例如%.
3f将6.
1256格式化为"6.
126"(保留3位小数).
规定宽度的一般格式为"%mf"(在数字的左面增加空格),或"%-md"(在数字的右面增加空格).
例如,将数字59.
88格式化为宽度为11的字符串Strings=String.
format("%11f",59.
88);字符串s就是:"59.
880000",其长度(s.
length())为11Strings=String.
format("%-11f",59.
88);字符串s就是:"59.
880000",其长度(s.
length())为11在指定宽度的同时也可以限制小数位数(%m.
nf),Strings=String.
format("%11.
2f",59.
88);字符串s就是:"59.
88",即s在59.
88左面添加了6个空格字符.
在宽度的前面增加前缀0,表示用数字0(不用空格)来填充宽度左面的富裕部分,例如:Strings=String.
format("%011f",59.
88);字符串s就是:"0059.
880000",其长度(s.
length())为11.
注:如果实际数字的宽度大于格式中指定的宽度,就按数字的实际宽度进行格式化例题19格式化数字§8.
9Class类与Console类8.
9.
1Class类1.
使用Class的类方法得到一个和某类(参数className指定的类)相关的Class对象,publicstaticClassforName(StringclassName)throwsClassNotFoundException上述方法返回一个和参数className指定的类相关的Class对象.
如果类在某个包中,className必须带有包名,例如,className="java.
util.
Date".
2.
步骤1中获得的Class对象调用publicObjectnewInstance()throwsException,方法就可以得到一个className类的对象要特别注意的是:使用Class对象调用newInstance()实例化一个className类的对象时,className类必须有无参数的构造方法.
例子20使用Class对象得到一个Rect类以及java.
util包中Date类的对象.
运行效果如图8.
23所示8.
9.
2Console类如果希望在键盘输入一行文本,但不想让该文本回显,即不在命令行显示,那么就需要使用java.
io包中的Console类的对象来完成.
首先使用System类调用console()方法返回一个Console类的一个对象,比如cons:Consolecons=System.
console();然后,cons调用readPassword()方法读取用户在键盘输入的一行文本,并将文本以一个char数组返回:char[]passwd=cons.
readPassword();例子21中,模拟用户用户输入的密码,如果输入正确(Ilovethisgame),那么,程序让用户看到"你好,欢迎你!
".
程序允许用户2次输入的密码不正确,一旦超过2次,程序将立刻退出.
§8.
10Pattern与Matcher类_1Java提供了专门用来进行模式匹配的Pattern类和Matcher类,这些类在java.
util.
regex包中.
以下结合具体问题来讲解使用Pattern类和Matcher类的步骤.
假设有字符串:Stringinput="hello,goodmorning,thisisagoodidea"我们想知道input从哪个位置开始至哪个位置结束曾出现了字符串good.
使用Pattern类和Matcher类检索字符串str中的子字符串的步骤如下:1.
建立模式对象使用正则表达式regex做参数得到一个称为模式的Pattern类的实例pattern:例如:Stringregex="good"Patternpattern=Pattern.
compile(regex);模式对象是对正则表达式的封装.
Pattern类调用类方法compile(Stringregex)返回一个模式对象,其中的参数regex是一个正则表达式,称为模式对象使用的模式.
§8.
9Pattern与Matcher类_22.
得到匹配对象模式对象pattern调用matcher(CharSequenceinput)方法返回一个Matcher对象matcher,称为匹配对象Matchermatcher=pattern.
matcher(input);Matcher对象matcher可以使用下列方法寻找字符串input中是否有和模式regex匹配的子序列(regex是创建模式对象pattern时使用的正则表达式).
publicbooleanfind():寻找input和regex匹配的下一子序列,如果成功该方法返回true,否则返回false.
publicbooleanmatches():matcher调用该方法判断input是否完全和regex匹配.
publicbooleanlookingAt():matcher调用该方法判断从input的开始位置是否有和regex匹配的子序列.
publicbooleanfind(intstart):matcher调用该方法判断input从参数start指定位置开始是否有和regex匹配的子序列.
publicStringreplaceAll(Stringreplacement)matcher调用该方法可以返回一个字符串,该字符串是通过把input中与模式regex匹配的子字符串全部替换为参数replacement指定的字符串得到的.
publicStringreplaceFirst(Stringreplacement)matcher调用该方法可以返回一个字符串,该字符串是通过把input中第1个与模式regex匹配的子字符串替换为参数replacement指定的字符串得到的.
例子22计算了一个账单的总价格importjava.
util.
regex.
*;publicclassExample8_22{publicstaticvoidmain(Stringargs[Strings="市话76.
8元,长途:167.
38元,短信12.
68"Stringregex="[0123456789.
匹配数字序列Patternp=Pattern.
compile(regex);//模式对象Matcherm=p.
matcher(s)匹配对象doublesum=0;while(m.
find(Stringitem=m.
group(System.
out.
println(item)sum=sum+Double.
parseDouble(item)System.
out.
println("账单总价格:"+sum);}}8.
11应用举例本节用Java程序模拟抢红包,这里给出的随机抢红包算法比较简单,比如,假设当前是5.
2圆,参与抢红包的人是6人.
那么第一个人抢到的金额m是一个在0-519之间的随机数(按分表示钱的金额),如果m是0,需要把m赋值成1(保证用户至少能抢到1分钱),如果m不是0,那么520-m是剩余的金额,要求剩余的金额必须保证其余5个人都至少能抢到1分钱,否则m要减去多抢到的金额.
读者可以阅读代码,理解类以及其中方法.
例子23中有2个重要的类RedEnvelope以及它的子类RandomRedEnvelope.
RedEnvelope类是抽象类,规定了子类必须要重写的抢红包的方法giveMoney().
子类RandomRedEnvelope重写giveMoney()方法实现随机抢红包(随机红包),效果如图8.
24总结熟练掌握String类的常用方法.
掌握String类的和StringBuffer类的不同,以及二者之间的联系.
使用StringTokenizer,Scannner类分析字符串,获取字符串中被分隔符分隔的单词.
掌握Date类和Calendar类获取时间和日期的用法.
如果需要处理特别大的整数,使用BigInteger类.
当需要格式化日期和数字时使用相关的格式化类及方法.
spinservers是一家主营国外服务器租用和Hybrid Dedicated等产品的商家,Majestic Hosting Solutions LLC旗下站点,商家数据中心包括美国达拉斯和圣何塞机房,机器一般10Gbps端口带宽,且硬件配置较高。目前,主机商针对达拉斯机房机器提供优惠码,最低款Dual E5-2630L v2+64G+1.6TB SSD月付89美元起,支持PayPal、支付宝等...
Hostodo近日发布了美国独立日优惠促销活动,主要推送了四款特价优惠便宜的VPS云服务器产品,基于KVM虚拟架构,NVMe阵列,1Gbps带宽,默认分配一个IPv4+/64 IPv6,采用solusvm管理,赠送收费版DirectAdmin授权,服务有效期内均有效,大致约为7折优惠,独立日活动时间不定,活动机型售罄为止,有需要的朋友可以尝试一下。Hostodo怎么样?Hostodo服务器好不好?...
vollcloud LLC首次推出6折促销,本次促销福利主要感恩与回馈广大用户对于我们的信任与支持,我们将继续稳步前行,为广大用户们提供更好的产品和服务,另外,本次促销码共限制使用30个,个人不限购,用完活动结束,同时所有vps产品支持3日内无条件退款和提供免费试用。需要了解更多产品可前往官网查看!vollcloud优惠码:VoLLcloud终生6折促销码:Y5C0V7R0YW商品名称CPU内存S...