l
产生随机数
可以建立一个Random类的对象,然后调用其nextXXX方法来产生随机数。
Random对象可以设定种子,如果多个Random对象使用了同一个种子的话,那么同时调用在各个对象上调用nextXXX方法后将产生相同的随即数。
另外产生0.0<=X<1.0的double的随机数,可以使用Math类的静态方法random()来实现,这个更好用,免得建立对象。
l
逻辑运算符需要注意的地方
Java中的逻辑运算符只有“与(&&)”“或(||)”“非(!)”三种,并且只能作用于布尔值,不像C/C++中,非布尔类型的值也可以参与逻辑运算(即非0(false)即1(true)的道理不适用于java)。
Java中的false和true用在需要String类型的地方,将自动转换为文本形式。
在逻辑运算会出现短路现象,即先前有部分布尔表达式可以确定整个表达式的真值后就不再往后计算布尔值了。
l
按位运算和移位操作(这些操作涉及底层,java
中用到情况较少,理解即可)
按位运算(&,|,~,^)主要针对整数类型的变量,计算的是转换为二进制补码形式后的值。返回一个整数变量。
移位操作符的操作对象也是二进制形式的。有左移<<,有符号右移>>,无符号右移>>>。
<<:将操作符左边的变量左移右边指定的位数,在地位补0
>>:将操作符左边的变量右移右边指定的位数,如果原先是正数,在高位补0,原先是负数,在高位补1.
>>>:将操作符左边的变量右移右边指定的位数,不管正负,都在高位补0
无符号右移>>>
是java
特有的,C/C++
中没有。
这两种运算都是将整数类型变量转换机器中的二进制补码形式来计算的。
l
“+
“操作符的注意事项
出现+操作符的表达式中,如果只有基本类型变量则是进行简单的加法运算
如果在表达式中出现了String字符串,则在字符串之前的基本类型变量是求和,并将和转换为字符串,与后面进行连接,而之后的基本类型变量都是转换为字符串进行连接
如: 1.1+2.0+
“abc
“+1+1.2
打印出来为”3.1abc11.2”
(对所有基本类型变量都是如此,不管int
或float
,double
)
l
基本类型的类型转换
Java中的基本类型可以转换为任何一种其他的基本类型(除了布尔类型之外)。
向上转型的时候不需要强制转换,向下的时候需要
精度的向上趋势为:byte->char->short->int->long->float->double
Java中的整数有十进制,八进制(0开头+1~7),十六进制(0x开头+1~9和a~f
)三种表示方式。
Java中的浮点数有定点表示法和科学计数法(例子:1e-2 = 1*10
-2)
long,float,double类型的变量后面可以分别加大写或者小写的l,f,d后缀
默认情况下,整数为int型,浮点数为double型。当需要声明其他基本类型的变量时要显示加上后缀
当用常量给变量赋值时,建议用加后缀的方法,不要使用向下转型,尤其是float
提升:在基本类型变量的算术计算过程中,返回的值类型是表达式内最大的数据类型,计算过程中所有变量都会自动装换成最大的数据类型
至于类的数据类型转换涉及到继承的概念。只能在类族中转换
l
Java
中没有sizeof
()
在C/C++使用sizeof方法来获得数据项所占用的字节数。这样做的目的是为了便于“移植“,在进行一些与存储空间有关的计算中需要用到,而java之所以不需要这个方法,是因为java中所有类型在所有机器的大小都是相同的(基本类型所占空间大小是固定不变的)。Java的跨平台性在这儿得到了很大的体现。
l
算符优先级的注意事项
int i = 1;
System.out.println((i++)+(++i));
System.out.println(i);
输出结果如下:
第一行: 4
(是1+3
得到4
)
第二行: 3
当自动增加和自动递减操作符与加减操作一起参与运算时,以上面的示例,按照优先级先执行(i++),后执行(++i),最后执行+相加操作。
详细描述: 第一步; 执行i++ 时,先产生值1,后更改i为2;
第二步; 执行++i 时,先更改i为3 (此时由前面一个i++将i更改为了2),后产生值3;
第三步; 最后执行+时,为1+3,所以得出4
规律是要先判断出复杂表达式中的各个子项计算的优先级,然后从左往右依次计算每个相等的子项(先计算算完高优先级的子项族,后计算低优先级的)。
同时++
和- -
在前面时是先计算(加/
减1
)后产生值,在后面时是先产生值后计算(加/
减1
)
l
java
中的控制语句有if-else,while,do-while,for,switch
无限循环方式有
while(true),for(;;)
java中反对使用
goto语句,所以没有该语句.但是有标签一说,利用标签加break/continue可以更加安全得实现跳转
标签用后面跟冒号的标识符来表示
,标签直接放在循环语句之前.如:
outer: while(true){
inner: while(true){
continue outer;
break outer;
}
}
以上代码声明了
outer和inner两个标签.并且可以通过continue/break+标签的方式来完成跳转
跳转说明
:
(1)一般的
continue不往下执行循环内的语句,直接返回最内层的循环开头,并继续执行
(2)一般的
break不往下执行循环内的语句,直接中断并退出最内层的循环.
(3)带标签的
continue不往下执行语句,直接返回标签所在处的循环开头,并继续执行该循环
(4)带标签的
break不往下执行语句,直接中断并退出标签所在处的循环.
要了解什么场合使用哪种方式
:
java
中使用标签的唯一理由就是实现多层循环之间的跳转!!!
使用标签和continue/break方式来实现跳转要比用标记变量来实现多路选择时间开销小,更高效(参考例子,求一个整型数组中的所有质数)
如果要退出方法可以简单得用一个
return语句即可
l
switch
语句用法
switch(param){
case param1 : statement ; break;
...同上
default : statement;
}
这里面的
break语句不一定每行都要(最后一句完全可以不要,要了也没意义),看你想让程序流程怎么走了.
同时可以多个
case语句放在一起对应同一个statement.
switch和
case的参数接受int和char两种类型,char实际上也是转换为整型的acsii码值计算的.对于非整数类型必须使用一系列if语句实现多路选择
l
关于char,int,double类型的变量之间的相互转换
char和
int : 通过ascii值来进行转换的.
char c = 'a';
int i = c; //i的值为
'a'的ascii值97
char t = (char) i;//t的值为
97所对应的字符'a'
int和
double :
double d = 97.23;
int i = (int)d;//d直接将其小数部分砍掉赋值给
i,i为97
double t = i;//i在小数部分加
.0赋值给t,t为97.0
char和
double :
两者转换借助int这个桥梁来完成
l
用常量给char,short赋值问题
char c = 97;和
char c = 'a';//这两个语句效果一样的,char也接受ascii码赋值,实际上c的值都是'a'
short s = 50;//可以将整数常量直接赋值给
short类型的变量,但如果使变量转换要加强制类型转换符
l
四舍五入的方法以及Maht.floor()和Math.ceil()方法
Math.round(double val)//对
val的小数点后第一位进行四舍五入,并将结果转换为long类型的值
Math.round(float val)//对
val的小数点后第一位进行四舍五入,并将结果转换为int类型的值
如果希望四舍五入后保留小数点后N位的话,要用BigDecimal来实现
方法如下
:
double val = 1.2345;
BigDecimal bd = BigDecimal.valueOf(val);//不要用带
double类型参数的构造函数,防止精度损失
BigDecimal one = new BigDecimal("1.0");
bd = bd.divide(one,N,BigDecimal.ROUND_HALF_UP);
//此时的
bd即为1.2345保留了小数点后N位之后产生的值了
可以参考之前的笔记
(介绍BigDecimal和BigInteger的那一节).
Math.floor(double val)和
Math.ceil(double val)方法分别将val向下,向上取整,返回的是double类型的值,小数点后只有一位即(.0)
l
产生随机数的方法
Math.random()返回的是
[0,1)范围内的随机小数
通过对
Random的实例调用nextInt(int val)方法,产生的是[0,val)范围内的随机整数
(一
)产生一定范围内的随机整数
设要求范围是
[min,max)
表达式
: Random rand = new Random();
int i = rand.nextInt(max-min)+min;//i保证在要求的范围内
(二
)产生一定范围内的随机浮点数
设要求范围是
[min,max)
double d = Math.random()*(max-min)+min//d保证在要求的范围内
总体是该思路,至于范围的边界开闭细节,要具体情况具体考虑