Java 中文官方教程 2022 版(五)(2)https://developer.aliyun.com/article/1486295
指数和对数方法
下表列出了Math
类的指数和对数方法。
指数和对数方法
方法 | 描述 |
double exp(double d) |
返回自然对数的底数 e 的参数次幂。 |
double log(double d) |
返回参数的自然对数。 |
double pow(double base, double exponent) |
返回第一个参数的值的第二个参数的幂。 |
double sqrt(double d) |
返回参数的平方根。 |
下面的程序,指数演示
,显示了e
的值,然后对任意选择的数字调用前面表中列出的每个方法:
public class ExponentialDemo { public static void main(String[] args) { double x = 11.635; double y = 2.76; System.out.printf("The value of " + "e is %.4f%n", Math.E); System.out.printf("exp(%.3f) " + "is %.3f%n", x, Math.exp(x)); System.out.printf("log(%.3f) is " + "%.3f%n", x, Math.log(x)); System.out.printf("pow(%.3f, %.3f) " + "is %.3f%n", x, y, Math.pow(x, y)); System.out.printf("sqrt(%.3f) is " + "%.3f%n", x, Math.sqrt(x)); } }
当你运行指数演示
时,你将看到以下输出:
The value of e is 2.7183 exp(11.635) is 112983.831 log(11.635) is 2.454 pow(11.635, 2.760) is 874.008 sqrt(11.635) is 3.411
三角函数方法
Math
类还提供了一系列三角函数,总结在下表中。传递给这些方法的值是以弧度表示的角度。你可以使用toRadians
方法将角度转换为弧度。
三角函数方法
方法 | 描述 |
double sin(double d) |
返回指定双精度值的正弦值。 |
double cos(double d) |
返回指定双精度值的余弦值。 |
double tan(double d) |
返回指定双精度值的正切值。 |
double asin(double d) |
返回指定双精度值的反正弦值。 |
double acos(double d) |
返回指定双精度值的反余弦值。 |
double atan(double d) |
返回指定双精度值的反正切值。 |
double atan2(double y, double x) |
将直角坐标(x, y) 转换为极坐标(r, theta) 并返回theta 。 |
double toDegrees(double d) double toRadians(double d) |
将参数转换为度或弧度。 |
这里有一个程序,三角函数演示
,使用每个方法来计算 45 度角的各种三角函数值:
public class TrigonometricDemo { public static void main(String[] args) { double degrees = 45.0; double radians = Math.toRadians(degrees); System.out.format("The value of pi " + "is %.4f%n", Math.PI); System.out.format("The sine of %.1f " + "degrees is %.4f%n", degrees, Math.sin(radians)); System.out.format("The cosine of %.1f " + "degrees is %.4f%n", degrees, Math.cos(radians)); System.out.format("The tangent of %.1f " + "degrees is %.4f%n", degrees, Math.tan(radians)); System.out.format("The arcsine of %.4f " + "is %.4f degrees %n", Math.sin(radians), Math.toDegrees(Math.asin(Math.sin(radians)))); System.out.format("The arccosine of %.4f " + "is %.4f degrees %n", Math.cos(radians), Math.toDegrees(Math.acos(Math.cos(radians)))); System.out.format("The arctangent of %.4f " + "is %.4f degrees %n", Math.tan(radians), Math.toDegrees(Math.atan(Math.tan(radians)))); } }
该程序的输出如下:
The value of pi is 3.1416 The sine of 45.0 degrees is 0.7071 The cosine of 45.0 degrees is 0.7071 The tangent of 45.0 degrees is 1.0000 The arcsine of 0.7071 is 45.0000 degrees The arccosine of 0.7071 is 45.0000 degrees The arctangent of 1.0000 is 45.0000 degrees
随机数
random()
方法返回一个在 0.0 和 1.0 之间伪随机选择的数字。范围包括 0.0 但不包括 1.0。换句话说:0.0 <= Math.random() < 1.0
。要获得不同范围的数字,可以对随机方法返回的值进行算术运算。例如,要生成 0 到 9 之间的整数,你可以这样写:
int number = (int)(Math.random() * 10);
通过将值乘以 10,可能值的范围变为0.0 <= number < 10.0
。
使用Math.random
在需要生成单个随机数时效果很好。如果需要生成一系列随机数,应该创建一个java.util.Random
的实例,并在该对象上调用方法来生成数字。
数字总结
原文:
docs.oracle.com/javase/tutorial/java/data/numbersummary.html
您可以使用包装类之一 - Byte
、Double
、Float
、Integer
、Long
或 Short
- 将原始类型的数字包装在对象中。在必要时,Java 编译器会自动为您包装(装箱)原始类型,并在必要时对其进行拆箱。
Number
类包括常量和有用的类方法。MIN_VALUE
和 MAX_VALUE
常量包含该类型对象可以包含的最小值和最大值。byteValue
、shortValue
和类似方法将一个数值类型转换为另一个数值类型。valueOf
方法将字符串转换为数字,toString
方法将数字转换为字符串。
要格式化包含数字的字符串以进行输出,可以使用 PrintStream
类中的 printf()
或 format()
方法。或者,您可以使用 NumberFormat
类使用模式自定义数字格式。
Math
类包含各种执行数学函数的类方法,包括指数、对数和三角函数方法。Math
还包括基本算术函数,如绝对值和四舍五入,以及用于生成随机数的 random()
方法。
问题和练习:数字
原文:
docs.oracle.com/javase/tutorial/java/data/QandE/numbers-questions.html
问题
- 使用 API 文档找到以下问题的答案:
- 你可以使用哪个
Integer
方法将int
转换为以十六进制表示数字的字符串?例如,哪个方法将整数 65 转换为字符串“41”? - 你会使用哪个
Integer
方法将以基数 5 表示的字符串转换为相应的int
?例如,如何将字符串“230”转换为整数值 65?展示你将用于完成此任务的代码。 - 你可以使用哪个 Double 方法来检测浮点数是否具有特殊值“非数字”(
NaN
)?
- 以下表达式的值是多少,为什么?
Integer.valueOf(1).equals(Long.valueOf(1))
练习
- 将
MaxVariablesDemo
更改为显示最小值而不是最大值。您可以删除与变量aChar
和aBoolean
相关的所有代码。输出是什么? - 创建一个程序,从命令行读取未指定数量的整数参数并将它们相加。例如,假设您输入以下内容:
java Adder 1 3 2 10
- 程序应显示
16
,然后退出。如果用户只输入一个参数,程序应显示错误消息。您可以基于ValueOfDemo
编写您的程序。 - 创建一个类似于上一个程序但具有以下区别的程序:
- 它不是读取整数参数,而是读取浮点参数。
- 它显示参数的总和,小数点右侧正好有两位。
- 例如,假设您输入以下内容:
java FPAdder 1 1e2 3.0 4.754
- 程序将显示
108.75
。根据您的区域设置,小数点可能是逗号(,
)而不是句号(.
)。
检查你的答案。
字符
原文:
docs.oracle.com/javase/tutorial/java/data/characters.html
大多数情况下,如果您使用单个字符值,您将使用原始的char
类型。例如:
char ch = 'a'; // Unicode for uppercase Greek omega character char uniChar = '\u03A9'; // an array of chars char[] charArray = { 'a', 'b', 'c', 'd', 'e' };
然而,有时您需要将 char 用作对象—例如,作为期望对象的方法参数。Java 编程语言提供了一个包装器类,用于将char
包装在Character
对象中。Character
类型的对象包含一个单一字段,其类型为char
。这个Character类还提供了许多有用的类(即静态)方法来操作字符。
您可以使用Character
构造函数创建一个Character
对象:
Character ch = new Character('a');
Java 编译器在某些情况下也会为您创建一个Character
对象。例如,如果您将一个原始的char
传递给一个期望对象的方法,编译器会自动为您将char
转换为Character
。这个特性被称为自动装箱—或者拆箱,如果转换是另一种方式的话。有关自动装箱和拆箱的更多信息,请参阅自动装箱和拆箱。
注意: Character
类是不可变的,一旦创建,Character
对象就无法更改。
以下表列出了Character
类中一些最有用的方法,但并非详尽无遗。要查看此类中所有方法的完整列表(超过 50 个),请参考java.lang.Character API 规范。
Character
类中的有用方法
方法 | 描述 |
boolean isLetter(char ch) boolean isDigit(char ch) |
确定指定的 char 值是字母还是数字。 |
boolean isWhitespace(char ch) |
确定指定的 char 值是否为空格。 |
boolean isUpperCase(char ch) boolean isLowerCase(char ch) |
确定指定的 char 值是大写还是小写。 |
char toUpperCase(char ch) char toLowerCase(char ch) |
返回指定 char 值的大写或小写形式。 |
toString(char ch) |
返回表示指定字符值的String 对象 — 也就是一个字符的字符串。 |
转义序列
一个由反斜杠(\)引导的字符是一个转义序列,对编译器具有特殊含义。下表显示了 Java 转义序列:
转义序列
转义序列 | 描述 |
\t |
在文本中插入一个制表符。 |
\b |
在文本中插入一个退格符。 |
\n |
在文本中插入一个换行符。 |
\r |
在文本中插入一个回车符。 |
\f |
在文本中插入一个换页符。 |
\' |
在文本中插入一个单引号字符。 |
\" |
在文本中插入一个双引号字符。 |
\\ |
在文本中插入一个反斜杠字符。 |
当在打印语句中遇到转义序列时,编译器会相应地解释它。例如,如果你想在引号内放置引号,你必须使用转义序列 \"
来处理内部引号。要打印这个句子
She said "Hello!" to me.
你需要写
System.out.println("She said \"Hello!\" to me.");
字符串
在 Java 编程中广泛使用的字符串是一系列字符。在 Java 编程语言中,字符串是对象。
Java 平台提供了String
类来创建和操作字符串。
创建字符串
创建字符串的最直接方法是写:
String greeting = "Hello world!";
在这种情况下,Hello world!
是一个字符串字面值——代码中用双引号括起来的一系列字符。每当编译器在您的代码中遇到字符串字面值时,它会创建一个带有其值的String
对象——在本例中为Hello world!
。
与任何其他对象一样,您可以使用new
关键字和构造函数创建String
对象。String
类有十三个构造函数,允许您使用不同的来源(如字符数组)提供字符串的初始值:
char[] helloArray = { 'h', 'e', 'l', 'l', 'o', '.' }; String helloString = new String(helloArray); System.out.println(helloString);
此代码片段的最后一行显示hello
。
注意:String
类是不可变的,因此一旦创建了String
对象,就无法更改。String
类有许多方法,其中一些将在下面讨论,看起来修改了字符串。由于字符串是不可变的,这些方法实际上是创建并返回一个包含操作结果的新字符串。
字符串长度
用于获取有关对象信息的方法称为访问器方法。您可以与字符串一起使用的一个访问器方法是length()
方法,它返回字符串对象中包含的字符数。执行以下两行代码后,len
等于 17:
String palindrome = "Dot saw I was Tod"; int len = palindrome.length();
回文是一个对称的单词或句子——它正向和反向拼写相同,忽略大小写和标点符号。这是一个简短且低效的程序来反转一个回文字符串。它调用了String
方法charAt(i)
,该方法返回字符串中第 i 个字符,从 0 开始计数。
public class StringDemo { public static void main(String[] args) { String palindrome = "Dot saw I was Tod"; int len = palindrome.length(); char[] tempCharArray = new char[len]; char[] charArray = new char[len]; // put original string in an // array of chars for (int i = 0; i < len; i++) { tempCharArray[i] = palindrome.charAt(i); } // reverse array of chars for (int j = 0; j < len; j++) { charArray[j] = tempCharArray[len - 1 - j]; } String reversePalindrome = new String(charArray); System.out.println(reversePalindrome); } }
运行程序会产生以下输出:
doT saw I was toD
为了实现字符串反转,程序必须将字符串转换为字符数组(第一个for
循环),将数组反转为第二个数组(第二个for
循环),然后再转换回字符串。String
类包括一个方法,getChars()
,用于将字符串或字符串的一部分转换为字符数组,以便我们可以用以下代码替换上面程序中的第一个for
循环
palindrome.getChars(0, len, tempCharArray, 0);
字符串连接
String
类包括一个用于连接两个字符串的方法:
string1.concat(string2);
这将返回一个新字符串,其中在字符串 1 的末尾添加了字符串 2。
您还可以使用concat()
方法与字符串字面值,如:
"My name is ".concat("Rumplestiltskin");
字符串更常用地使用+
运算符连接,如
"Hello," + " world" + "!"
这导致
"Hello, world!"
+
运算符广泛用于print
语句中。例如:
String string1 = "saw I was "; System.out.println("Dot " + string1 + "Tod");
打印
Dot saw I was Tod
这样的连接可以是任何对象的混合。对于每个不是String
的对象,都会调用它的toString()
方法将其转换为String
。
注意: Java 编程语言不允许文字字符串跨越多行出现在源文件中,因此您必须在多行字符串的每一行末尾使用+
连接运算符。例如:
String quote = "Now is the time for all good " + "men to come to the aid of their country.";
使用+
连接运算符在行之间断开字符串,在print
语句中再次非常常见。
创建格式化字符串
您已经看到了使用printf()
和format()
方法打印带有格式化数字的输出。String
类有一个等效的类方法format()
,它返回一个String
对象而不是一个PrintStream
对象。
使用String
的静态format()
方法允许您创建一个格式化的字符串,您可以重复使用,而不是一次性的打印语句。例如,而不是
System.out.printf("The value of the float " + "variable is %f, while " + "the value of the " + "integer variable is %d, " + "and the string is %s", floatVar, intVar, stringVar);
你可以写
String fs; fs = String.format("The value of the float " + "variable is %f, while " + "the value of the " + "integer variable is %d, " + " and the string is %s", floatVar, intVar, stringVar); System.out.println(fs);
在数字和字符串之间进行转换
原文:
docs.oracle.com/javase/tutorial/java/data/converting.html
将字符串转换为数字
经常情况下,程序最终会在字符串对象中包含数值数据—例如用户输入的值。
包装原始数值类型的Number
子类(Byte
、Integer
、Double
、Float
、Long
和Short
)每个都提供一个名为valueOf
的类方法,将字符串转换为该类型的对象。以下是一个示例,ValueOfDemo
,从命令行获取两个字符串,将它们转换为数字,并对这些值执行算术运算:
public class ValueOfDemo { public static void main(String[] args) { // this program requires two // arguments on the command line if (args.length == 2) { // convert strings to numbers float a = (Float.valueOf(args[0])).floatValue(); float b = (Float.valueOf(args[1])).floatValue(); // do some arithmetic System.out.println("a + b = " + (a + b)); System.out.println("a - b = " + (a - b)); System.out.println("a * b = " + (a * b)); System.out.println("a / b = " + (a / b)); System.out.println("a % b = " + (a % b)); } else { System.out.println("This program " + "requires two command-line arguments."); } } }
当您使用4.5
和87.2
作为命令行参数时,程序的输出如下:
a + b = 91.7 a - b = -82.7 a * b = 392.4 a / b = 0.0516055 a % b = 4.5
**注意:**包装原始数值类型的每个Number
子类还提供一个parseXXXX()
方法(例如,parseFloat()
),可用于将字符串转换为原始数值。由于返回的是原始类型而不是对象,因此parseFloat()
方法比valueOf()
方法更直接。例如,在ValueOfDemo
程序中,我们可以使用:
float a = Float.parseFloat(args[0]); float b = Float.parseFloat(args[1]);
Java 中文官方教程 2022 版(五)(4)https://developer.aliyun.com/article/1486297