201711671215《Java程序设计》第13周学习总结----补回第8章学习总结
教材学习内容总结
第8章:常用实用类
主要的常用类有 String类, StringTokenizer类, Scanner类, StringBuffer类, Date类与 Calendar类, Math类, BigInteger类, Random类,Class类与Console类,Pattern类与Match类。
重点:字符串的常用方法;字符串分析器使用;类Date和类Calendar以及类Math的使用。
难点:字符串分析器的使用;各常用类的实际运用。
一、String类
-Java专门提供了用来处理字符序列的String类。
-String类在java.lang包中,由于java.lang包中的类被默认引入,因此程序可以直接使用String类。
-需要注意的是Java把String类声明为final类,因此用户不能扩展String类,即String类不可以有子类。
1 构造String对象:(习惯的被翻译为字符串对象)
1.1 常量对象:字符串常量对象是用双引号括起的字符序列,例如:"你好"、"12.97"、"boy"等。
String常量是对象,有自己的引用和实体,如下图:
简单理解常量池:常量池中的数据在程序运行期间再也不允许改变。
1.2 String对象:使用String类声明对象并创建对象,例如:
String s = new String("we are students");
String t = new String("we are students");
上述两个对象s、t虽然有着一样的实体,但是他们的引用是不同的,即表达式s==t的值是false;
在编写程序时,用户无法输出String对象的引用:System.out.println(s); 输出的是对象的实体;
可以用一个已创建的String对象创建另一个String对象,如:String tom = new String(s);
-String类还有两个较常用的构造方法:
(1)String (char a[])用一个字符数组a创建一个String对象,如:
char a[] = {'J','a','v','a'};
String s = new String(a);
(2)String(char a[],int startIndex,int count) 提取字符数组a中的一部分字符创建一个String对象,参数startIndex和count分别指定在a中提取字符的起始位置和从该位置开始截取的字符个数,如:
char a[] = {'零','壹','贰','叁','肆','伍','陆','柒','捌','玖'};
String s = new String(a,2,4);
相当于 String s = new String("贰叁肆伍")。
1.3 引用Sting 常量
String常量是对象,可以把String常量的引用赋值给一个String对象,这时,两个对象具有相同的引用,表达式s1==s2的值为true;由于用户程序无法知道常量池中“你好”的引用,s1是用户声明的String对象,s1中的值是可以被改变的,如果再进行s1 = “boy”,那么s1中的值将发生变化。
2 字符串并置
String对象可以用“+”进行并置运算,即首尾相接得到一个新的String对象,例如:
String you = "你";
String hi = "好";
String testOne;
testOne = you+shi;
如果是两个常量进行并置运算,那么得到的仍然是常量,如果常量池没有这个常量就放入常量池。"你"+"好"的结果就是常量池中的"你好";参与并置运算的String对象,只要有一个是变量,那么Java就会在动态区存放所得到的新String对象的实体和引用,you+hi相当于new String("你好")。
注意:程序更关心两个String对象的实体,而不是二者的引用是否相同,判断两个String对象的实体,即字符序列是否相同需要用到equals(String s)方法。
3 String类的常用方法
--public int length() 用来获取一个String对象的字符序列的长度
--public boolean equals(String s) String对象调用该方法比较当前String对象的字符序列是否与参数s指定的String对象的字符序列相同(比较时忽略大小写)
--public boolean startsWith(String s)、public boolean endsWith(String s) String对象调用startsWith(String s)方法判断当前String对象的字符序列前缀是否参数指定的String对象s的字符序列、String对象调用endsWith(String s)方法判断当前String对象的字符序列后缀是否参数指定的String对象s的字符序列
--public int compareTo(String s) String对象调用该方法,按字典序与参数指定的String对象s的字符序列比较大小,如果字符序列相同返回0,如果大于s的字符序列,返回正值,反之返回负值
--public boolean contains(String s) 调用该方法判断当前字符序列是否包含出参数s的字符序列
--public int indexOf(String s)和public int lastIndexOf(String s) String对象调用方法从当前String对象的字符序列的0索引位置开始检索首次出现s的字符序列的位置,并返回该位置。如果没有检索到,该方法返回的值是–1、String对象调用方法从当前String对象的字符序列的0索引位置开始检索最后一次出现s的字符序列的位置,并返回该位置。如果没有检索到,该方法返回的值是–1
--public String substring(int startpoint) 字符串对象调用该方法获得一个新的String对象,新的String对象的字符序列是复制当前String对象的字符序列中的startpoint 位置至最后位置上的字符所得到的字符序列
--public String trim() 字符串对象调用该方法得到一个新的字符串对象,这个新的对象的字符序列是当前String对象的字符序列去掉空格后的字符序列
4 字符串与基本数据的相互转化
Java.lang包中的Integer类调用其类方法: public static int parseInt(String s)可以将由“数字”字符组成的字符串,如“876”,转化为int型数据;类似地,使用java.lang包中的Byte、Short、Long、Float、Double类调相应的类方法可以将由"数字"字符组成的字符串,转化为相应的基本数据类型。
可以使用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)等
将形如123、1232.98等数值转化为字符串,如:
String str = String.valueOf(12313.9876);
5 对象的字符串表示
Object类有一个
public String toString()
方法,一个对象通过调用该方法可以获得该对象的字符序列表示。一个对象调用toString()方法返回的String对象的字符序列的一般形式为: 创建对象的类的名字@对象的引用的字符串表示
6 字符串与字符数组、字节数组
6.1 字符串与字符数组
String 类的构造方法:
–String(char[]);
–String(char[],int offset,int length) 分别用字符数组中的全部字符和部分字符创建字符串对象
将String对象的部分字符序列存放到数组中的方法: public void getChars(int start,int end,char c[],int offset )
将String对象的字符序列存放到数组中的方法: public char[] toCharArray()
6.2 字符串与字节数组
String(byte[])用指定的字节数组构造一个字符串对象。
String(byte[],int offset,int length) 用指定的字节数组的一部分,即从数组起始位置offset开始取length个字节构造一个字符串对象。
–public byte[] getBytes()使用平台默认的字符编码,将当前String对象的字符序列存放到字节数组,并返回数组的引用。
public byte[] getBytes(String charsetName)使用参数指定字符编码,将当前String对象的字符序列存放到字节数组,并返回数组的引用。
6.3 字符串的加密算法
使用一个String对象password 的字符序列作为密码对另一个String对象sourceString的字符序列进行加密,操作过程如下:
将password 的字符序列存放到一个字符数组:
char [] p = password.toCharArray();
7 正则表达式及字符串的替换与分解
7.1 正则表达式
正则表达式是一个String对象的字符序列,该字符序列中含有具有特殊意义字符,这些特殊字符称做正则表达式中的元字符。
7.2 字符串的替换
String对象调用public String replaceAll(String regex,String replacement)方法返回一个新的String对象,这个新的String对象的字符序列是把当前String对象的字符序列中所有和参数regex匹配的子字符序列,用参数replacement的字符序列替换后得到字符序列。
7.3 字符序列的分解
public String[] split(String regex)使用参数指定的正则表达式regex做为分隔标记分解出其中的单词,并将分解出的单词存放在字符串数组中。
二、StringTokenizer类
当分析一个String对象的字符序列并将字符序列分解成可被独立使用的单词时,可以使用java.lang包中的StringTokenizer类,该类有两种常用的构造方法:
-StringTokenizer(String s) 为String对象s构造一个分析器,使用默认的分隔标记,即空格符、换行符、回车符、Tab符、进纸符做分隔标记
-StringTokenizer(String s,String delim) 为String对象s构造一个分析器。参数Delim的字符序列中的字符的任意排序被作为分隔标记
一个StringTokenizer对象被称为一个字符串分析器,常用方法:nextToken() 逐个获取String对象的字符序列中的语言符号(单词);hasMoreTokens() 只要字符序列中还有语言符号,该方法返回true; countTokens() 得到分析器中计量变量的值。
三、Scanner类
该类在之前的学习早已用上。
1 Scanner对象
Scanner对象可以调用方法
useDelimiter(正则表达式);
将正则表达式作为分隔标记,即让Scanner对象在解析操作时,把与正则表达式匹配的字符序列作为分隔标记。如果不指定分隔标记,那么Scanner对象默认地用空白字符:空格,制表符,回行符作为分隔标记来解析String对象的字符序列中的单词。
Scanner对象调用nextInt()等方法时可能发生InputMismatchTxception 异常,在处理异常时,可以调用next()方法返回非数字化单词。
2 StringTokenizer 和 Scanner 的区别
两者都用于分解字符序列中的单词,但二者在思想上有所不同,StringTokenizer对象能较快速度获得单词,但Scanner对象节省内存空间(用速度换取空间)。
四、StringBuffer类
1 StringBuffer对象
与String 类不同,StringBuffer 类的对象的实体的内存空间可以自动地改变大小,便于存放一个可变的字符序列,StringBuffer 类有三个构造方法:
-StringBuffer(); 分配给该对象的实体的初始容量可以容纳16个字符,当内容超出时可自动增加
-StringBuffer(int size); 指定分配给该对象实体的初始容量为size 个字符,可自动增加
-StringBuffer(String s); 指定分配给该对象实体的初始容量为参数s的字符序列长度再加16.
2 StringBuffer 类的常用方法
1)append 方法
-StringBuffer append(String s):将String对象s的字符序列追加到当前StringBuffer对象的字符序列中,并返回当前StringBuffer对象的引用
- StringBuffer append(int n):将int型数据n转化为String对象,再把该String对象的字符序列追加到当前StringBuffer对象的字符序列中,并返回当前StringBuffer对象的引用
-StringBuffer append(Object o):将一个Object对象o的字符序列表示追加到当前String- Buffer对象的字符序列中,并返回当前StringBuffer对象的引用
类似的还有: StringBuffer append(long n);StringBuffer append(boolean n); StringBuffer append(float n);StringBuffer append(double n);StringBuffer append(char n)。
2)
-public chat charAt(int n ):得到参数n指定的置上的单个字符
-public void setCharAt(int n ,char ch):将当前StringBuffer对象实体中的字符串位置n处的字符用参数ch指定的字符替换
3)-StringBuffer insert(int index, String str) :将参数str指定的字符串插入到参数index指定的位置
4)-public StringBuffer reverse() :将该对象实体中的字符翻转
5)-StringBuffer delete(int startIndex, int endIndex):从当前StringBuffer对象实体中的字符串中删除一个子字符串
6)-StringBuffer replace(int startIndex,int endIndex,String str):将当前StringBuffer对象实体中的字符串的一个子字符串用参数str指定的字符串替换
五、Date 类与 Calendar类
Date类与Calendar类的实例可用于处理日期、时间相关的数据。
1 Date类
构造方法:无参 -Date nowTime = new Date() ; 获取本机当前日期和时间
带参-Date date1 = new Date(1000); 计算机系统将其自身的时间的“公元”设置在1970年1月1日0时,参数取正数表示公元后的时间,去负数表示公元前的时间;上述中1000表示1000毫秒,即获取公元后过了1000毫秒的时间;
2 Calender 类
使用该类的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) :可以获取有关年份、月份、小时、星期等信息。
六、日期格式化
1 format方法
Formatter类的format方法:
–format(格式化模式, 日期列表)
–按着“格式化模式”返回“日期列表”中所列各个日期中所含数据(年,月,日,小时等数据)的字符串表示。
2 格式化模式
–format方法中的“格式化模式”是一个用双引号括起的字符序列(字符串),该字符序列中的字符由时间格式符和普通字符所构成。例如:"日期:%ty-%tm-%td"
3 日期列表
–format方法中的“日期列表”可以是用逗号分隔的Calendar对象或Date对象。
–format方法默认按从左到右的顺序使用“格式化模式”中的格式符来格式“日期列表”中对应的日期,而“格式化模式”中的普通字符保留原样。
4 格式化同一日期
–可以在“格式化模式”中使用“<”,比如:"%ty-%<tm-%<td"中的三个格式符将格式化同一日期,即含有“<”的格式符和它前面的格式符格式同一个日期,例如:String s = String.format("%ty年%<tm月%<td日",new Date());那么%<tm和%<td都格式化new Date(),因此字符串s就是:"11年02月10日"。
5 不同区域的星期格式
如果想用特定地区的星期格式来表示日期中的星期,可以用format的重载方法:
format (Locale locale,格式化模式,日期列表);
–其中的参数locale是一个Locale类的实例,用于表示地域。
–Locale类的static常量都是Locale对象,其中US是表示美国的static常量。
注:如果format方法不使用Locale参数格式化日期,当前应用程序所在系统的地区设置是中国,那么相当于locale参数取Locale.CHINA。
七、Math类、BigInteger类、Random类
1 Math类
在编写程序时,可能需要计算一个数的平方根、绝对值或获取一个随机数等,可通过类名Math直接调用类中的静态方法进行科学计算,Math类有两个static常量:E和PI,分别是2.718282828284590452354和4.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) 返回正弦值。
2 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进制的字符串表示。
3 Random类
尽管可以使用Math类调用static方法random()返回一个0~1之间的随机数(包括0.0单不包括1.0),但Java提供了更为灵活的用于获取随机数的Random类(java.util包中),构造方法如下:
–public Random(); 使用当前机器时间作为种子创建一个Random对象
–public Random(long seed); 使用参数seek指定的种子创建一个Random对象
随机数生成器random调用不带参数的nextInt()方法:
Random random=new Random();
random.nextInt();
–返回一个0至n之间(包括0,但不包括n)的随机数 随机数生成器random调用带参数的nextInt(int m)方法(参数m必须取正整数值)
注:对于具有相同种子的两个Eandom对象,二者依次调用nextInt()方法获取的随机数序列是相同的。
八、数字格式化
所谓数字格式化,就是按照指定格式得到一个字符序列。
1 Formatter类提供了一个和C语言printf函数类似的format方法:
format(格式化模式,值列表)
该方法按着“格式化模式”返回“值列表”的字符串表示。
1)格式化模式 format方法中的“格式化模式”是一个用双引号括起的字符序列(字符串),该字符序列中的字符由格式符和普通字符所构成。
例如:"输出结果%d,%f,%d"中的%d和%f是格式符号 .
2)值列表 format方法中的“值列表”是用逗号分隔的变量、常量或表达式。 例如:
String s=format("%d元%0.3f公斤%d台",888,999.777666,123); 那么,s就是"888元999.778公斤123台"。
3)格式化顺序
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个,2$表示“值列表”中的第2个;
注2:如果准备在“格式化模式”中包含普通的%,在编写代码时需要连续键入两个%。
2 格式化整数
1)%d,%o,%x和%X 格式符可格式化byte、Byte、short、Short、int、Integer、long和Long型数据
2)修饰符 加号修饰符"+"格式化正整数时,强制添加上正号,例如,%+d将123格式化为"+123"
3)数据的宽度 数据的宽度就是format方法返回的字符串的长度。规定数据宽度的一般格式为“%md”,其效果是在数字的左面增加空格;或"%-md“,其效果是在数字的右面增加空格。
3 格式化浮点数
1)%f,%e(%E),%g(%G)和%a(%A)格式符可格式化float、Float、double和Double: %f 将值格式化为十进制浮点数,小数保留6位。
2)修饰符
加号修饰符"+"格式化正数时,强制添加上正号,例如%+f将123.78格式化为"+123.78", %+E将123.78格式化为"+1.2378E+2"。
逗号修饰符“,”格式化浮点数时,将整数部分按“千”分组;
3)限制小数位数与数据的“宽度”
"%.nf"可以限制小数的位数,其中的n是保留的小数位数,例如%.3f将6.1256格式化为"6.126"(保留3位小数)。
规定宽度的一般格式为“%mf”(在数字的左面增加空格),或“%-md”(在数字的右面增加空格)。
九、Calss类与Console类
1 Class类
Class类是java.lang 包中的类,该类的实例可以帮助程序创建其他类的实例。可以使用Class对象得到某个类的实例,步骤如下:
1.1 使用Class的类方法得到一个和某类(参数 className 指定的类) 相关的Class对象:
public static Class forName(String className) throws ClassNotFoundException
1.2 步骤1.1中获得的Class对象调用
Public Object newInstance() throws InstantiationException,IllegalAccessException
Class对象调用newInstance()实例化一个className类的对象时,className类必须有无参数的构造方法。
2 Console类
如果希望在键盘输入一行文本,但不想让该文本显示,这时需要调用java.io包中的Console类的对象来完成。
首先,Console cons = System.console();
然后,char[] passwd = cons.readPassword();
十、Pattern类与Matcher类
1.建立Pattern对象
使用正则表达式regex做参数得到一个称为模式的Pattern类的实例pattern:
例如:String regex = "good";
Pattern pattern = Pattern.compile(regex);
模式对象是对正则表达式的封装。Pattern类调用类方法compile(String regex)返回一个模式对象,其中的参数regex是一个正则表达式, 称为模式对象使用的模式。
2.得到Matcher对象
模式对象pattern调用matcher(CharSequence input)方法返回一个Matcher对象matcher,称为匹配对象。
Matcher matcher = pattern.matcher(input);
教材学习中的问题和解决过程
无。
代码调试中的问题和解决过程
无。