数学函数、字符和字符串
使用数学函数、字符和字符串对象来开发程序。
常用数学函数
Java 在 Math 类中提供了许多实用的方法,来计算常用的数学函数。
Math.pow(a,b) 用以计算幂函数 ab ,Math.random() 方法来产生一个随机数。
Math 类中其他有用的方法,这些方法分为三类:
- 三角函数方法(trigonometric method)
- 指教函数方法(exponent method)
- 服务方法(service method)
其中服务方法包括取整、求最小值、求最大值、求绝对值和随机方法。
Math 类还提供了两个很有用的 double 型常量,PI( π \pi π)和 E(自然对数的底)。可以在任意程序中直接用 Math.PI 和 Math.E 的形式来使用这两个常量
三角函数方法
Math 类中的三角函数方法如下表:
方法 | 描述 |
---|---|
sin(radians) | 返回以弧度为单位的角度的三角正弦函数值 |
cos(radians) | 返回以弧度为单位的角度的三角余弦函数值 |
tan(radians) | 返回以弧度为单位的角度的三角正切函数值 |
toRadians(degree) | 将以度为单位的角度值转换为以弧度表示 |
toDegree(radians) | 将以弧度为单位的角度值转换为以度表示 |
asin(a) | 返回以弧度为单位的角度的反三角正弦函数值 |
acos(a) | 返回以弧度为单位的角度的反三角余弦函数值 |
atan(a) | 返回以弧度为单位的角度的反三角正切函数值 |
说明: sin 、cos 和 tan 的参数都是以弧度为单位的角度。asin 和 atan 的返回值是 − π / 2 -\pi/2 −π/2~ π / 2 \pi/2 π/2 的一个弧度值,acos 的返回值在 0 到 π \pi π 之间。 1° 相当于 π \pi π/180 弧度,90° 相当于 π \pi π/2 弧度,180° 相当于 π \pi π 弧度。
指数函数方法
Math 类中有 5 个与指数函数有关的方法如下表:
方法 | 描述 |
---|---|
exp(x) | 返回 e 的 x 次方 |
log(x) | 返回 x 的自然底数 |
log(10) | 返回 x 的以 10 为底的对数 |
pow(a,b) | 返回 a 的 b 次方 |
sqrt(x) | 对于 x ≥ \geq ≥ 0 的数字,返回 x 的平方根 |
服务方法
Math 类包括 5 个取整方法如下表:
方法 | 描述 |
---|---|
ceil(x) | x 向上取整为它最接近的整数,该整数作为一个双精度值返回 |
floor(x) | x 向下取整为它最接近的整数,该整数作为一个双精度值返回 |
rint(x) | x 取整为它最接近的整数。如果 x 与两个整数的距离相等,偶数的整数作为一个双精度值返回 |
round(x) | 如果 x 是单精度数,返回 (int)Math.floor(x+0.5) ;如果 x 是双精度数,返回(long)Math.floor(x+0.5) |
min 、max 和 abs 方法
min 和 max 方法用于返回两个数(int 、long 、float 或 double 型)的最小值和最大值。
abs 方法以返回一个数(int 、long 、float 或 double 型)的绝对值。
random 方法
random() 方法,生成大于等于 0.0 且小于 1.0 的 double 型随机数(0.0
≤
\leq
≤ Math.random() < 1.0)。可以使用它编写简单的表达式,生成任意范围的随机数。
a + + +Math.random() × \times ×b 返回 a~a+b 之间的一个随机整数(不包括 a+b) 。
注意: 在一个 Java 程序中,java.lang 包中的所有类是隐式导人的。Math 类在 java.lang 包中,可以不用导入在程序中直接使用。
字符数据类型和操作
字符数据类型表示单个字符。除了处理数值之外,Java 还可以处理字符。字符数据类型 char 用来表示单个字符。字符型直接量用单引号括住。
字符串直接量必须括在双引号中,而字符直接量是括在单引号中的单个字符。因此 “A” 是一个字符串,而 ‘A’ 是一个字符。
Unicode 和 ASCII 码
计算机内部使用二进制数。一个字符在计算机中是以 0 和 1 构成的序列的形式来存储的。将字符映射到它的二进制形式的过程称为编码(encoding)。字符有多种不同的编码方式,编码表(encoding scheme)定义该如何编码每个字符。
Java 支持 Unicode 码,Unicode 码是由 Unicode 协会建立的一种编码方案,它支持使用世界各种语言所书写的文本的交换、处理和显示。Unicode 码一开始被设计为 16 位的字符编码。基本数据类型 char 试图通过提供一种能够存放任意字符的简单数据类型来利用这个设计。但是,一个 16 位的编码所能产生的字符只有 65 536 个,它是不足以表示全世界所有字符的。因此,Unicode 标准被扩展为 1112064 个字符。这些字符都远远超过了原来 16 位的限制,它们称为补充字符(supplementary character)。Java 支持这些补充字符。为了简化问题,只考虑 16 位 Unicode字符。这些字符都可以存储在一个 char 型变量中。
一个 16 位 Unicode 码占两个字节,用以 \u 开头的 4 位十六进制数表示,范围从 ‘\u0000’ 到 ‘\uFFFF’ 。大多数计算机采用 ASCII 码(美国标准信息交换码),它是表示所有大小写字母、数字、标点符号和控制字符的 8 位编码表。Unicode 码包括 ASCII 码,从 ‘\u0000’ 到 ‘\u007F’ 对应 128 个 ASCII 字符。
Java 程序中,可以使用 ASCII 字符,也可以使用 Unicode 码。
常用字符的 ASCII 码如下表:
字符 | 十进制编码 | Unicode |
---|---|---|
‘0’ ~ ‘9’ | 48 ~ 57 | \u0030 ~ \u0039 |
‘A’ ~ ‘Z’ | 65 ~ 90 | \u0041 ~ \u005A |
‘a’ ~ ‘z’ | 97 ~ 122 | \u0061 ~ \u007A |
注意: 自增和自减操作符也可用在 char 型变量上,这会得到该字符之前或之后的 Unicode 字符。
特殊字符的转义序列
Java 定义了一种特殊的标记来表示特殊字符,这种标记称为转义序列,转义序列由反斜杠(\)后面加上一个字符或者一些数字位组成。转义序列中的序列号作为一个整体翻译,而不是分开翻译。 一个转义序列被当作一个字符。
转义序列如下表:
转义序列 | 名称 | Unicode码 | 十进制 |
---|---|---|---|
\b | 退格键 | \u0008 | 8 |
\t | Tab键 | \u0009 | 9 |
\n | 换行键 | \u000A | 10 |
\f | 换页键 | \u000C | 12 |
\r | 回车符 | \u000D | 13 |
\ | 反斜杠 | \u005C | 92 |
" | 双引号 | \u0022 | 34 |
注意: 反斜杠 () 被称为转义字符,它是一个特殊字符。要显示这个字符,需要使用转义序列 (\) 。
字符型数据与数值型数据之间的转换
- char 型数据可以转换成任意一种数值类型,反之亦然。将整数转换成 char 型数据时,只用到该数据的低十六位,其余部分都被忽略。
- 要将一个浮点值转换成 char 型时,首先将浮点值转换成 int 型,然后将这个整型值转换为 char 型。
- 当一个 char 型数据转换成数值型时,这个字符的 Unicode 码就被转换成某个特定的数值类型。
- 如果转换结果适用于目标变量,就可以使用隐式转换方式;否则,必须使用显式转换方式。
- Unicode 码如果超过了一个字节的范围,转换成 Byte 型时,为了强制陚值,就必须使用显式转换方式。
- 0~FFFF 的任何一个十六进制正整数都可以隐式地转换成字符型数据。而不在此范围内的任何其他数值都必须显式地转换为 char 型。
- 所有数值操作符都可以用在 char 型操作数上。如果另一个操作数是一个数字或字符,那么 char 型操作数就会被自动转换成一个数字。如果另一个操作数是一个字符串,字符就会与该字符串相连。
字符的比较和测试
两个字符可以使用关系操作符进行比较,如同比较两个数字一样。通过比较两个字符的 Unicode 值实现的。程序中经常需要测试一个字符是数字、字母;大写字母、还是小写字母。对于小写字母、大写字母和数字字符的 Unicode 是连续的整数。这个特征可以用于编写测试字符的编码。
为了方便,Java 的 Character 类提供了几种方法用于进行字符测试,如下表所示:
方法 | 描述 |
---|---|
isDigit(ch) | 如果指定的字符是一个数字,返冋 true |
isLetter(ch) | 如果指定的字符是一个字母,返冋 true |
isLetterOrDigit(ch) | 如果指定的字符是一个字母或者数字,返回 true |
isLowerCase(ch) | 如果指定的字符是一个小写字母,返冋 true |
isUpperCase(ch) | 如果指定的字符是一个大写字母,返冋 true |
toLowerCase(ch) | 返回指定的字符的小写形式 |
toUpperCase(ch) | 返回指定的宇符的大写形式 |
String 类型
字符串本质上是一个字符序列。
char 类型只能表示一个字符。为了表示一串字符,使用称为 String(字符串)的数据类型。String 实际上与 System 类和 Scanner 类一样,都是 Java 库中一个预定义的类。 String 类型不是基本类型,而是引用类型(reference type)。使用引用类型声明的变量称为引用变量,它引用一个对象。 任何 Java 类都可以将变量表示为引用类型。
String 对象的简单方法
方法 | 描述 |
---|---|
length() | 返回字符串中的宇符数 |
charAt(index) | 返回字符串 S 中指定位置的字符 |
concat(s1) | 将本字符串和字符串 S1 连接,返回一个新字符串 |
toUpperCase() | 返回一个新宇符串,其中所有的字母大写 |
toLowerCase() | 返回一个新字符串,其中所有的字母小写 |
trim() | 返回一个新字符串,去掉两边的空白宇符 |
String 是 Java 中的对象。上表中的方法只能从一个特定的字符串实例来调用。这些方法称为实例方法。
非实例方法称为静态方法,静态方法可以不使用对象来调用。定义在 Math 类中的所有方法都是静态方法,它们没有绑定到一个特定的对象实例上。
调用一个实例方法的语法:
reference-Variable.methodName(arguments);
调用静态方法的语法:
ClassName.methodName(arguments);
注意: 一个方法可以有多个参数,或者无参
求字符串长度
调用字符串的 length() 方法获取它的长度。
注意: 使用一个字符串时,往往是知道它的直接量值的。为方便起见,Java 允许在不创建新变量的情况下,使用字符串直接量直接引用字符串。注意,"" 表示空字符串,并且 “”.length() 为 0 。
从字符串中获取字符
方法 s.charAt(index) 可用于提取字符串 s 中的某个特定字符,其中下标 index 的取值范围在 0~s.length()-l 之间。注意,字符串中第一个字符的下标值是 0 。
警告: 在字符串 S 中越界访问字符是一种常见的程序设计错误。为了避免此类错误,要确保使用的下标不会超过 S.length()-1 ,否则会造成 StringlndexOutOfBoundsException 异常。
连接字符串
可以使用 concat() 方法连接两个字符串。
字符串连接在程序设计中应用非常广泛,Java 提供了一种实现宇符串连接的简便办法。可以使用加号(+)连接两个或多个字符串。
加号(+)也可用于连接数字和字符串。在这种情况下,先将数字转换成字符串,然后再进行接。
注意: 若要用加号实现连接功能,至少要有一个操作数必须为字符串。如果操作数之一不是字符串,非字符串值转换为字符串,并与另外一个字符串连接。如果操作数都不是字符串,加号(+)是一个将两个数字相加的加法操作符。而且,增强的 += 操作符也可以用于字符串连接。
字符串的转换
方法 toLowerCase() 返回一个新字符串,其中所有字母小写。方法 toUpperCase() 返回
一个新字符串,其中所有字母大写。
方法 trim() 通过删除字符串两端的空白字符返回一个新字符串。字符 ’ ’ 、\t 、\f 、\r 或者 \n 被称为空白字符。
从控制台读取字符串
为了从控制台读取字符串,调用 Scanner 对象上的 next() 方法。
next() 方法读取以空白字符结束的字符串(’ ’ 、\t 、\f 、\r 或 \n)。可以使用 nextLine() 方法读取一整行文本。nextLine() 方法读取以按下回车键为结束标志的字符串。
重要警告: 为了避免输入错误,不要在 nextByte() 、nextShort() 、nextInt() 、nextLong() 、nextFloat() 、nextDouble() 和 next() 之后使用 nextLine() 。
从控制台读取字符
为了从控制台读取字符,调用 nextLine() 方法读取一个字符串,然后在字符串上调用 charAt(0) 来返回一个字符。
字符串比较
String 类提供了下表中所示的比较方法,用于比较两个字符串:
方法 | 描述 |
---|---|
equals(s1) | 如果该字符串等于字符串 sl ,返回 true |
equalsIgnoreCase(s1) | 如果该字符串等于字符串 sl ,返回 true ;不区分大小写 |
compareTo(s1) | 返回一个大于 0 、等于 0 、小于 0 的整数,表明一个字符串是否大于、等于或者小于 s1 |
compareToIgnoreCase(s1) | 和 compareTo 相同,不区分大小写 |
startsWith(prefix) | 如果字符串以特定的前缀开始,返回 true |
endsWith(suffix) | 如果宇符串以特定的后银结束,返回 true |
contains(s1) | 如果 sl 是该字符串的子字符串,返回true |
注意: 操作符 == 只能检测 stringl 和 string2 是否指向同一个对象,不能判断它们的内容是否相同。因此,不能使用 == 操作符判断两个字符串变量的内容是否相同,应该使用 equals 方法。
compareTo 方法也用来对两个字符串进行比较:
- 如果 sl 与 S2 相等,那么该方法返回值 0 ;
- 如果按字典顺序(即以 Unicode 码的顺序)sl 小于 s2 ,那么方法返回值小于 0 ;
- 如果按字典顺序 sl 大于 S2 ,方法返回值大于 0 。
方法 compareTo 返回的实际值是依据 sl 和 s2 从左到右数第一个不同字符之间的距离得出的。
警告: 如果使用像 > 、>= 、< 、<= 这样的比较操作符比较两个字符串,就会发生语法错误。替代的方法就是使用 sl.compareTo(s2) 来进行比较。
注意: 如果两个字符串相等,equals 方法送回 true ;如果它们不等,方法返因 false。
compareTo 方法会根据一个字符串是否等于、大于或小于另一个字符串,分别返回 0 、正整数或负整数。
- String 类还提供了对字符串进行比较的方法 equalsIgnoreCase 和 compareToIgnoreCase 。当比较两个字符串时,这两个方法忽略字母的大小写。
- str.startsWith(prefix) 来检测字符串 str 是否以特定前缀 (prefix) 开始。
- str.endsWith(suffix) 来检测字符串 str 是否以特定后缀(suffix)结束。
- str.contains(s1) 来检测是否字符串 str 包含字符串 s1 。
获得子字符串
方法 s.charAt(index) 可用于提取字符串 s 中的某个特定字符。可以使用 String 类中的 substring 方法从字符串中提取子串。
String 类包含的获取子串的方法如下表
方法 | 描述 |
---|---|
substring(beginIndex) | 返回该字符串的子串,从特定位置 beginIndex 的字符开始到字符串的结尾 |
substring(beginIndex,endIndex) | 返回该字符串的子串,从特定位置 beginlndex 的字符开始到下标为 endIndex-1 的字符。注意,位于 endIndex 位置的字符不属于该子字符串的一部分 |
获取字符串中的字符或者子串
String 类提供了几个版本的 indexOf 和 lastlndexOf 方法,可以在字符串中找出一个字符或一个子串。
String 类包含获取子串的方法如下表所示:
方法 | 描述 |
---|---|
indexOf(ch) | 返回字符串中出现的第一个 ch 的下标。如果没有匹配的,返回 -1 |
indexOf(ch,fromIndex) | 返冋字符串中 fromlndex 之后出现的第一个 ch 的下标。如果没有匹配的,返回 -1 |
indexOf(S) | 返冋字符串中出现的第一个字符串 s 的下标。如果没有匹配的,返冋 -1 |
indexOf(s,fromIndex) | 返回字符串中 fromlndex 之后出现的第一个字符串 s 的下标。如果没有匹配的,返回 -1 |
lastIndexOf(ch) | 返回字符串中出现的最后一个 ch 的下标。如果没有匹配的,返回 -1 |
lastIndexOf(ch,fromIndex) | 返回字符串中 fromlndex 之前出现的最后一个 ch 的下标。如果没有匹配的,返回 -1 |
lastIndexOf(s) | 返回字符串中出现的最后一个字符串 s 的下标。如果没有匹配的,返回 -1 |
lastIndexOf(s,fromIndex) | 返回字符串中 fromlndex 之前出现的最后一个字符串 s 的下标。如果没有匹配的,返回 -1 |
字符串和数字间的转换
可以将数值型字符串转换为数值, 使用 Integer.parseInt 方法将字符串转换为 int 值。语法如下:
int intValue = Integer.parseInt(intString);//intString 是一个数值型字符串
要将字符串转换为 double 值,使用 Double.parseDouble 方法,如下所示:
double doubleValue = Double.parseInt(doubleString);//doubleString 是一个数值型字符串
注意: 如果字符串不是数值型字符串,转换将导致一个运行时错误。Integer 和 Double 类都包含在 java.lang 包中,是自动导入的。
可以将数值转换为字符串,只需要简单使用字符串的连接操作符,如下所示:
String s = number + "";
格式化控制台输出
可以使用 System.out.printf 方法在控制台上显示格式化输出。
调用这个方法的语法是:
System.out.printf(format,item1,item2, ... ,itemk);
这里的 format 是指一个由子串和格式标识符构成的字符串。格式标识符指定每个条目应该如何显示。这里的条目可以是数值、字符、布尔值或字符串。简单的格式标识符是以百分号(%)开头的转换码。
常用的格式标识符如下表
标识符 | 输出 |
---|---|
%b | 布尔值 |
%c | 字符 |
%d | 十进制整数 |
%f | 浮点数 |
%e | 标准科学记数法形式的数 |
%s | 字符串 |
注意: 条目与标识符必须在次序、数量和类型上匹配。
默认情况下,浮点值显示小数点后 6 位数字。可以在标识符中指定宽度和精度。指定宽度和精度的举例如下表:
标识符 | 输出 |
---|---|
%6b | 输出布尔值,在 false 值前加一个空格,在 true 值前加两个空格 |
%5c | 输出字符并在这个字符条目前面加 4 个空格 |
%5d | 输出整数条目,宽度至少为 5 。如果该条目的数字位数小于 5 ,就在数字前面加空格。如果该条目的位数大于 5 ,则自动增加宽度 |
%10.2f | 输出的浮点条目宽度至少为 10 ,包括小数点和小数点后两位数字 。这样,给小数点前分配了 7 位数字。如果该条目小数点前的位数小于 7 ,就在数字前面加空格。如果该条目小数点前的位数大于 7 ,则自动增加宽度 |
%10.2e | 输出的浮点条目的宽度至少为 10 ,包括小数点、小数点后两位数字和指数部分。如果按科学记数法显示的数字小于 10 ,就给数字前加空格 |
%12s | 输出的字符串宽度至少为 12 个字符。如果该字符串条目小于 12 个字符,就在该字符串前加空格。如果该字符串条目多于 12 个宇符,则自动增加宽度 |
注意: 如果一个条目需要比指定宽度更多的空间,宽度自动增加。默认情况下,输出是右对齐的。可以在格式标识符中放一个负号(-),即 %- ,表明该条目在特定区域中的输出是左对齐的。
警告: 条目与格式标识符必须在类型上严格匹配。 对应于格式标识符 %f 或 %e 的条目必须是浮点型值。因此,int 型变量不能匹配 %f 或 %e 。
提示: 使用符号 % 来标记格式标识符,要在格式字符串里输出直接量 % ,需要使用 %% 。