Java程序设计教学做一体化教程第6章字符串日期与数学公式.ppt
注意:开始用功了!,配合例子源代码一起使用,Power point 制作:耿祥义 张跃平,字符串、日期与数学公式,Java程序设计教学做一体化教程 第6章,主要内容,6.1字符串对象 核心知识 _1,1字符串 常量对象 字符串常量对象是用双引号括起的字符序列,例如你好、12.97、boy等.字符串对象 使用String类创建字符串对象,例如:String s=new String(we are students);创建了一个字符串对象s,引用字符串常量对象 字符串常量是对象,因此可以把字符串常量的引用赋值给一个字符串对象,例如 string s1,s2;s1=how are you;s2=how are you;这样,s1,s2具有相同的引用,因而具有相同的实体。s1、s2内存示意如图6.1。,6.1.1 核心知识 _2,2String类的常用方法 public int length()字符串调用length()方法返回当前字符串的长度。public boolean equals(String s)字符串调用该方法比较当前字符串是否与参数s指定的字符串的相同。public boolean startsWith(String s)字符串对象调用startsWith(String s)方法判断当前字符串的前缀是否是参数s指定的字符串;调用endsWith(String s)方法判断一个字符串的后缀是否是字符串。public int compareTo(String s)字符串调用该方法按字典序与参数s指定的字符串比较大小。public boolean contains(String s)字符串调用该方法判断当前字符串是否含有参数指定的字符串s。public int indexOf(String s)字符串调用该方法从当前字符串的头开始检索字符串s,并返回首次出现s的索引位置(索引从0开始),如果没有检索到字符串s,该方法返回的值是-1。public String substring(int startpoint)字符串调用该方法获得一个当前字符串的子串,该子串是从当前字符串的startpoint处截取到最后所得到的字符串。public String trim()字符串s通过调用方法trim()得到一个字符串对象,该字符串对象是s去掉前后空格后的字符串。更多方法见page113.,6.1.2 能力目标,掌握String类的常用方法。,6.1.3 任务驱动,将下列Application6_1.java中的【代码】替换为程序代码。程序运行效果如图6.2。,任务小结,关系表达式tom=boy和tom.equals(boy)的意义有很大的不同.tom、boy中存放的是引用,内存示意如图6.3所示。那么tom=boy比较的是对象的引用,不是对象的实体,而字符串对象调用public boolean equals(String s)是比较当前字符串对象的实体与参数s的实体是否相同。另外,需要注意的是Java把String类声明为final类,因此用户不能扩展String类,即String类不可以有子类,6.1.4 实践环节,阅读、调试下列程序,注意排序字符串的sort方法。SortString.java Application6_2.java,6.2 字符串与数组 6.2.1 核心知识_1,1用数组构造字符串 可用构造方法String(char a)提取字符数组a中的全部字符构造一个字符串对象,如:char a=J,a,v,a;String s=new String(a);上述过程相当于:String s=new String(Java);也可用构造方法String(char a,int startIndex,int count)提取字符数组a中的一部分字符创建一个字符串对象,参数startIndex和count分别指定在a中提取字符的起始位置和从该位置开始截取的字符个数,例如:char a=零,壹,贰,叁,肆,伍,陆,柒,捌,玖;String s=new String(a,2,4);相当于 String s=new String(贰叁肆伍);,6.2.1 核心知识 _2,2将字符串中的字符放入数组中 字符串使用方法:public void getChars(int start,int end,char c,int offset)将当前字符串中从位置start到end-1位置上的字符复制的数组c中,并从数组c的offset处开始存放这些字符。字符串调用该方法:public char toCharArray()返回一个字符数组,该数组的长度与字符串的长度相等、第i单元中的字符刚好为当前字符串中的第i个字符。public byte getBytes()方法使用平台默认的字符编码,将当前字符串转化为一个字节数组。假设机器的默认编码是GB2312。字符串Java你好调用getBytes()返回一个字节数组d,其长度为8。,6.2.2 能力目标,将字符串放入数组中,返回字符串的字节数组(默认编码)。,6.2.3 任务驱动,将下列Application6_3.java中的【代码】替换为程序代码。程序运行效果如图6.4。,任务 小结,String类的构造方法String(byte)用指定的字节数组构造一个字符串对象。另外,byte getBytes(String charsetName)使用参数指定字符编码,将当前字符串转化为一个字节数组。如果平台默认的字符编码是:GB_2312(国标,简体中文),那么调用getBytes()方法等同于调用getBytes(GB2312)。,6.2.4 实践环节,阅读、调试下列代码,并用你熟悉的加密算法修改代码中的加密算法。EncryptAndDecrypt.java Application6_4.java,6.3 字符串转化为数字 6.3.1 核心知识_1,1Integer类中的parseInt方法 java.lang包中的Integer类调用其类方法(static方法):public static int parseInt(String s)可以将由“数字”字符组成的字符串,转化为int型数据,例如:int x;String s=876;x=Integer.parseInt(s);,6.3.1 核心知识 _2,trycatch语句的格式如下:try 包含可能发生异常的语句catch(ExceptionSubClass1 e)catch(ExceptionSubClass2 e),2处理异常 所谓异常就是程序运行时可能出现的一些错误。ParseInt方法可以将“数字”格式的字符串,转化为int型数据,但是当试图将字符串ab89转换成数字时,例如:int number=Integer.parseInt(ab89);方法parseInt()在执行过程中就会抛出NumberFormatException对象,即程序运行出现NumberFormatException异常,并立刻停止parseInt()方法的执行。Java使用trycatch语句来处理异常,将可能出现的异常操作放在trycatch语句的try部分,一旦try部分抛出异常对象,或调用某个可能抛出异常的方法,并且该方法抛出了异常对象,那么try部分将立刻结束执行,而转向执行相应的catch部分。所以程序可以将发生异常后的处理放在catch部分。,各个catch参数中的异常类都是Exception的某个子类,表明try部分可能发生的异常,这些子类之间不能有父子关系,否则保留一个含有父类参数的catch即可。,6.3.2 能力目标,字符串转换为数字,并能处理异常情况。,6.3.3 任务驱动,将下列Application6_5.java中的【代码】替换为程序代码。程序运行效果如图6.5。,任务 小结,(1)使用java.lang包中的Byte、Short、Long、Float、Double类调相应的类方法:public static byte parseByte(String s)throws NumberFormatExceptionpublic static short parseShort(String s)throws NumberFormatExceptionpublic static long parseLong(String s)throws NumberFormatExceptionpublic static float parseFloat(String s)throws NumberFormatExceptionpublic static double parseDouble(String s)throws NumberFormatException可以将由“数字”字符组成的字符串转化为相应的基本数据类型。(2)可以使用String 类的下列类方法:public static String valueOf(byte n)public static String valueOf(int n)public static String valueOf(long n)public static String valueOf(float n)public static String valueOf(double n)将形如123、1232.98等数值转化为字符串,如:String str=String.valueOf(12313.9876);,6.3.4 实践环节,应用程序中的main方法中的参数args能接受用户从键盘键入的字符串。比如,假设主类是Application,如下使用解释器java.exe来执行主类(在主类的后面是空格分隔的若干个字符串):java Application 78.86 12 25 125 98 这时,程序中的args0、arg1、arg2、arg3和args4分别得到字符串“78.86”、“12”、“25”、“125”和“98”。上机调试下列代码,运行程序时,需要在命令行给出main方法中参数数组args每个单元中的字符串,例如:java Application 190 212 298 562 785 Application.java,6.4 正则表达式 6.4.1 核心知识_1,1正则表达式 一个正则表达式是含有一些具有特殊意义字符的字符串,这些特殊字符称作正则表达式中的元字符。1)用斜线格式构成元字符。比如,dcat中的d就是有特殊意义的元字符,代表0到9中的任何一个。表6.1列出了常用的元字符及其意义。2)用中括号格式构成的元字符。可以用方括号扩起若干个字符来表示一个元字符,该元字符代表方括号中的任何一个字符。例如regex=159ABC,那么1ABC、5ABC和9ABC都是和正则表达式regex匹配的字符串。3)元字符的修饰符。在正则表达式中可以使用限定修饰符。比如,对于限定修饰符:?,如果X代表正则表达式中的一个元字符或普通字符,那么X?就表示X出现0次或1次(X+表示X出现至少1次),例如:regex=hello2468?;那么hello,hello2,hello4,hello6和hello8都是与正则表达式regex匹配的字符串。表6.2给出了常用的限定修饰符的用法.,6.4.1 核心知识 _2,2字符串的替换 字符串对象调用:public String replaceAll(String regex,String replacement)方法返回一个字符串,该字符串是将当前字符串中所有和参数regex指定的正则表达式匹配的子字符串用参数replacement指定的字符串替换后的字符串,例如:String s=12hello567bird.replaceAll(a-zA-Z+,你好);那么s就是将12hello567bird中所有英文子串替换为你好后得到的字符串,即s是:12你好567你好。注:当前字符串调用replaceAll()方法返回一个字符串,但不改变当前字符串。,表6.1 元字符,表6.2 限定符,6.4.2 能力目标,能使用正则表达式以及replaceAll()方法返回一个字符串。,6.4.3 任务驱动,将Application6_6.java中的【代码】替换为程序代码。程序运行效果如图6.6。,任务 小结,由于“.”代表任何一个字符,所以在正则表达式中如果想使用普通意义的点字符,必须使用.或用56表示普通意义的点字符.例如,任务中的【代码1】:0123456789.+;中的“.”就表示普通意义的“点”字符。,6.4.4 实践环节,上机调试下列程序掌握String类的split方法。Application6_7.java,6.5 分解字符串 6.5.1 核心知识,分析字符串并将字符串分解成可被独立使用的单词,这些单词叫做语言符号。当分析一个字符串并将字符串分解成可被独立使用的单词时,可以使用java.util包中的StringTokenizer类,该类有两个常用的构造方法:(1)StringTokenizer(String s)为字符串s构造一个分析器。使用默认的分隔标记,即空格符、换行符、回车符、Tab符、进纸符做分隔标记。(2)StringTokenizer(String s,String delim)为字符串s构造一个分析器。例如:StringTokenizer fenxi=new StringTokenizer(you are welcome);StringTokenizer fenxi=new StringTokenizer(you,are;welcome,;);称一个StringTokenizer对象为一个字符串分析器,一个分析器可以使用nextToken()方法逐个获取字符串中的语言符号,每当调用nextToken()时,都将在字符串中获得下一个语言符号,每当获取到一个语言符号,字符串分析器中的负责计数的变量的值就自动减一,该计数变量的初始值等于字符串中的单词数目。通常用while循环来逐个获取语言符号,常使用StringTokenizer类中的hasMoreTokens()方法和countTokens()方法。,6.5.2 能力目标,掌握怎样使用StringTokenizer对象分解一个字符串。,6.5.3 任务驱动,将下列Application6_8.java中的【代码】替换为程序代码。程序运行效果如图6.7。,任务 小结,在6.4的实践环节学习了怎样使用String类的split()方法分解字符串。本节学习的StringTokenizer类的nextToken()方法和String类的split()方法不同的是,nextToken()方法不使用正则表达式做分隔标记来分解字符串。,6.5.4 实践环节,下列代码使用StringTokenizer类,用左、右小括号、逗号或空格的任意组合做分隔标记,统计出字符串:you are welcome(thank you),nice to meet you中的单词数目,并单独输出这些单词。请上机调试代码,并编写代码统计你熟悉的英文句子中的单词。Application6_9.java,6.6 日期 6.6.1 核心知识_1,1Date类 使用Date类的无参数构造方法创建的对象可以获取本机的当前日期和时间,例如:Date nowTime=new Date();那么,当前nowTime对象中含有的日期、时间就是创建nowTime对象时的本地计算机的日期和时间。可以使用Date的带参数的构造方法:Date(long time)来创建一个Date对象,例如:Date date1=new Date(1000),date2=new Date(-1000);,6.6.1 核心知识 _2,2Calendar类 Calendar类在java.util包中。使用Calendar类的static方法getInstance()可以初始化一个日历对象,如:Calendar calendar=Calendar.getInstance();然后,calendar对象可以调用方法:public final void set(int year,int month,int date)public final void set(int year,int month,int date,int hour,int minute)public final void set(int year,int month,int date,int hour,int minute,int second)将日历翻到任何一个时间,当参数year取负数时表示公元前。calendar对象调用方法public int get(int field)可以获取有关年份、月份、小时、星期等信息,参数field的有效值由Calendar的静态常量指定,例如:calendar.get(Calendar.MONTH);返回一个整数,如果该整数是0表示当前日历是在一月,该整数是1表示当前日历是在二月等。calendar.get(Calendar.DAY_OF_WEEK);返回一个整数,如果该整数是1表示星期日,如果是2表示是星期一,依次类推,如果是7表示是星期六。日历对象调用public long getTimeInMillis()可以将时间表示为毫秒。,6.6.2 能力目标,能使用Date类或Calendar类处理和日期相关的问。,6.6.3 任务驱动,将下列Application6_10.java中的【代码】替换为程序代码。OutputTime.java 程序运行效果如图6.8。,任务 小结,(1)如果希望按着某种习惯来输出时间,比如时间的顺序 年 月 星期 日 或 年 月 星期 日 小时 分 秒。可以使用java.text包中的DateFormat的子类.(2)SimpleDateFormat有一个常用构造方法:public SimpleDateFormat(String pattern);可以用参数pattern指定的格式创建一个对象,该对象调用:public String format(Date date)方法格式化时间对象date。(3)pattern是由普通字符和一些称作格式符组成的字符序列。例如,设pattern=yyyy-MM-dd。(4)format方法在格式化date时,将用date中的相应的时间替换相应的格式符,简单地说,,format方法返回的字符串就是把pattern中的格式符用相应时间替换后的字符序列。,6.6.4 实践环节,上机调试下列代码,了解时间的格式化。Application6_11.java,6.7 数学公式 6.7.1 核心知识_1,1Math类 java.lang包中的Math类包含许多用来进行科学计算的类方法,这些方法可以直接通过类名调用。另外,Math类还有两个静态常量E(PI(以下是Math类的常用类方法:public static long abs(double a)返回a的绝对值。public static double max(double a,double b)返回a、b的最大值。public static double min(double a,double b)返回a、b的最小值。public static double random()产生一个0到1之间的随机数(不包括0和1)。public static double pow(double a,double b)返回a的b次幂。public static double sqrt(double a)返回a的平方根。public static double log(double a)返回a的对数。public static double sin(double a)返回a的正弦值。public static double asin(double a)返回a的反正弦值。,6.7.1 核心知识 _2,2Random类 Java提供了更为灵活的用于获得随机数的Random类,该类在java.util包中.。使用Random类的如下构造方法:public Random();和 public Random(long seed);创建Random对象,其中第二个构造方法使用参数seed指定的种子创建一个Random对象。人们习惯地将Random对象称为随机数生成器。例如,下列随机数生成器random调用不带参数的nextInt()方法返回一个随机整数:Random random=new Random();random.nextInt();如果想让随机数生成器random返回一个0至n之间(包括0,但不包括n)的随机数,可以让random调用带参数的nextInt(int m)方法(参数m必须取正整数值),例如,random.nextInt(100);返回一个0至100之间的随机整数。如果程序需要随机得到true和false两个表示真和假的boolean值,可以让random调用nextBoolean()方法,例如random.nextBoolean();返回一个随机boolean值。,6.7.2 能力目标,掌握常用数学公式以及怎样获得随机数。,6.7.3 任务驱动,将下列Application6_12.java 中的【代码】替换为程序代码 程序运行效果如图6.9,任务 小结,正弦等方法的参数是double类型,其代表的意义是弧度,不是“角度”,例如,要计算正弦90度的结果,那么给参数的值必须是/2。,6.7.4 实践环节,当需要处理大整数时,可以使用java.math包中提供的BigInteger类。public BigInteger(String val)构造一个十进制的BigInteger对象。该构造方法可以发生NumberFormatException异常,也就是说,字符串参数val中如果含有非数字字符就会发生NumberFormatException异常。上机调试下列代码,了解BigInteger类。Application6_13.java,6.8 可变字符串 6.8.1 核心知识,String类创建的字符串对象是不可修改的。StringBuffer类能创建可修改的字符串序列,该类的对象的实体的内存空间可以自动的改变大小,便于存放一个可变的字符序列,一个StringBuffer对象调用append方法可以追加字符序列,例如:StringBuffer s=new StringBuffer(我喜欢);对象s可调用append方法追加一个字符串序列s.append(玩篮球);使得s中的字符序列是我喜欢玩篮球.public char charAt(int n)方法得到参数n指定的位置上的单个字符。当前对象实体中的字符串序列的第一个位置为0,第二个位置为1,依次类推。setCharAt(int n,char ch)将当前StringBuffer对象实体中的字符串位置n处的字符用参数ch指定的字符替换。StringBuffer insert(int index,String str)方法将参数str指定的字符串插入到参数index指定的位置。delete(int startIndex,int endIndex)从当前StringBuffer对象实体中的字符串中删除一个子字符串,并返回当前对象的引用。这里startIndex指定了需删除的第一个字符的下标,而endIndex指定了需删除的最后一个字符的下一个字符的下标。,6.8.2 能力目标,使用StringBuffer类创建可变字符串,并修改创建的可变字符串。,6.8.3 任务驱动,将下列Application6_14.java中的【代码】替换为程序代码。程序运行效果如图6.10。,任务 小结,可以使用String类的构造方法String(StringBuffer bufferstring)创建一个字符串对象,即将一个可变字符串转化为不可变的字符串。,6.9 小结,1掌握String类的常用方法。2使用StringTokenizer分析字符串,获取字符串中被分隔符分隔的单词。3当程序需要处理时间时,使用Date类和Calendar类。4如果需要处理特别大的整数,使用BigInteger类。5掌握String类的和StringBuffer类的不同,以及二者之间的联系。,“本节结束咯偶都会了太葱明了”,