第八章
主要内容
-
String类
-
Java专门提供了用来处理字符序列的String类。
-
String类在java.lang包中,由于java.lang包中的类被默认引入,因此程序可以直接使用String类。
-
需要注意的是Java把String类声明为final类,因此用户不能扩展String类,即String类不可以有子类。
-
构造字符串对象
-
常量对象:字符串常量对象是用双引号括起的字符序列,例如:“你好”、“12.97”、"boy"等。
- Java把用户程序中的String常量放入常量池。因为String常量是对象,所以也有自己的引用和实体,如图8.1所示。例如String常量对象"你好"的引用是12AB,实体里是字符序列:你好。
- 可以这样简单的理解常量池:常量池中的数据在程序运行期间再也不允许改变
-
String对象
- 可以使用String类声明对象并创建对象,例如:
String s = new String("we are students"); String t = new String("we are students");
- 可以使用String类声明对象并创建对象,例如:
-
引用String常量
- String常量是对象,因此可以把String常量的引用赋值给一个String对象,
-
-
-
StringTokenizer类
-
本节学习怎样使用StringTokenizer对象分解String对象的字符序列。
-
StringTokenizer类在java.util包中,有两个常用的构造方法:
- StringTokenizer(String s):
- 为String对象s构造一个分析器。使用默认的分隔标记,即空格符、换行符、回车符、Tab符、进纸符做分隔标记。
- StringTokenizer(String s, String delim
- 为String对象s构造一个分析器。参数delim的字符序列中的字符的任意排列被作为分隔标记。
- StringTokenizer(String s):
-
具体使用步骤
- StringTokenizer对象称作一个字符串分析器可以使用下列方法:
- nextToken():逐个获取字符串中的语言符号(单词),字符串分析器中的负责计数的变量的值就自动减一 。
- hasMoreTokens():只要字符串中还有语言符号,即计数变量的值大于0,该方法就返回true,否则返回false。
- countTokens():得到分析器中计数变量的值。
-
例如:
StringTokenizer fenxi = new StringTokenizer(“you#are##welcome”, "#");
如果指定字符#和字符是分隔标记,那么字符#和字符的任意排列,比如,####就是一个分隔标记,即"You#are#welcome"和"You*#are*#*#welcome"都有三个单词,分别是we,are和welcome。
-
Scanner类
- 使用Scanner类从字符串中解析程序所需要的数据。
- Scanner对象可以解析字符序列中的单词,例如,对于String对象NBA
String NBA = "I Love This Game"; ```
- 为了解析出NBA的字符序列中的单词,可以如下构造一个Scanner对象。
Scanner scanner = new Scanner(NBA);
- Scanner对象可以调用方法
- useDelimiter(正则表达式);
- 将正则表达式作为分隔标记,即让Scanner对象在解析操作时,把与正则表达式匹配的字符序列作为分隔标记。如果不指定分隔标记,那么Scanner对象默认地用空白字符:空格,制表符,回行符作为分隔标记来解析String对象的字符序列中的单词。
- 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()方法返回该非数字化单词。
- 使用正则表达式作为分隔标记解析字符串
- Scanner对象可以调用 useDelimiter(正则表达式);
- 方法将一个正则表达式作为分隔标记,即和正则表达式匹配的字符串都是分隔标记。
-
StringBuffer类
- StringBuffer类的对象的实体的内存空间可以自动地改变大小,便于存放一个可变的字符序列。比如,对于:
StringBuffer s = new StringBuffer("我喜欢");
- 对象s可调用append方法追加一个字符序列
- StringBuffer类的对象的实体的内存空间可以自动地改变大小,便于存放一个可变的字符序列。比如,对于:
-
Date与Calendar类
-
Date类
- Date类在java.util包中.
- Date类的构造方法之一:
- Date()使用Date类的无参数构造方法创建的对象可以获取本地当前时间。
例: Date nowTime=new Date();
- Date()使用Date类的无参数构造方法创建的对象可以获取本地当前时间。
- 当前nowTime对象中含有的日期、时间就是创建nowTime对象时的本地计算机的日期和时间。
- 例如,假设当前时间是:2011年3月10日23:05:32(CST时区),那么System.out.println(nowTime); 输出结果是:Thu Mar 10 23:05:32 CST 2011。
- Date对象表示时间的默认顺序是:星期、月、日、小时、分、秒、年。
-
Calendar类
- 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)
- 其作用是将日历翻到任何一个时间
-
-
日期格式化
- format方法
- Formatter类的format方法:
- format(格式化模式, 日期列表)
- 按着“格式化模式”返回“日期列表”中所列各个日期中所含数据(年,月,日,小时等数据)的字符串表示。
- Java已经将format方法做为了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方法
-
Math、BigInteger与Random类
-
Math类
- Math类在java.lang包中。Math类包含许多用来进行科学计算的类方法,这些方法可以直接通过类名调用。另外,Math类还有两个静态常量,它们分别是:
- E 2.7182828284590452354
- PI 3.14159265358979323846
- 以下是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) 返回反正弦值。
- Math类在java.lang包中。Math类包含许多用来进行科学计算的类方法,这些方法可以直接通过类名调用。另外,Math类还有两个静态常量,它们分别是:
-
BigInteger类
- java.math包中的BigInteger类提供任意精度的整数运算。可以使用构造方法:
public BigInteger(String val) 构造一个十进制的BigInteger对象。
- 以下是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 pow(int a) 返回当前大整数对象的a次幂。 public String toString() 返回当前大整数对象十进制的字符串表示。 public String toString(int p) 返回当前大整数对象p进制的字符串表示。
- java.math包中的BigInteger类提供任意精度的整数运算。可以使用构造方法:
-
Random类
- 复习:
- 使用Math类调用其类方法random()返回一个0至1之间的随机数(不包括0和1)。例如,下列代码得到1至100之间的一个随机整数(包括1和100), (int)(Math.random()*100)+1;
- 新内容:
- Java提供了更为灵活的用于获得随机数的Random类(该类在java.util包中)。 Random类的如下构造方法:
public Random(); public Random(long seed);//使用参数seek指定的种子创建一个Random对象
- 随机数生成器random调用不带参数的nextInt()方法:
Random random=new Random(); random.nextInt();
- 返回一个0至n之间(包括0,但不包括n)的随机数 随机数生成器random调用带参数的nextInt(int m)方法(参数m必须取正整数值)
random.nextInt(100);//返回一个0至100之间的随机整数(包括0,但不包括100)。 //随机得到true和false两个表示真和假的boolean值, //随机数生成器random调用nextBoolean()方法 random.nextBoolean();//返回一个随机boolean值。
- Java提供了更为灵活的用于获得随机数的Random类(该类在java.util包中)。 Random类的如下构造方法:
- 复习:
-
-
数字格式化
- Formatter 类_1
-
Formatter类提供了一个和C语言printf函数类似的format方法:
format(格式化模式,值列表)
-
该方法按着“格式化模式”返回“值列表”的字符串表示。
-
Java已经将format方法做为了String类的静态方法,因此,程序可以直接使用String类调用format方法对数字进行格式化。
-
格式化模式
- format方法中的“格式化模式”是一个用双引号括起的字符序列(字符串),该字符序列中的字符由格式符和普通字符所构成。
- 例如:"输出结果%d,%f,%d"中的%d和%f是格式符号 .
- format方法返回的字符串就是“格式化模式”中的格式符被替换为它得到的格式化结果后的字符串。
- 例如:
- String s = String.format(“%.2f”,3.141592);
- 那么s就是“3.14”.
-
值列表
- format方法中的“值列表”是用逗号分隔的变量、常量或表达式。
- 例如:
- String s=format("%d元%0.3f公斤%d台",888,999.777666,123);
- 那么,s就是"888元999.778公斤123台"。
-
格式化顺序
- format方法默认按从左到右的顺序使用“格式化模式”中的格式符来格式化“值列表”中对应的值,而“格式化模式”中的普通字符保留原样。
- 例如,
- 假设int型变量x和double型变量y的值分别是888和3.1415926,
- 那么对于String s = format(“从左向右:%d,%.3f,%d”,x,y,100);
- 字符串s就是:从左向右:888,3.142,100
- 注1:
- 改变默认的顺序(从左向右)进行格式化,在格式符前面添加索引符号index , 例 如 , 1 ,例如,1 ,例如,1表示“值列表”中的第1个,2$表示“值列表”中的第2个,
- 对于:String s=String.format(“不是从左向右:%2 . 3 f , .3f,%3 .3f,d,%1$d”,x,y,100);
- 字符串s就是 不是从左向右:3.142,100,888
- 注2:
- 如果准备在“格式化模式”中包含普通的%,在编写代码时需要连续键入两个%,
- 如:
- String s = String.format("%d%%",89);
- 输字符串s是:“89%”
-
- Formatter 类_1
-
Class类与Console类
-
class类
- 使用Class的类方法得到一个和某类(参数className指定的类)相关的Class对象,
public static Class forName(String className) throws ClassNotFoundException
- 上述方法返回一个和参数className指定的类相关的Class对象。如果类在某个包中,className必须带有包名,例如, className=“java.util.Date”。
- 使用Class的类方法得到一个和某类(参数className指定的类)相关的Class对象,
-
步骤1中获得的Class对象调用
public Object newInstance() throws Exception,
方法就可以得到一个className类的对象 -
要特别注意的是:使用Class对象调用newInstance()实例化一个className类的对象时,className类必须有无参数的构造方法。
-
console类
- 如果希望在键盘输入一行文本,但不想让该文本回显,即不在命令行显示,那么就需要使用java.io包中的Console类的对象来完成。首先使用System类调用console()方法返回一个Console类的一个对象,比如cons:
- Console cons = System.console();
- 然后,cons调用readPassword()方法读取用户在键盘输入的一行文本,并将文本以一个char数组返回:
- char[] passwd = cons.readPassword();
-
-
Pattern与Match类
-
Java提供了专门用来进行模式匹配的Pattern类和Matcher类,这些类在java.util.regex包中。
-
以下结合具体问题来讲解使用Pattern类和Matcher类的步骤。假设有字符串:
String input = "hello,good morning,this is a good idea"
-
我们想知道input从哪个位置开始至哪个位置结束曾出现了字符串good。
-
使用Pattern类和Matcher类检索字符串str中的子字符串的
-
步骤如下:
- 建立模式对象
- 使用正则表达式regex做参数得到一个称为模式的Pattern类的实例pattern:
例如: String regex = "good"; Pattern pattern = Pattern.compile(regex);
- 模式对象是对正则表达式的封装。Pattern类调用类方法compile(String regex)返回一个模式对象,其中的参数regex是一个正则表达式, 称为模式对象使用的模式。
- 使用正则表达式regex做参数得到一个称为模式的Pattern类的实例pattern:
- 得到匹配对象
- 模式对象pattern调用matcher(CharSequence input)方法返回一个Matcher对象matcher,称为匹配对象
- Matcher matcher = pattern.matcher(input);
- Matcher对象matcher可以使用下列方法寻找字符串input中是否有和模式regex匹配的子序列(regex是创建模式对象pattern时使用的正则表达式)。
public boolean find():寻找input和regex匹配的下一子序列,如果成功该方法返回true,否则返回false。 public boolean matches():matcher调用该方法判断input是否完全和regex匹配。 public boolean lookingAt():matcher调用该方法判断从input的开始位置是否有和regex匹配的子序列。 public boolean find(int start) : matcher调用该方法判断input从参数start指定位置开始是否有和regex匹配的子序列 。 public String replaceAll(String replacement) matcher调用该方法可以返回一个字符串,该字符串是通过把input中与模式regex匹配的子字符串全部替换为参数replacement指定的字符串得到的. public String replaceFirst(String replacement) matcher调用该方法可以返回一个字符串,该字符串是通过把input中第1个与模式regex匹配的子字符串替换为参数replacement指定的字符串得到的。
- 建立模式对象
-
重点和难点
-
重点:字符串的常用方法;字符串分析器使用;类Date和类Calendar以及类Math的使用
-
难点:字符串分析器的使用;各常用类的实际运用
总结
-
熟练掌握String类的常用方法。
public int length() //获取一个字符串的长度 public boolean equals(String s) //判断当前String对象的字符序列是否与参数s指定的String对象的字符序列相同 public boolean startsWith(String s) //判断当前String对象的字符序列前缀是否是参数指定的String对象s的字符序列 public int compareTo(String s) //按字典序与参数s指定的字符序列比较大小。 public boolean contains(String s) //String对象调用contains方法判断当前String对象的字符序列是否包含参数s的字符序列 public int indexOf (String str) //String对象调用方法从当前String对象的字符序列的0索引位置开始检索首次出现str的字符序列的位置,并返回该位置。如果没有检索到,该方法返回的值是–1,其 public String substring(int startpoint) //字符串对象调用该方法获得一个新的String对象,新的String对象的字符序列是复制当前String对象的字符序列中的startpoint位置至最后位置上的字符所得到的字符序列。String对象调用substring(int start ,int end)方法获得一个新的String对象,新的String对象的字符序列是复制当前String对象的字符序列中的start位置至end–1位置上的字符所得到的字符序列。 public String trim() //得到一个新的String对象,这个新的String对象的字符序列是当前String对象的字符序列去掉前后空格后的字符序列。
-
掌握String类的和StringBuffer类的不同,以及二者之间的联系。
- String对象的字符序列是不可修改的,也就是说,String对象的字符序列的字符不能被修改、删除,即String对象的实体是不可以再发生变化的,
- StringBuffer类的对象的实体的内存空间可以自动地改变大小,便于存放一个可变的字符序列。
-
使用
StringTokenizer
,Scannner
类分析字符串,获取字符串中被分隔符分隔的单词。StringTokenizer(String s) //为String对象s构造一个分析器。使用默认的分隔标记,即空格符、换行符、回车符、Tab符、进纸符做分隔标记。 StringTokenizer(String s, String delim) //为String对象s构造一个分析器。参数delim的字符序列中的字符的任意排列被作为分隔标记。 nextToken() //逐个获取字符串中的语言符号(单词),字符串分析器中的负责计数的变量的值就自动减一 。 hasMoreTokens() //只要字符串中还有语言符号,即计数变量的值大于0,该方法就返回true,否则返回false。 countTokens() //得到分析器中计数变量的值。
String NBA = "I Love This Game";
//为了解析出NBA的字符序列中的单词,可以如下构造一个Scanner对象。
Scanner scanner = new Scanner(NBA);
//Scanner对象可以调用方法
useDelimiter(正则表达式);
- 掌握Date类和Calendar类获取时间和日期的用法。
```java
Date nowTime=new Date();
//当前nowTime对象中含有的日期、时间就是创建nowTime对象时的本地计算机的日期和时间。
//例如,假设当前时间是:2011年3月10日23:05:32(CST时区),
//那么System.out.println(nowTime);
//输出结果是:Thu Mar 10 23:05:32 CST 2011。
//Date对象表示时间的默认顺序是:星期、月、日、小时、分、秒、年。
Date(long time) //使用long型参数创建指定的时间
public long currentTimeMillis() //获取系统当前时间。
//使用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)
//calendar对象可以调用方法:
public long getTimeInMillis() //可以将时间表示为毫秒。
public final void setTime(Date date) //使用给定的 Date 设置此 Calendar 的时间
public int get(int field) //可以获取有关年份、月份、小时、星期等信息
-
如果需要处理特别大的整数,使用BigInteger类。
//java.math包中的BigInteger类提供任意精度的整数运算。可以使用构造方法: public BigInteger(String val) //构造一个十进制的BigInteger对象。 //以下是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 pow(int a) //返回当前大整数对象的a次幂。 public String toString() //返回当前大整数对象十进制的字符串表示。 public String toString(int p) //返回当前大整数对象p进制的字符串表示。
-
当需要格式化日期和数字时使用相关的格式化类及方法。
//Formatter类的format方法: format(格式化模式, 日期列表) //按着“格式化模式”返回“日期列表”中所列各个日期中所含数据(年,月,日,小时等数据)的字符串表示。 //Java已经将format方法做为了String类的静态方法,因此,程序可以直接使用String类调用format方法对日期进行格式