Java答疑—初学者常见的几个问题

2017-05-12

1. 基本数据类型


Q. 为什么 -0/3 结果是 0,而  -0.0/3.0 结果是 -0.0?

A. 在Java里,整数是通过补码来表示的。0通常是只有一种表示方法。另一方面,浮点数则是用 IEEE 标准表示的, 浮点数因为后面有小数位: 0 和 -0。


Q. 我可以用 % 除以一个小数吗?

A. 当然可以。比如,如果 angle 是一个非负数,那么 angle % (2 * Math.PI) 就会把 angle 转换到 0 到  2 π 之间。


Q. 当 a b 全为基本类型的变量时,a += b 和 a = a + b 的效果有区别吗?

A. 当 a 和 b 的类型不同时,语句的效果就截然不同。 a += b 等同于 a = (int) (a + b),它这时可以是 a是int型,b为f浮点型。但是同等情况下 a = a + b 就会编译报错。


JAVA3.jpg

2.  数组



Q. Java开发人员当中有些人会用 int a[] 而不是 int[] a 去声明一个数组。这种区别是在哪里?

A. 在Java中这两种声明都是可以的,而且能够达到一样的效果。在C中的定义一个数组的方法我们建议用第一种,后者则是Java开发所推荐的使用的方法。



Q. 为什么数组下标是从0 开始的而不是从 1 ?

A. 这就要追溯到机器语言的编程的方法了。在机器语言中,数组的下标是被用来计算元素的位置与第一个元素之间的偏移量。如果下标是从1开始的话,计算的偏移时还需要做一次减法运算,那是资源的种浪费。



Q. 如果选择负数作为数组的下标会有什么不一样?

A. 数组的下标如果是小于0 或者 大于与等于数组的长度,文件在编译运行时会抛出 ArrayIndexOutOfBoundsException 异常,同时会中止程序的运行。




Q. 我可以从标准的input中重新读一次数据吗?

A. 当然这是不可以,只能允许被读一次。


Q. 怎样输入 end-of-file (eof) 符号?

A. 操作系统自动包括它了。


Q. 使用 printf() 时还有哪些用法?

A. 对于整数来说,使用 o 输出八进制,使用 x 输出十六进制。对于浮点数来说,使用 e 或者 g 输出科学计数法形式。



Q. 行结束的符号是?

A. 文件系统类型不同使用的也是不同的符号。 Unix 系统,是 '' ; Windows 系统,是"" ; Macs 系统,是 "" 。



 

4. 函数调用



Q. 常常感到疑惑是当把数组当作函数调用时的参数?

A. 这时你就需要牢记的传值参数(参数是基本变量的类型)和传引用参数(比如数组)之间的区别。


Q. 把所有的参数都使用传值的方式可行吗?

A. 当数组的长度很大时,这时复制数组需要比较大的性能的开销。由于这个原因,绝大多数变成语言都支持把数组传入函数中但不复制一个数组的副本。

 


5. 递归调用


Q. 可以只用循环而不用递归吗?

A. 不可能,所有的循环都能够用递归来替代,虽然在绝大多数的情况下,递归需要占据额外的内存。


Q. 有没有只能用递归而不能用循环的情况?

A. 不肯能,所有的递归调用都可以用循环来表示。比如用循环的方式来实现栈。


Q. 那我应该选择哪个,递归的方式 还是 循环的方式?

A. 根据代码的可读性和效率性之间做权衡。


Q. 我担心使用递归代码时的空间开销和重复计算(例如用递归解Fibonacci)的问题。有没有其他需要担心的?

A. 在递归代码中创建大数据类型(比如数组)时需要额外注意,随着递归的推进,内存使用将会迅速增加,由于内存使用增加,操作系统管理内存的时间开销也会增加。

 


上一篇:蓝桥java学习的故事,让初入职场的你受益

下一篇:java的时代,linux命令也没有落下