一、条件运算符:
java 中唯一的一个三目运算符。 需要三个操作数(三个表达式)。
语法:表达式-1 ? 表达式-2 :表达式-3 ;
表达式-1: 必须是一个boolean 表达式(返回值是boolean值的表达式)。
表达式-2,3 是java 任意的表达式,但是两个表达式的返回值的类型要兼容。
执行过程:
1:计算表达式-1的返回值。
2:根据表达式-1 的返回值 ,如果是true,那么就执行表达式-2 并返回该值作为整个条件表达式的返回值。
3:如果 表达式-1 的返回值 是 false,那么就跳过表达式-2 ,执行并返回表达式-3 的值。
//条件运算符
public class TestThree{
public static void main(String[] args){
// 随机得到两个随机数,[10-30],打印结果。
// 将两个随机数中比较大的值输出。
//定义区间
final int MIN = 10,MAX = 31;
int num1 = (int)(Math.random()*(MAX-MIN)+MIN);
int num2 = (int)(Math.random()*(MAX-MIN)+MIN);
int num3 = (int)(Math.random()*(MAX-MIN)+MIN);
System.out.println("num1 = "+ num1 + "\tnum2 = "+num2 + "\tnum3 = "+num3);
int max = 0;
// max = num1 > num2 ? num1 : num2;
// max = max > num3 ? max : num3;
max = num1 > num2 ? (num1 > num3 ? num1 : num3) : (num2 > num3 ? num2 : num3);
System.out.println("max = "+max);
}
}
äºã 运算符优先级
规律: 1:乘除取余 优先级大于 加减
2:同级优先级 根据结合性结合。
3:小括号优先级最高。
4:一元运算符大于二元的,二元的大于三元,赋值运算符优先级最低。
口诀:单目算术为关系,逻辑条件后赋值。
单目:单目运算符! + –(负数) ++ --等
乘除:算数单目运算符* / % + -
为:位移二目运算符<< >>
关系:关系二目运算符> < >= <= == !=
逻辑:逻辑二目运算符&& || & | ^
条件:唯一的三目运算符A > B ? X : Y
后:无意义,仅仅为了凑字数
赋值:赋值=
ä¸ã 算术运算时数据类型的转换
注意:java 不支持不同类型的数据之间的运算。
如果是不同类型的数据进行运算,那么编译器会对不同的类型的数据进行类型的统一的转换。转换为统一类型之后才能做运算。
自动类型转换的规则:因为这种转换是安全的。
1:如果操作数 的类型 是 byte,char ,short ,int 中的一个或者几个。那么这些操作数的类型要被自动转换为 int 类型然后再做运算。结果也是int。这种转换不会修改数据的大小,只是数据使用内存空间的大小的变换。
2:如果操作数 的类型 是 byte,char ,short ,int,long 中的一个或者几个,而且有long类型的数据存在。那么这些操作数的类型要被自动转换为long类型然后再做运算。结果也是long。
3:如果所有的操作数的类型中,最大的类型是float,那么所有的操作数的类型都向float转,结果也是float。
float 类型表示的范围大于 long。
4:如果所有的操作数的类型中,最大的类型是double,那么所有的操作数的类型都向double转,结果也是double。
double 类型表示的范围最大。
自动类型转换:
从 int 到 float,有可能损失精度。
int 到 float 可能损失精度,int 最大 2147483647, float 有效数字个数是 6-7, 会失去有效数字个数引起的精度。
float 到 int 会失去小数部分,也就损失精度了。另外, float允许数值范围大于int,超出int允许范围。
åã 赋值时转换
赋值的时候的类型的转换。
1:自动向上类型转换:可以将一个小类型的数据直接赋值给一个大类型的变量。因为安全。小类型向大类型自动转换,因为安全。
2:强制向下类型转换:
整数的强制向下;直接将高位砍掉。
浮点数 到 整数 强转;先直接砍掉小数点。然后再按照整数的规则砍。
强制转换不能确保是安全的。
public class TestChangeType{
public static void main(String[] args){
int age = 10;
byte value = 10;
int num = value;
System.out.println(num);
byte value1 = 12;
byte value2 = 10 + 23;//没有问题
// 在编译期,是不知道变量的值的。但是对于常量值,编译器是可以判断赋值 是否安全。
byte value3 = (byte)(value1 + value2);
System.out.println((short)128.349329329);//-128 1000 0000 0111 1111
}
}
字符串连接时的数据转换:
"123" + 123 :字符串和其他的类型也是不能直接连接的,其他的类型需要转换为字符串才能和字符串做连接。这个基本数据类型的数据到字符串的转换,是由底层的方法调用来完成。
例1:
import java.util.Random;
/*得到一个随机字符[A-Z]or[a-z] (大小写也要随机),并打印。*/
public class TestRandomBoolean{
public static void main(String[] args){
Random ran = new Random();
//定义区间[A-Z][65-90][a-z][97-122]
final int MIN_1 = 65,MAX_1 = 90,MIN_2 = 97,MAX_2 = 122;
System.out.println(ran.nextBoolean() ? (char)(Math.random()*(MAX_1 - MIN_1) + MIN_1) : (char)(Math.random()*(MAX_2 - MIN_2) + MIN_2));
}
}
例2:
import java.util.Random;
/*随机生成两个数,[0-100],然后输出,然后实现用一个int类型的变量num 保存两个数的算法.*/
public class TestMemory{
public static void main(String[] args){
Random ran = new Random();
//定义区间[10-100]
final int MIN = 10,MAX = 101;
int num1 = (int)(Math.random()*(MAX - MIN) + MIN);
//获得的随机数可能为负,>>> 1 转换成 正整数;
int num2 = (ran.nextInt() >>> 1) % (MAX - MIN) + MIN;
System.out.println("第一个数 = " + num1 + "\t第二个数 = " + num2 );
int num3 = num1 << 16;
int num4 = num2 | num3;
System.out.println("存储的int型 = " + num4 );
int num5 = num4 & 0b1111111111111111;
int num6 = num3 >> 16;
System.out.println("==========================================\n解出来第一个数 = " + num6 + "\t解出来第二个数 = " + num5 );
}
}