一、内存分析(栈)
二、注释:comment
注释的作用:帮助开发人员更好的理解记忆程序的。
java 中支持三种注释:
1:单行注释 //后续的内容都是注释的内容 可以单独占用一行,用来解释说明它下面一行的代码。 还可以放到一行代码的末尾,短注释。
2:多行注释: /* 注释的内容 */
3:多行文档注释: 帮助生成阅读文档的。 javadoc.exe 可以用来识别java 源代码中的文档注释的内容。将文档注释中的内容生成一个帮助文档。
/** 文档注释的内容 */
三、运算符
1:操作数 参与运算符运算的数据。
2:表达式 操作数使用运算符连接的整体。
3:一元运算符 :需要一个操作数的运算符。 单目运算符。+1
4:二元运算符 :需要两个操作数的运算符。 1+1 1-1 双目运算符
5:三元运算符 :需要三个操作数的运算符。 三目运算符 only one。
条件运算符(判断)?返回值1:返回值2;
6:返回值: 参与所有运算符运算的数据 都是 操作数 或者表达式的返回值 参与的。
参与运算的数据计算的结果 就是 参与运算数据的返回值。
四、算术运算符 + - * / %
//运算符练习
public class TestMath{
public static void main(String[] args){
//算术运算符
// 1 + : 一元运算符(通常省略) 和 二元 运算符 (实现两个操作数相加)
//打印的是表达式 操作数 的 返回值。
System.out.println(+7);//7
System.out.println(1+7);//8
// 2: - : 一元 运算符 (负数) 二元运算符 (实现两个操作数相减)
System.out.println(-7);//-7
System.out.println(1-7);//-6
// 3 * : 二元运算符 (实现两个操作数相乘的结果) 正负号的结算的结果 和 数学中的规则一样
System.out.println(1*2);//2
System.out.println(-1*2);//-2
System.out.println(1*-2);//-2
System.out.println(-1*-2);//2
//4 / : 二元运算符 (实现两个操作数相除的结果) 整数相除结果还是整数,余数忽略。有一个操作数是小数,结果就是小数。
// 正负号的规则和数学中一样。
System.out.println(5/3);//1
System.out.println(5.0/3);//1.666666666666666667
System.out.println();
// 5 % 取余: 二元运算符 ( a%b a 除以b 得到的余数)
System.out.println(5%3);//2
System.out.println(1%3);//1
//规则:结果的符号位 与 左边的操作数相同
System.out.println(5%3);//2
System.out.println(-5%3);//-2
System.out.println(5%-3);//2
System.out.println(-5%-3);//-2
//除 和 取余 的应用技巧
//比如我得到一个三位的随机数,求三位随机数的个位 十位 百位 上的具体的数值大小。 345
final int MIN = 100;
final int MAX = 1000;
int num = (int)(Math.random() * (MAX-MIN) + MIN);
System.out.println("num = " + num);
//个位的值
int unit = num % 10;
//十位的值
int decade = num /10 % 10;
//百位
int hundred = num/100;
System.out.println(num + " 的百位是:" + hundred + "\t十位是:" + decade + "\t个位是:" + unit);
}
}
五、自增、自减
//运算符练习-2
public class TestMath1{
public static void main(String[] args){
// ++ 自增运算符 :一元运算符。对变量自身实现自增一的操作。
int age = 10;
//赋值操作最后执行。
age = age + 1;
//后缀模式 postfix
//自增后缀模式的表达式的返回值 是 变量自增之前的值。
//先返回,后自增。
age ++;
age = 0;
//后缀模式,首先 age ++ 产生返回值 返回 age 自增之前的值 num 。 然后age 做自增+1操作,然后将num 赋值给 value。
System.out.println(age ++);
int value = age ++;
System.out.println("age = " + age);
System.out.println("value = " + value);
age = 0;
value = age ++ + age ++ + age ++;
System.out.println("value = " + value);
//前缀模式 prefix
//先自增,后返回。
++ age;
age = 0;
System.out.println("age = " + ++age);
age = 0;
age = age ++;
System.out.println("age = " + age);
age = 0;
value = 0;
value = ++age + age ++ + age ++ + ++age;
System.out.println("age = " + age);//4
System.out.println("value = " + value);//8
// -- 自减运算符 ,实现 对变量自身自减一的操作。
// 前缀模式,先自减,后返回。
// 后缀模式,先返回,后自减。
}
}
六、赋值运算符
赋值运算符:=
二元运算符。
功能:将右边表达式的返回值赋值给左边的 变量或者是终态变量。
注意:赋值语句也有返回值:左边变量被赋予的值。
赋值运算符左边的:左值,右边的叫:右值。
左值:变量或者是终态变量。
右值:常量(1)、变量(age)、常量表达式(1+1).变量表达式(age + value).,常量变量表达式(1+age)。
注意:
赋值运算符 最后执行。
左值的类型和右值的类型需要兼容。
复合赋值运算符: +=、-=、*=、/=、%=、&=、|=、^=、&&=、||=
复合赋值运算符 和 普通的赋值方式的区别:
1:复合赋值运算符 生成的字节码要小一点点。省一点点内存。
2:byte value = value + 1;(错)
byte value = (byte)value + 1;(对)
byte value = 1;value ++;(对)
//复合赋值运算符
public class Test1{
public static void main(String[] args){
//对指定的变量实现自增一的操作。
int age = 10;
age = age + 1;
age ++;
++ age;
age += 1;
//自增10
//age = age + 10;
age += 10;
//自减10
//age = age - 10;
age -= 10;
//自乘10
//age = age * 10;
age *= 10;
//自除10
age /= 10;
//age = age/10;
//自余10
//age = age%10;
age %= 10;
}
}
七、关系运算符
关系运算符:关系运算符一共有6个。
都是二元运算符。用来表示运算符左右量变的关系是否成立的!
如果关系成立,关系表达式的返回值 是true。否则 是false。
>:大于,左边是否大于右边
<:小于,左边是否小于右边
>=:大于等于,左边是否大于等于右边
<=:小于等于,左边是否小于等于右边
==:等于,左边是否等于右边
!=:不等于,左边是否不等于右边。
6种数值类型的数据都可以进行 关系的比较。 byte short int long float double
char 可以被看作整数对待,所以也可以进行所有关系的比较。
布尔类型:只适用于比较是否相等(==、!=)。不能用于比较大小。
//关系运算符
public class TestReleation{
public static void main(String[] args){
System.out.println(5 > 6);//false
boolean bool = 5 != 6;//
System.out.println(bool);//true
System.out.println('a'-32 == 'A');
System.out.println('你'+0);
char c1 = 20320;
System.out.println(c1);
int age = 0;
System.out.println( age ++ > age);//false
System.out.println( age ++ < age);//true
System.out.println( age ++ == age);//false
System.out.println( age ++ != age);//true
age = 0;
System.out.println( ++ age != (age += 1));//true
}
}
八、逻辑运算符
逻辑运算符:6个。
& : 逻辑与
| : 逻辑或
^ : 逻辑异或
! : 逻辑非,逻辑取反。
&&:条件与、短路与
||:条件或、短路或
注意:参与逻辑运算的操作数 必须是 boolean值。 逻辑表达式的返回值也是 boolean 值。
//逻辑运算符
public class TestLogic{
public static void main(String[] args){
// & 逻辑与 二元的运算符。 规则:全真则真,有假则假。 表达的是并且的意思。
System.out.println((2>1) & true);//true
System.out.println(true & false);//false
System.out.println(false & true);//false
System.out.println(false & false);//false
System.out.println();
// | 逻辑或 二元运算符 规则:有真则真,全假则假。 表达的是或者的意思。
System.out.println(true | true);//true
System.out.println(true | false);//true
System.out.println(false | true);//true
System.out.println(false | false);//false
System.out.println();
//^ 逻辑异或 二元运算符 规则:相异为 真true 相同 为假false
System.out.println(true ^ true);//false
System.out.println(true ^ false);//true
System.out.println(false ^ true);//true
System.out.println(false ^ false);//false
System.out.println();
// ! 逻辑 非 一元运算符 规则:true 取反 返回 false,false 取反 返回 true
System.out.println(!true);//false
System.out.println(!false);//true
System.out.println();
// && 条件与 短路与 二元运算符 规则 全真则真,有假则假。 表达的是并且的意思。
System.out.println((2>1) && true);//true
System.out.println(true && false);//false
System.out.println(false && true);//false
System.out.println(false && false);//false
System.out.println();
// & 和 && 的区别:参与逻辑与&运算的所有的操作数表达式,都会被计算,并得到结果。不管前面的操作数是否是false。
// && 条件与 如果第一个操作数的返回值是 false,那么后面的参与逻辑运算的表达式 将不再被计算,而直接将整个逻辑表达式的返回值返回 false。
// && 效率往往高于 & 。建议使用 && 。
int age = 0;
System.out.println((10 > 12) && (age ++ != 0));//false
System.out.println("age = " + age);
// | 和 || 区别:
// | : 参与逻辑或 | 运算的所有的操作数 都会被计算,即使前面的操作数已经是 true了。
// || 短路或 : 如果进行短路或 运算的操作数,前面的操作数 的返回值 是 true,那么后面的表达式将不再被计算,而直接返回整个表达式的值为true。
// 建议使用 || 短路或。 效率相对较高一点。
}
}
九、位运算符
位运算符:直接对底层的二进制位 做操作,效率比其他的运算符要高。只对整数类型使用。
7个位运算符。
&: 按位与
|: 按位或
^: 按位异或
~:按位取反
>>:带符号右移
<<: 左移
>>>:无符号右移
//位运算符练习
import java.util.Random;
public class TestRandom{
public static void main(String[] args){
// &: 按位与 二元运算符 规则:对应的位上进行按位与 全1 则 1 有0则0.
System.out.println(3 & 5);//1
//应用技巧:可以使用按位与 得到 指定的二进制位上的表示的数值的大小。将指定的二进制位设置为0. 关灯
int age = 0b1010101;
System.out.println(age & 0xf);//5
System.out.println(age & 0b111);//5
// | : 按位或 二元运算符 规则: 对应的位上进行按位或,,有1则1,全0 则0
System.out.println(3 | 5);//7
//应用技巧:1:如果两个操作数 对应的位上没有全1 的情况,那么按位或和加结果一样。
System.out.println(1|2);//3
System.out.println(1|4);//5
System.out.println(4|2);//6
System.out.println(16|2);//18
System.out.println(7|16);//23
//找10个数,任意的组合十个数的加的结果。都是不同的。
//技巧2 :将指定位 设置为 1. 开灯
// ^: 按位异或 二元运算符 规则:相同为 0 ,相异为1. 。一个数值,先后异或了一个值2次,那么结果是它自身。
System.out.println(3 ^ 5 ^5);//3
//应用技巧:1 不需要中间变量交换两个变量的值
int num1 = 15;
int num2 = 6;
num1 ^= num2; //num1 = num1 ^ num2;
num2 ^= num1;//num2 = num2 ^ num1;
num1 ^= num2;//num1 = num1 ^ num2;
System.out.println(num1 + "\t" + num2);
//2 可以实现加密效果
//明文 密文 密钥
char c1 = '我';
char c2 = '爱';
char c3 = '你';
//密钥
int key = 5210;
System.out.println("密文:"+(char)(c1^key)+(char)(c2^key)+(char)(c3^key));
System.out.println("解密:"+(char)(c1^key^key)+(char)(c2^key^key)+(char)(c3^key^key));
// ~:按位取反 规则:所有的二进制位 0变1 1 变0
System.out.println(~0);//-1
//移位 必须是整数类型 byte ,short char int long
//如果是小于等于int 类型的数据。移动n位,如果n 大于等于32 等价于 移动 n%32位 a >> n%32
// >>:带符号右移 二元运算符 规则:低位被挤走,高位补符号位,正数补0 负数 补 1.
//应用:在某些区间内,如果想对某个数实现除以 2的n 次幂 可以通过对该数进行带符号右移n 位来实现。
System.out.println(24 >> 3);// 24/2^3=3
System.out.println(16 >> 5);// 16/2^5=0
System.out.println(-16 >> 5);// -1
System.out.println(-16 >> 2);//-4
// <<: 左移 二元运算符 规则:高位被挤走,低位补0
// 应用:在int 区间内 左移n 位 和 乘以2的n次幂等价。
System.out.println(3 << 2);// 3*2^2=12
System.out.println(5 << 32);// 5 * 2^(32-32) = 5
// >>>:无符号右移 二元运算符,规则:低位被挤走,高位补0.
//应用:得到一个正整数。
//得到区间[10~30]之间的一个随机数。
//创建得到随机数的对象
System.out.println( -16 >>> 3);
Random random = new Random();
final int MIN = 10;
final int MAX = 31;
//得到一个随机的int 值。
int num = random.nextInt();
System.out.println(num);
//得到了一个正整数
//num = num >>> 1;
num >>>= 1;
System.out.println(num);
num = num % (MAX-MIN) +MIN;
System.out.println(num);
//一句代码实现
int value = (random.nextInt()>>>1)% (MAX-MIN) +MIN;
System.out.println(value);
}
}