Java学习03

第三章 操作符、流程控制

一、操作符

1.算数运算符

+,-,*,/,%
其中,%求余运算只跟左操作数的符号有关。

int n = -13 % 5; //-3
int n =13 % -5; //3
  • 如果整型0做除数时,可以通过编译,但无法运行
  • 如果时浮点型的0可以做除数运算。如果结果为正,则结果为Infinity(无穷大),如果结果为负,结果为-Infinity(负无穷大)前提是被除不为0
  • 如果是0.0/0.0,结果为NAN(not a number)非数
    其中:
    Infinity == Infinity
    -Infinity == -Infinity
    NAN != NAN
    判断某个值是否为非数
    return value != value
    Java API内置了一个方法:Float.isNAN();
    字符串相加
    //运算:从左往右 逐步进行
    // "helloa"+1 == "helloa1"
    System.out.println("hello"+'a'+1);
    // char+int==int 98+"hello" ==> "98hello"
    System.out.println('a'+1+"hello");
    // "5+5=55"
    System.out.println("5+5="+5+5);
    // 10+"" ==> "10=5+5"
    System.out.println(5+5+"=5+5")

自增,自减
eg: i++(先赋值,后计算),++i(先计算,后赋值)
i–, --i
反编译命令: javap -c 字节码.class
面试题

public static void main(String[] args) {
 int x = 4;
 int y = (x--) + (--x) + (x * 10);
    System.out.println("x: " + x); // x: ?
    System.out.println("y: " + y); // y: ?
}

x:2 y:26

2.赋值运算符

+=,-=,=,/=,>>=,>>>=,<<=,&=,^=,|=
注意:+=、-=、
=、/= 等扩展的赋值运算符,隐含了强制类型转换

3.移位运算符

在这里插入图片描述
需要先获取操作数的二进制形式(补码),然后按位进行操作。
对于右移:
>>低位抛弃,高位补符号位的值
>>>低位抛弃,高位补0
对于左移:
<<高位抛弃,低位补0
对于一个正整数来说,右移几位相当于给当前值除几个2,余数抹去
左移,相当于给左移几位给当前值乘几个2。

        // 00000101 -> 00001010
        System.out.println(5 << 1); // 10
        // 00000101 -> 00010100
        System.out.println(5 << 2); // 20
        // 00000101 -> 00101000
        System.out.println(5 << 3); // 40

4.位运算符

在这里插入图片描述
位运算
1、位运算过程:按比特位逐位进行计算,每一位计算结果连起来作为最终的计算结果
1)计算23 & 77
23: 00010111
77: 01001101
result: 00000101 (5)
2)计算23 | 77
23: 00010111
77: 01001101
result: 01011111

2、便捷计算方式
1)与运算
快速将一个数拆分为若干个2的n次方之和,
然后判断哪些值是两个操作数中都包含的部分,相加即可。
例如,计算23 & 77:
23拆分为16、4、2、1
77拆分为64、8、4、1
其中,4和1是两个数都包含的部分,所以23 & 77的结果为4 + 1 = 5。
相当于【交集运算】。
2)或运算
与上面与运算原理基本一致,只是将【交集运算】改为【并集运算】。
例如,计算23 | 77:
23拆分为16、4、2、1
77拆分为64、8、4、1
相当于计算{16, 4, 2, 1} ∪ {64, 8, 4, 1}
结果为{64, 16, 8, 4, 2, 1}
所以结果为64 + 16 + 8 + 4 + 2 + 1 = 95
(这里也可以运用快捷计算127 - 32 = 95)。

5.逻辑运算符

&&与运算,带逻辑短路,结果为布尔值
||或运算,带逻辑短路,结果为布尔值
!取反,true取反位false。反之亦然
&与运算,不带逻辑短路
|或运算,不带逻辑算路
^异或,相同为假,不同为真

// 综合案例
int i = 6;
int j = 10;
if (i++ >= 7 && j-- <= 10) {
    System.out.println("hello");
}
System.out.println(i);
System.out.println(j);
/*
 * 1、控制台输出的结果是什么?
 * 7  10   i先进行运算,再进行自增运算,得到结果为false之后,由于逻辑短路,致使后面的代码不再执行。
 * 2、如果把i++换成++i,则输出结果为?
 * hello 7 9
 * 3、在第二问的基础上,把第二个判断条件改为--j>=10,输出结果是什么?
 */  7 9

扩展:
1.给定⼀个任意int数,指定将它的某⼀位置为0。
例如:01101101,将第3位置0。
和11111011这个数进⾏&运算即可。
2、给定⼀个任意int数,指定将它的某⼀位置为1。
例如:01101101,将第5位置1。
和00010000这个数进⾏|运算即可。

二、流程控制

1.顺序结构

代码从上到下按照编写的顺序依次执行

2.if判断

if结构,if-else结构,if-else if结构

3.switch分支

switch也称分支语句,与if类似,但是只支持byte,short,int,char四种类型的比较,jdk5加入了枚举,jdk7加入了String
switch(表达式){
case 值1:
语句;
break;
case 值2:
语句;
break;
……
default:
语句;
break;
}
case:后面跟的是和表达式进行比较的值
break:表示中断,结束,用来结束switch语句
default:所有值都不匹配的时候,执行该处内容。

switch语句执行时,程序会挑选符合要求的case分支作为起点,一直向下运行(包括运行其他case中的语句),直到遇到break或执行完所有语句才会结束。
default:如果所有case中的某个条件满足了,不会刻意触发default的执行
如果所有case声明的值都不满足条件,才会从default处开始执行。

4.while循环

初始化语句1;
while (条件判断语句2) {
循环体语句3;
条件控制语句4;
}

while死循环
while(true){}

5.do-while循环

初始化语句1;
do {
循环体语句3;
条件控制语句4;
}while(条件判断语句2);

  • do…while先执行一次循环体,然后判断条件是否成立,是否继续执行循环
    体(先执行后判断
  • for和while循环先判断条件是否成立,然后决定是否执行循环体(先判断后
    执行)

6.for循环

for(初始化部分;循环条件;迭代部分){
//定义循环体部/执行部
}

//死循环
for(;😉{ sout(); }

7.break

循环语句遇到break关键字,循环直接结束

8.continue

循环语句中遇到continue关键字,本次循环结束,进入到下一次循环

9.label

代码中出现多层嵌套,label标签配合break关键字,可以让程序从内部循环中跳出。
在双层嵌套时,可用label给外层循环添加名称,当执行到某个条件时,可以使用break和外层循环名称直接跳出外层循环,循环结束。

10.Random

使用Math.Random();可以得到0~1左闭右开的随机数。
例如,输出一个20-30之间的随机数

int i = (int)(Math.random() * 31) + 20
Random r = new Random();
int num = r . nextInt(n);
int number = r.nextInt(max - min + 1) + min;

三、方法

1.定义

[修饰符] 返回值声明 方法名([参数列表]) [异常声明]{
//方法体部
}
[]表示一种可有可无的结构
修饰符:都是Java中的一些关键字,访问修饰符(public,private),static,final,abstract,synchronized
方法的修饰符可以有多个,如果有多个修饰符,不存在优先级问题。
注意事项:
带参方法定义时,参数中的数据类型与变量名都不能缺少,缺少任意一个
程序将报错
带参方法定义时,多个参数之间使用逗号(,)分隔

2.调用

方法名(实际参数列表);
注意事项:

  • 方法必须先定义,再调用
  • 实际参数列表可以是常量,也可以是变量,也可以是表达式
  • 实际参数类型要匹配形式参数类型(要么完全相同,要么能自动隐式类型转换)
  • main方法是入口方法,一个程序中唯一,其可以调用其他普通方法
  • 其他方法不能调用main方法,普通方法可以相互调用

3.重载

同一个类中定义的多个方法,如果同时满足下列条件,则构成方法重载:

  • 多个方法在同一个类中
  • 多个方法具有相同的方法名
  • 多个方法的参数列表不相同(类型不同或者数量不同)
  • 重载跟函数的返回值类型无关

在一个类中定义的变量是无法干涉其他类中变量的值的,即使他们的变量名称相同
System.exit(0);直接结束JVM虚拟机。

扩展

int b=5;
    if(b>4)b--; System.out.println("b⼤于4");
    else {
     System.out.println("b不⼤于4"); 
   }

编译报错,if后缺少花括号,if后如果没有花括号,则紧跟if的第一句执行体的代码才属于if之下。

int count=0;
while(count>0);
{
 System.out.println(count);
}

会输出0,whlie循环后加分号,循环结束

如果是while(true);代码会陷入死循环,后面如果还有代码将会编译报错。

在这里插入图片描述
JVM内存管理三个大的子系统(或者五个)类加载器,运行时数据区,执行引擎(本地接口库,本地方法库)

类加载器:类加载系统,查找和加载.class字节码文件,读取文件中的信息,装载进JVM内存。
运行时数据区:用来保存程序运行期间的所有数据。

虚拟机栈(Stack):客栈(宾馆)、货栈
容量小
临时性
进出快
有一些操作执行顺序和退出顺序是相反的
总结:栈负责保存体积小、生命周期不太长的数据(基本数据类型变量的值、局部变量)
栈默认情况下容量只有1MB。

栈在Java运行过程中,与方法的执行有密切关联,栈中允许保存的数据全部都是跟方法有关的。
虚拟机栈和数据结构中的栈采取类似的结构和规则(FILO,first in, last out)
当每个方法被调用的时候,JVM都会对虚拟机栈进行一次压栈,开辟的这一块栈中的空间称为“栈帧”。
每个方法每次被调用的过程中,都拥有一个自己专用的存储空间,这个空间中保存的数据无法被其他方法访问。这个空间就是“栈帧”

栈帧:
1、局部变量表
注意:方法的局部变量在方法被调用了,执行期间,才会出现在内存中。在方法没有被调用的时候,局部变量实际上是不存在的。
局部变量表中包含:
1)方法定义的参数
2)方法内部定义局部变量
2、操作数栈
用于完成一些算数运算
3、返回地址
4、动态链接
5、其他的描述信息…

堆(Heap):
容量大
保存生命周期比较长的数据
具体功能:用来保存Java程序运行期间的所有对象
Java中创建的所有的对象(new)实际上都是在堆中开辟了空间,保存这个对象的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值