Java基础常识
Java中有5个不同的地方可以存储数据
- 寄存器:在Java中无法直接控制。
- 堆栈:Java必须知道存储在堆栈内所有项的确切生命周期,对象引用存储在堆栈中。
- 堆:用于存放所有的Java对象,带
new
代码执行时,就会自动在堆中分配存储空间。 - 常量池:常量(字符串常量和基本类型常量)通常直接存储在代码内部(常量池)
- 非RAM存储
Java中的基本类型
如下图所示:
Java中的基本数据类型-
Java中还提供两个用于高精度计算的类:
BigInteger
和BigDecimal
,这两者没有对应的基本类型,且必须以方法调用方式取代运算符来实现。-
BigInteger
支持任意精度的整数。 -
BigDecimal
支持任何精度的定点数。
-
-
只有成员变量(基本类型)有默认值
0
或false
,其他的基本类型若没有初始化则会报错。 -
字符串中每个字符的大小都是
2 bytes
,从而提供对Unicode字符集的支持。
static关键字
-
static
关键字解决的问题:(在我看来,下面2点的本质都是一样的)- 只想为某特定域分配单一存储空间,而不去考虑有多少对象,或者根本没有创建对象;
- 希望某个方法独立于任何对象实例,也就是说,即使没有创建对象也能使用这个方法。
-
一个类的所有对象共享同一个static成员变量或方法,包括存储空间。
-
static
方法就是没有this
的方法。 -
在
static
方法的内部不能调用非静态方法,反过来倒是可以。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static
方法。这实际上正是static
方法的主要用途。Java中禁止使用全局方法,但你在类中置入static
方法就可以访问其他static
方法和static
域。
随机数
Random类
Random类可用来产生随机数(带种子/不带种子),不带种子的把当前时间作为种子,如下:
Random randNoSeed = new Random();// Without seed
Random randSeed = new Random(47);// With seed
int i;
i = randNoseed.nextInt(5);// i = [0,5)
在上面代码中,max = 4, min = 0
所以,得到通式:rand.nextInt((max - min) + 1) + min;
,可取得[0,4]之间的整数。
Math库里的random()
方法
Math库里的random()
方法为static方法,所以使用语句Math.random()
就可产生[0,1)之间的一个double值。
判断对象是否相等
在Java中,对于对象和基础类型,其判断的处理方法是不同的。
基础类型
使用==
和!=
即可判断值是否相等。
对象
对于对象来说,==
和!=
比较的是对象的引用,应该用equals()
方法来进行内容比较。
但是,需要注意的是eqauls()
默认行为依然是比较引用,所以我们要在自己的新类中覆盖equals()
方法,否则不会表现出我们希望的行为。
进制表示
-
0x
后面表示十六进制; -
0
后面表示八进制; -
Integer.toBinaryString(i)
可输出整数i
的二进制结果。
特殊操作符
三元操作符 ? :
i < 10 ? i * 100 : i * 10;
,如果i < 10
,执行i * 100
,否则执行后者。
类型转换
- 窄化转换(narrowing conversion)必须显式执行类型转换;
- 扩展转换(widening conversion) 则不必显示执行类型转换;
- boolean类型不允许进行任何类型的转换处理。
截尾和舍入问题
如果执行的是窄化转换,如float
和double
转换为整数,总是执行截尾,即扔掉小数点后面的数字。
如果想要执行四舍五入,则需使用java.lang.Math
中的round()
方法,使用Math.round(double/float);
语句即可。
Java没有sizeof()
在C++中,需要使用sizeof()
的最大原因是为了“移植”,Java不用考虑移植问题。
保持警惕
当一个足够大的int
值执行乘法运算时,Java不会提醒你计算结果溢出了!
for
for(initialization; Boolean-expression; step) {
statement
}
使用 for
循环应注意以下两点:
- 每次迭代前会测试
boolean
表达式; - 每次循环结束,会执行一次步进(step)。
注意:break会中断for循环,而且在抵达for循环的末尾之前,递增表达式不会执行。
需要记住的是:在Java里需要使用标签的唯一理由就是因为有循环嵌套存在,而且想从多层嵌套中break或continue出来。
foreach
foreach是用于数组和容器的,用来遍历整个数组或容器,示例代码如下:
Random rand = new Random(47);
float f[] = new float[10];
for(int i = 0; i < 10; i++)
f[i] = rand.nextFloat();
for(float x : f)
System.out.println(x);
网友评论