12月 042015
 

3.3 数据类型
Java有一个能表示任意精度的算术包,通称“big number”,该包中的用于表示大的数值。
3.3.1 整型
Java中整型的范围与运行Java代码的机器无关,已经规定了各种数据类型所使用的字节数和取值范围(int、short、long、byte依次占用4、2、8、1个字节)。Java中没有任何unsigned type。
PS:C/C++中int表示的整型与目标机器有关。读《C和指针》的时候我记得读到过这么一句:C语言规范只规定了int的最小取值范围。
3.3.2 浮点类型
绝大部分应用程序都应采用double类型而不是float类型,只有很少情况适合使用float类型,例如快速地处理单精度数据,或是需要存储大量数据。
float类型的数值必须有一个后缀F(比如3.402F),没有后缀F的浮点数值(如3.402)默认为double类型(也可以加后缀D)。
JDK 1.5中可以使用十六进制表示浮点数值(具体表示方式请参见原书)。
常量Double.POSITIVE_INFINITY,Double.NEGATIVE_INFINITY,Double.NaN(float对应的常量一样)分别表示正无穷大、负无穷大、NaN,用于溢出和出错情况(如一个正数除以0得到正无穷大,0/0或是负数平方根结果为NaN),实际应用中很少用到,注意不能检测一个特定值是否等于Double.NaN,比如

if(x == Double.NaN)

因为所有“NaN”的值都认为是不相同的,此时可以用Double.isNaN方法来判别。
注意,浮点数值不适用于禁止出现舍入误差的金融计算中。
PS:这个语法点有时会被面试官考到,比如问你两个double值或是float值是否相同——浮点数一般是没法比较的,因为采用的是IEEE 754的表示方式,所保存的数值并不是精确的。
3.3.3 char类型
code point
建议不要在程序中使用char类型,除非确实需要对UTF-16代码但愿进行操作,最好将需要处理的字符串用抽象数据类型表示。
3.3.4 boolean类型
整型值和布尔值之间不能进行相互转换。这个和C/C++明显不同(0可以表示false,非0值表示true)。
3.4 变量
声明一个变量之后必须用赋值语句对变量进行显式赋值。
变量名必须是一个以字母开头的由字母、数字构成的序列,但Java的“字母”“数字”范围比其他语言大,字母可以是任何在某语言中代表字母的Unicode字符(如德语或是希腊语π),数字可以是在某种语言中代表数字的任何Unicode字符,但’+’、’圈C’、空格不能出现在变量名中。
Java中变量的声明尽可能地靠近变量第一次使用的地方。(PS:想知道缘由的话可以去看Effective Java)
C/C++中区分变量的声明(如extern int i)和定义(如int i  = 10),而Java中不区分这一点。
3.5 运算符
3.5.3 位运算符
“>>>”将用0填充高位,”>>”用符号位填充高位。没有”<<<“。注意:对移位运算符右侧的参数需要进行模32操作(除非左边的操作数是long类型,此时进行模64操作),如1<<35与1<<3的结果是相同的。而C/C++中无法确定是算术移位(扩展符号位)还是逻辑移位(高位填0)。执行中将会选取效率较高的一种,这就意味着,在C/C++中,>>实际上只是为非负数定义的,而Java则消除了这种模糊。
3.5.4 数据函数与常量
从JDK 1.5开始可以不必使用“Math.XXX()”的调用方式,在源文件头部引入Math包,然后就可以直接调用数学方法或是常量。
3.5.5 数组类型之间的转换
二元运算中,两个操作数中:

  • 若有一个是double类型,则另一个转换为double类型
  • 否则,若有一个是float类型,则另一个转换为float类型
  • 否则,若有一个是long类型,则另一个转换为long类型
  • 否则,两个操作数都将被转换为int类型。

3.5.6 强制类型转换
Java中允许各种数值类型之间的强制类型转换,但可能会丢失一些信息。比如:

double x = 9,997;
int nx = (int)x;

此时,nx的值为9。这是因为,强制类型转换通过截断小数部分将浮点值转换为整型。如果要对浮点数进行舍入运算,以便得到最接近的整数时,需要使用Math.round()方法:

double x = 9,997;
int nx = (int)Math.round(x);

此时nx的值为10。而使用round()方法仍需要使用强制类型转换(int)则是因为该方法返回的结果是long类型。
3.6 字符串
3.6.1 子串
substring()方法实际创建了一个新的字符串。
3.6.3 不可变字符串
不能修改Java字符串中的字符,因此String类对象被称为不可变字符串。不可变字符串有一个优点:编译器可以让字符串共享。
PS:C++字符串是可修改的(可以修改单个字符)。
3.6.4 检测字符串是否相等
一定不能用==来检测两个字符串是否相当,该操作符只能判断两个字符串是否放置在同一个位置上。
3.6.8 构建字符串
如果需要对字符串进行修改,应该使用StringBuilder类(JDK 1.5引入)。该类前身是StringBuffer,效率有些低,但允许多线程执行添加/删除字符的操作。若在单线程环境下应该用StringBuilder。
3.7 输入输出
3.7.1 读取输入
Scanner in = new Scanner(System.in);
Scanner的输入是可见的,不适合从控制台读取密码,Java SE 6引入了Console类实现该目的:

Console cons  = System.console();
String username = cons.readLine("user name:");
char[] passwd = cons.readPasswd("Password:");

3.7.2 格式化输出
Java SE 5沿用了C语言函数中的printf方法,可以用于格式化输出。
可以使用静态的String.format方法创建一个格式化的字符串,而不打印输出。
3.7.3 文件的输入与输出
读文件:
Scanner in = new Scanner(new File(“myfile.txt”));
写文件:
PrintWriter out = new PrintWriter(“myfile.txt”);
注意,如果用一个不存在的文件构造一个Scanner,或是用一个不能被创建的文件名构造一个PrintWriter,则会发生异常。
3.8 控制流程
循环中检测2个浮点数是否相当需要格外小心。如:
for(double x = 0; x!=10; x+=0.1)
可能永远不会结束。由于舍入误差,最终可能得不到精确值。x会从9.99999…直接跳到10.09999…
for循环语句可以看做是while循环的一种简化形式。
当在switch语句中使用枚举常量时,不必在每个标签中指明枚举名,可以由switch表达式值确定,例如:
Size sz = …;
switch(sz){
case SMALL:

}
可以利用break label;的方式实现goto的功能。
3.10 数组
for each循环——操作对象必须是一个数组或是一个实现了Iterator解耦的类对象。
数组初始化:

int[] smallPrimes = {2,3,5,7,11,13};

匿名的数组:new int[]{17,19,23}; ——这种语法可以在不创建新变量的情况下重新初始化一个数组。

int[] smallPrimes = new int[]{17,19,23};

Java中允许数组长度为0,数组长度为0与null不同。
数组变量直接赋值将会使得两个变量引用同一个数组,要想将数据拷贝到一个新数组,可以用Arrays类的copyOf方法。
数组排序可以使用Arrays类中 sort方法(内部实现采用了优化的快排)。
3.10.6 多维数组
多维数组声明:
double[][] balances;
初始化:
balances = new double[NYEARS][NRATES];
简化形式:

int[][] magicSquare = {
{16,3,2},
{12,1,5},
{9,8,6}
};

for each循环语句不能自动处理二维数组的每一个元素,它是按照行,即一维数组处理的。想要访问二维数组所有元素,需要嵌套的循环:

for(double[] row:a)
for(double value:row)
do sth

由于可以单独的存取一行,所以可以让二维数组中2行交换。

double[] tmp = balances[i];
balances[i]= balances[i+1];
balances[i+1] = tmp;

Java中可以创建不规则的数组。
<br/>
3.10.4 命令行参数
Java程序的main方法中,程序名并没有存储在args数组中,例如:java Message -h world 中,args[0]是“-h”,而不是”Message”或是“java”。
有用的API:
String类:

  • String trim() 删除原始字符串头部和尾部的空格。

Arrays类:

  • copyOf 拷贝数组
  • sort 对数组排序
  • binarySearch 在数组中二分查找
  • fill 填充所有数组元素为XXX
  • equal 判断两个数组下标是否相等

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)