《Java核心技术卷1 基础知识》 第三章 Java的基本程序设
数学函数与常量
在Math类中,包含了各种各样的数学函数。
想要计算一个数值的平方根,可用sqrt方法:
double x = 4;
double y = Math.sqrt(x);
System.out.println(y);//prints 2.0
注释:println方法和sqrt方法存在微小的差异。println方法操作一个定义在System类中的System.out对象,但是Math类中的sqrt方法处理的不是对象,这样的方法被称为静态方法。
在Java中,没有幂运算,因此需要借助于Math类的pow方法。语句:
double y = Math.pow(x,a);
Math类提供了一些常用的三角函数:
Math.sin
Math.cos
Math.tan
Math.atan
Math.atan2
还有指数函数以及它的反函数——自然对数以及以10为底的对数:
Math.exp
Math.log
Math.log10
最后,Java还提供了两个用于表示π和e常量的近似值:
Math.PI
Math.E
提示:在源文件的顶部加上下面这行代码:
import static java.lang.Math.*;
例如:
System.out.println("The square root of \u03C0 is" + sqrt(PI));
类型转换
image.png图中有6个实心箭头,表示无信息丢失的转换;有3个虚箭头,表示可能有精度损失的转换。
强制类型转换(cast)
double x = 9.991;
int nx = (int)x;
这样 变量nx的值为9.
强制类型转换通过截断小数部分将浮点值转换为整型。
如果想对浮点数进行舍入运算,以便得到最接近的整数,那就需要用Math.round方法:
double x = 9.991;
int nx = (int)Math.round(x);
现在,变量nx的值为10。当调用round的时候,仍然需要使用强制类型转换(int)。其原因是round方法返回的结果为long类型。由于存在信息丢失的可能性,所以只有使用显式的强制类型转换才能够将long类型转换成int类型。
- 警告:如果视图将一个数值从一种类型强制转换为另一种类型,而又超出了目标类型的表示范围,结果就会截断成一个完全不同的值。例如,(byte)300的实际值是44。
String类对象称为不可变字符串。
不可变字符串有一个优点:编译器可以让字符串共享。
为了弄清楚具体的工作方式,可以想象将各种字符串放在公共的存储池中,字符串变量指向存储池中相应的位置,如果复制一个字符串变量,原始字符串与复制的字符串共享相同的字符。
空串与Null串
空串“”是长度为0的字符串。空船是一个Java对象,有自己的串长度(0)和内容(空)。不过String变量还可以存放一个特殊的值,名为Null,这表示目前没有任何对象与该变量关联。要检查一个字符串是否为null,可以用下面语句:
if(str == null)
代码点与代码单元
Java字符串由char序列组成,char数据类型是一个采用UTF-16编码表示Unicode代码点的代码单元。大多数的常用Unicode字符使用一个代码单元就可以表示,而辅助字符需要一对代码单元表示。
length方法将返回采用UTF-16编码表示的给定字符串所需要的代码单元数量。例如:
String greeting = "Hello";
int n = greeting.length();//is 5
如果想要得到实际的长度,即代码点数量,可以调用:
int cpCount = greeting.codePointCount(0,greeting.length());
调用s.charAt(n)将返回位置n的代码单元,n介于0~s.length()-1之间。例如:
char first = greeting.charAt(0);//first is 'H'
char last = greeting.charAt(4);//last is 'o'
要想得到第i个代码点,应该是用下列语句
int index = greeting.offsetByCodePoints(0,i);
int cp = greeting.codePointAt(index);
-65