java面向对象程序设计第2版第9章-常用实用类.ppt
1,Java面向对象程序设计第2版 第9章,配合第2版 例子源代码一起使用,Power point 制作:耿祥义 张跃平,常用实用类,2,导读,3,9.1 String类,java.lang包中的String类来创建一个字符串变量,字符串变量是对象。,4,9.1.1 构造字符串对象,1常量对象:字符串常量对象是用双引号括起的字符序列,例如:你好、12.97、boy等。2字符串对象 声明:String s;String类较常用构造方法:String(s),String(char a),String(char a,int startIndex,int count)3引用字符串常量对象 string s1=how are you;,5,9.1.2 String 类的常用方法,1public int length():获取一个字符串的长度 2public boolean equals(String s):比较当前字符串对象的实体是否与参数s指定的字符串的实体相同 例题9-13public boolean startsWith(String s)public boolean endsWith(String s)方法:判断当前字符串对象的前缀(后缀)是否是参数s指定的字符串 4public boolean regionMatches(int firstStart,String other,int ortherStart,int length):从当前字符串参数firstStart指定的位置开始处,取长度为length的一个子串,并将这个子串和参数other指定的一个子串进行比较。例题9-2 其重载方法:public boolean regionMatches(boolean b,int firstStart,String other,int ortherStart,int length)5public int compareTo(String s):按字典序与参数s指定的字符串比较大小 其相关方法:public int compareToIgnoreCase(String s)例题9-3 6.public boolean contains(String s):判断当前字符串对象是否含有参数指定的字符串s 7.public int indexOf(String s):从当前字符串的头开始检索字符串s,并返回首次出现s的位置,其相关方法:indexOf(String s,int startpoint),lastIndexOf(String s)8public String substring(int startpoint):获得一个当前字符串的子串 其相关方法:substring(int start,int end)9public String trim():得到一个s去掉前后空格后的字符串对象。例题9-4,6,符串与基本数据的相互转化,java.lang包中的Integer类调用其类方法:public static int parseInt(String s)可以将由“数字”字符组成的字符串,如12356,转化为int型数据,例如:int x;String s=123456;x=Integer.parseInt(s);类似地,使用java.lang包中的Byte、Short、Long、Float、Double类调相应的类方法可以将由“数字”字符组成的字符串,转化为相应的基本数据类型。可以使用String 类的类方法public static String valueOf(byte n)等将形如123、1232.98等数值转化为字符串。可以使用Long类中的类方法public static String toBinaryString(long i)等得到整数的各种进制的字符串表示。例题9-5 注 应用程序中的main方法中的参数args能接受用户从键盘键入的字符串。比如,使用解释器java.exe来执行主类 C:2000java Example9_5 12.89 35 78这时,程序中的args0,arg1,arg2分别得到字符串12.89,35和78。,7,9.1.4 对象的字符串表示,Object类有一个public String toString()方法,一个对象通过调用该方法可以获得该对象的字符串表示。一个对象调用toString()方法返回的字符串的一般形式为:创建对象的类的名字对象的引用的字符串表示 例题9-6,8,9.1.5 字符串与字符、字节数组,1字符串与字符数组 String 类的构造方法:String(char)和String(char,int offset,int length)分别用字符数组中的全部字符和部分字符创建字符串对象 String类提供了将字符串存放到数组中的方法:public void getChars(int start,int end,char c,int offset)将字符串中的全部字符存放在一个字符数组中的方法:public char toCharArray()例题9-72字符串与字节数组 String(byte)用指定的字节数组构造一个字符串对象。String(byte,int offset,int length)用指定的字节数组的一部分,即从数组起始位置offset开始取length个字节构造一个字符串对象。public byte getBytes()方法使用平台默认的字符编码,将当前字符串转化为一个字节数组。public byte getBytes(String charsetName)使用参数指定字符编码,将当前字符串转化为一个字节数组。例题9-8,9,9.1.6 正则表达式及字符串的替换与分解,1正则表达式 一个正则表达式是含有一些具有特殊意义字符的字符串,这些特殊字符称作正则表达式中的元字符。比如“dhello”中的d就是有特殊意义的元字符,代表0到9中的任何一个。字符串对象调用 public boolean matches(String regex)方法可以判断当前字符串对象是否和参数regex指定的正则表达式匹配。参考表9.1,表9.2。2字符串的替换 字符串对象调用public String replaceAll(String regex,String replacement)方法返回一个字符串,该字符串是当前字符串中所有和参数regex指定的正则表达式匹配的子字符串被参数replacement指定的字符串替换后的字符串,例如:String result=12hello567.replaceAll(d+,你好);那么result就是:“你好hello你好”例题9-93字符串的分解 字符串调用public String split(String regex)使用参数指定的正则表达式regex做为分隔标记分解出其中的单词,并将分解出的单词存放在字符串数组中。例如,对于字符串:str=“1931年09月18日晚,日本发动侵华战争,请记住这个日子!”;使用正则表达式:String regex=D+;做为分隔标记分解出str中的单词String digitWord=str.split(regex);例题9-10那么,digitWord0、digitWord1和digitWord2就分别是1931、09和18。,10,9.2 StringBuffer类 9.2.1 StringBuffer对象的创建,String s=new String(我喜欢学习);StringBuffer buffer=new StringBuffer(“我喜欢学习”);buffer.append(数学);,StringBuffer类有三个构造方法:1StringBuffer()2StringBuffer(int size)3StringBuffer(String s)例题9-11,11,9.2.2 StringBuffer类的常用方法,1StringBuffer append(String s):将一个字符串对象追加到当前StringBuffer对象中 StringBuffer append(int n):将一个int型数据转化为字符串对象后再追加到当前StringBuffer对象中 StringBuffer append(Object o):将一个Object对象的字符串表示追加到当前StringBuffer对象中 类似的方法还有:StringBuffer append(long n),StringBuffer append(boolean n),StringBuffer append(float n),StringBuffer append(double n),StringBuffer append(char n)2public chat charAt(int n):得到参数n指定的置上的单个字符 public void setCharAt(int n,char ch):将当前StringBuffer对象实体中的字符串位置n处的字符用参数ch指定的字符替换3StringBuffer insert(int index,String str):将参数str指定的字符串插入到参数index指定的位置 4public StringBuffer reverse():将该对象实体中的字符翻转5StringBuffer delete(int startIndex,int endIndex):从当前StringBuffer对象实体中的字符串中删除一个子字符串 其相关方法:deleteCharAt(int index)删除当前StringBuffer对象实体的字符串中index位置处的一个字符。6.StringBuffer replace(int startIndex,int endIndex,String str):将当前StringBuffer对象实体中的字符串的一个子字符串用参数str指定的字符串替换 例题9-12,12,9.3 StringTokenizer类,StringTokenizer类在java.util包中,有两个常用的构造方法:StringTokenizer(String s):为字符串s构造一个分析器。使用默认的分隔标记,即空格符(若干个空格被看做一个空格)、换行符、回车符、Tab符、进纸符。StringTokenizer(String s,String delim):为字符串s构造一个分析器。参数dilim中的字符被作为分隔标记。StringTokenizer对象称作一个字符串分析器可以使用下列方法:nextToken():逐个获取字符串中的语言符号(单词),字符串分析器中的负责计数的变量的值就自动减一。hasMoreTokens():只要字符串中还有语言符号,即计数变量的值大于0,该方法就返回true,否则返回false。countTokens():得到分析器中计数变量的值。例题9-13 例题9-14,13,9.4 Scanner类,使用默认分隔标记解析文件 创建Scanner对象,并将要解析的字符串传递给所构造的对象例如,对于字符串 String s=telephone cost 876 dollar.Computer cost 2398.89 dollar.;为了解析出s中的单词,可以如下构造一个Scanner对象:Scanner scanner=new Scanner(s);那么scanner默认地使用空格做为分隔标记来解析字符串中的单词。也可以让Scanner Scanner对象调用方法:useDelimiter(正则表达式);将正则表达式做为分隔标记,即Scanner对象在解析字符串时,把与正则表达式匹配的字符串做为分隔标记。例题9-15,Scanner对象解析字符串的特点如下:scanner调用next()方法依次返回被解析的字符串s中的单词,如果s最后一个单词已被next()方法返回,scanner调用hasNext()将返回false,否则返回true。对于被解析的字符串s中的数字型的单词,比如876,2398.89等,scanner可以用nextInt()或nextDouble()方法来代替next()方法,即scanner可以调用nextInt()或nextDouble()方法将数字型单词转化为int或double数据返回。如果单词不是数字型单词,scanner调用nextInt()或nextDouble()方法将发生InputMismatchException异常,在处理异常时可以调用next()方法返回该非数字化单词。,14,9.5 Date和Clendar类 9.5.1 Date对象,Date类在java.util包中。使用Date类的无参数构造方法创建的对象可以获取本地当前时间。计算机时间的“公元”设置在1970.年1月1日0时(格林威治时间),可以根据这个时间使用Date的带参数的构造方法:Date(long time)例:Date date1=new Date(1000),date2=new Date(-1000);date1就是1970年01月01日08时00分01秒、date2就是1970年01月01日07时59分59秒 可以用System类的静态方法 public long currentTimeMillis()获取系统当前时间,如果运行Java程序的本地时区是北京时区,这个时间是从1970年1月1日08点到目前时刻所走过的毫秒数。Date对象表示时间的默认顺序是:星期、月、日、小时、分、秒、时区,年。例如:Tue Mar 12 10:13:58 CST 2013。,15,9.5.2 Calendar对象,1 Calendar类在java.util包中。使用Calendar类的static方法 getInstance()可以初始化一个日历对象,如:Calendar calendar=Calendar.getInstance();2 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)将日历翻到任何一个时间 3 calendar对象常用方法 public int get(int field):可以获取有关年份,月份,小时,星期等信息 例如 calendar.get(Calendar.MONTH);calendar.get(DAY_OF_WEEK);public long getTimeInMillis():可以将时间表示为毫秒。例题9-16,例题9-17,16,9.5.3 日期格式化 1 使用SimpleDateFormat类,使用java.util包中的DateFormat的子类SimpleDateFormat类来实现日期的格式化。SimpleDateFormat有一个常用构造方法:public SimpleDateFormat(String pattern);该构造方法可以用参数pattern指定的格式创建一个对象,该对象调用:public String format(Date date)方法格式化时间对象date。pattern是由普通字符和一些称作格式符所组成的字符序列。format 方法在格式化date时,将用date中的相应的时间替换相应的格式符,简单地说,,format方法返回的字符串就是把pattern中的格式符用相应时间替换后的字符序列。例题9-18,17,2 format方法,可以使用更为方便的Formatter类,Formatter类的format方法:format(格式化模式,日期列表)按着“格式化模式”返回“日期列表”中所列各个日期中所含数据(年,月,日,小时等数据)的字符串表示。目前Java已经将format方法封装到String类中,是String类的的一个静态方法,因此程序可以直接使用String类调用format方法对日期进行格式化。格式化模式 format方法中的“格式化模式”是一个用双引号括起的字符序列(字符串),该字符序列中的字符由时间格式符和普通字符所构成。如日期:%ty-%tm-%td例如:String s=String.format(%tY年%tm月%td日,new Date(),new Date(),new Date();那么s就是2011年02月10日 日期列表 format方法中的“日期列表”可以是用逗号分隔的Calendar对象或Date对象。要保证format方法“格式化模式”中的格式符的个数与“日期列表”中列出的日期个数相同。format方法默认按从左到右的顺序使用“格式化模式”中的格式符来格式“日期列表”中对应的日期,而“格式化模式”中的普通字符保留原样。,18,3 格式化同一日期,希望用几个格式符号来格式化“日期列表”中的同一个日期,可以在“格式化模式”中使用“”,比如:%ty-%tm-%td中的三个格式符将会格式化同一日期,即含有“”的格式符和它前面的格式符一同格式化同一个日期,例如:String s=String.format(%ty年%tm月%td日,new Date();那么%tm和%td都格式化new Date(),因此字符串s就是:11年02月10日。以下是常用的日期格式符及作用:%tY 将日期中的“年”格式化为4位形式,例如,1999,2002。%ty 将日期中的“年”格式化为2位形式(带前导零),例如,99,02。%tm 将日期中的“月”格式化为2位形式(带前导零),即01-13,其中01是一年的第一个月(13是支持阴历所需的一个特殊值)。等等。,19,9.5.4 不同区域的星期格式,不同国家的星期的简称或全称有很大的不同,例如美国用Thu(Thursday)简称(全称)星期四、日本用“木”(木曜日)简称(全称)星期四,意大利用gio(gioved)简称(全称)星期四等。如果想用特定地区的星期格式来表示日期中的星期,可以用format的重载方法:format(Locale locale,格式化模式,日期列表);其中的参数locale是一个Locale类的实例,用于表示地域。Locale类的static常量都是Locale对象,其中US是表示美国的static常量。比如,假设时间是2015年3月12日,该日是星期四,如果format方法中的参数local取值:Locale.US,那么%tA得到的结果就是Thursday,如果format方法中的参数local取值:Locale.JAPAN,那么%tA得到的结果就是木曜日。注:如果format方法不使用Locale参数格式化日期,当前应用程序所在系统的地区设置是中国,那么相当于locale参数取Locale.CHINA。例题9-19,20,9.6 Math、BigInteger和Random类 9.6.1 Math类,Math类在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)返回正弦值。*public static double asin(double a)返回反正弦值。,21,9.6.2 BigInteger类,1 java.math包中的BigInteger类提供任意精度的整数运算。可以使用构造方法:public BigInteger(String val)构造一个十进制的BigInteger对象。2 以下是BigInteger类的常用类方法:*public BigInteger add(BigInteger val)返回当前大整数对象与参数指定的大整数对象的和。*public BigInteger subtract(BigInteger val)返回当前大整数对象与参数指定的大整数对象的差。*public BigInteger multiply(BigInteger val)返回当前大整数对象与参数指定的大整数对象的积。*public BigInteger divide(BigInteger val)返回当前大整数对象与参数指定的大整数对象的商。*public BigInteger remainder(BigInteger val)返回当前大整数对象与参数指定的大整数对象的余。*public int compareTo(BigInteger val)返回当前大整数对象与参数指定的大整数的比较结果,返回值是1、-1或0,分别表示当前大整数对象大于、小于或等于参数指定的大整数。*public BigInteger abs()返回当前大整数对象的绝对值。*public BigInteger pow(int a)返回当前大整数对象的a次幂。*public String toString()返回当前大整数对象十进制的字符串表示。*public String toString(int p)返回当前大整数对象p进制的字符串表示。例题9-20,22,9.6.3 Romdom类,可以使用Math类调用其类方法random()返回一个0至1之间的随机数(不包括0和1),例如,下列代码得到1至100之间的一个随机整数(包括1和100):(int)(Math.random()*100)+1;Java提供了更为灵活的用于获得随机数的Romdom类(该类在java.util包中)。使用Romdom类的如下构造方法:public Random();public Random(long seed);创建Rondom对象,其中第二个构造方法使用参数seed指定的种子创建一个Rondom对象。习惯地将Rondom对象称为随机数生成器。例如下列随机数生成器random调用不带参数的nextInt()方法返回一个随机整数:Random random=new Random();random.nextInt();相关方法及使用:nextInt(int m)方法,例如 random.nextInt(100);返回一个0至100之间的随机整数(包括0,但不包括100)。nextBoolean()方法,例如random.nextBoolean();返回一个随机boolean值。,23,9.7 DecimalFormat类,DecimalFormat类在java.text包中。可以用DecimalFormat类对输出的数字结果进行必要的格式化。,24,9.7.1 格式化数字,1 格式化整数位和小数位 DecimalFormat对象调用:public final String format(double number);对参数指定的数字进行格式化,并将格式化结果以String对象返回。例如:DecimalFormat format=new DecimalFormat(00000.00);那么 String result=format.format(6789.8765);得到的result是:“06789.88”2 整数位的分组 当希望将数字的整数部分分组(用逗号分隔),可以在DecimalFormat对象中的例如:将“123456789.9876543”的整数部分按4位分组的一个格式化模式是:“#,#,#,#00.00”使用该模式格式化上述数字的结果是:1,2345,6789.99 3 格式化为百分数或千分数 在DecimalFormat对象中的数字格式化模式尾加“%”,可以将数字格式化为百分数、尾加“u2030”将数字格式化为千分数。4 格式化为科学计数 在DecimalFormat对象中的数字格式化模式尾加“E0”,可以将数字格式化为科学计数。5 格式化为货币值 在DecimalFormat对象中的数字格式化模式尾加货币符号,例如“$”“¥”,可以将数字格式化为带货币符号的串。,25,9.7.2 将格式化字符串转化为数字,根据要转化的字符串创建一个DecimalFormat对象,并将适合该字符串的格式化模式传递给该对象,例如:DecimalFormat df=new DecimalFormat(#,#00.000$);那么,df调用parse(String s)方法将返回一个Number对象,例如:Number num=df.parse(3,521,563.345$);那么,Number对象调用方法可以返回该对象中含有的数字,例如:double d=number.doubleValue();d的值是3521563.345。例题9-21,26,9.8 Pattern与Match类,Java提供了专门用来进行模式匹配的Pattern类和Match类,这些类在包中。,27,9.8.1 模式对象,1 使用Pattern类创建一个对象,称作模式对象,模式对象是对正则表达式的封装。2 Pattern类调用类方法compile(String regex)返回一个模式对象,其中的参数regex是一个正则表达式,称作模式对象使用的模式。例如 Pattern p=Ppile(hellod);3 Pattern类也可以调用类方法compile(String regex,int flags)返回一个Pattern对象。,28,9.8.2 匹配对象,模式对象p调用matcher(CharSequence input)方法返回一Matcher对象m,称作匹配对象。下列几个方法是Matcher对象m常用的方法:*public boolean find():寻找input和regex匹配的下一子序列*public boolean matches():判断input是否完全和regex匹配*public boolean lookingAt():判断从input的开始位置是否有和regex匹配的子序列public boolean find(int start):判断input从参数start指定位置开始是否有和regex匹配的子序列 public String replaceAll(String replacement):Matcher对象m调用该方法可以返回一个字符串 public String replaceFirst(String replacement):Matcher对象m调用该方法可以返回一个字符串 例题9-22,29,9.9 Class类,Class是java.lang包中的类,该类的实例可以帮助程序创建其他类的实例或者取得其他类的对象的内部信息。,30,9.9.1 使用Class实例化一个对象,创建对象最常用的方式就是使用new运算符和类的构造方法,实际上也可以使用Class对象得到某个类的实例。步骤如下:(1)使用Class的类方法得到一个和某类(参数className指定的类)相关的Class对象:public static Class forName(String className)throws ClassNotFoundException上述方法返回一个和参数className指定的类相关的Class对象。如果类在某个包中,className必须带有包名 例如,className=java.util.Date。(2)步骤(1)中获得的Class对象调用 public Object newInstance()throws InstantiationException,IllegalAccessException方法就可以得到一个className类的对象。要特别注意的是:使用Class对象调用newInstance()实例化一className类的对象时,className类必须有无参数的构造方法。在下面的例子23中,我们使用Class对象得到一个Rect类以及java.util包中Date类的的对象。例题9-23 例题9-24,31,9.9.2 获取类的有关信息,一个类被加载且创建对象时,和该类相关的一个类型为Calss的对象就会自动创建,任何对象调用getClass()方法都可以获取和该对象相关的一个Class对象,这个Class对象调用如下的方法可以获取对象的有关信息,比如,创建该对象的类的名字、类中的方法名称、成员变量的名称等等,Class对象经常调用的方法如下:*String getName()返回类的名字*Constructor getDeclaredConstructors()返回类的全部构造方法。*Field getDeclaredFields()返回类的全部成员变量。*Method getDeclaredMethods()返回类的全部方法。例子25中使用相应的Class对象列出了java.util包中Date类的全部成员变量和方法的名称。例题9-25,32,9.10 小结,1 熟练掌握String类的常用方法,这些方法对于有效的处理字符序列信息是非常重要的。2 掌握String类的和StringBuffer类的不同,以及二者之间的联系。3 使用StringTokenizer类可以分析字符串,获取字符串中被分隔符分隔开的单词。4 当程序需要处理时间时,使用Date类和Calendar类。5 如果需要处理特别大的整数,使用BigInteger类。6 当需要格式化数字时使用DecimalFormat类7 当需要模式匹配时使用Pattern和Match类,