JAVA学习记录(第二周)20211213-20211219

219 阅读5分钟

2021年12月13日

赋值运算:

short s1 = 10;
s1 = s1 + 2;//编译失败
s1 += 2;//不改变变脸本身的数据类型

int m = 2;
int n = 3;
n *= m++;
System.out.println("m = " + m);//m是3
System.out.println("n = " + n);//n是6

int n1 = 10;
n1 += (n1++) + (++n1);//n1 = n1 + (n1++) + (++n1);//n1 = 10 + 10 +12;
System.out.println(n1);//32

逻辑运算:

  • 异或:同为假、异为真
  • a=true b=true a^b=false
  • a=false b=false a^b=false
  • a=true b=false a^b=true
  • a=false b=true a^b=true

&与&&的区别:

  • 相同点1:&与&&的运算结果结果相同;
  • 相同点2:当符号左边是true时,二者都会执行符号右边的运算;
  • 不同点:当符号左边是false时,&继续继续执行符号右边的运算,&&不再执行符号右边的运算;
  • 开发中,推荐使用&&。 |与||的区别:
  • 相同点1:|与||的运算结果结果相同;
  • 相同点2:当符号左边是false时,二者都会执行符号右边的运算;
  • 不同点:当符号左边是true时,|继续继续执行符号右边的运算,||不再执行符号右边的运算。
  • 开发中,推荐使用||。 可以通过以下代码进行测试:
boolean b = true;//可以使用false或true替换
int num = 10;
if(b && (num++))//可以使用&&短路与或||短路或替换
{
    System.out.println("do if phrase");
}
else
{
    System.out.println("do else phrase");
}
System.out.printl(num);//用于观察是否执行了num++

2021年12月14日

二进制

  • 14的原码:00001110(正数的原码、反码、补码都相同)
  • -14的原码:10001110
  • -14的反码:11110001
  • -14的补码:11110010(反码+1,计算机中存储以补码形式存储所有整数)

位运算

  • 1、位运算操作的都是整形数据
  • 2、<<是在一定范围内,向左移1位,相当于 * 2。空位补0,被移除的高位丢弃。
  • 3、>>是在一定范围内,向右移1位,相当于 / 2。被移位的最高位是0,右移空缺补0;被移除最高位是1,右移空缺补1。
  • 4、>>>,被移位的最高位无论是0还是1,空缺都用0补。
  • 5、&,只有1&1时结果是1,否则是0。
  • 6、|,只有0|0时结果是0,否则是1。
  • 7、^,相同二进制^运算结果是0,1^1=0,0^0=0;不同二进制^运算结果是1,1^0=1,0^1=1。 例如:
  • m = 13;00001101
  • n = 5 ;00000101
  • m ^ n ;00001000=8
  • 8 ^ n ;00001101=13,m = (m ^ n) ^ n
  • 将两个变量的数据交换的三种方式:
int num1 = 10;
int num2 = 20;
//方法一:定义临时变量,经常使用的方法
int temp = num1;
num1 = num2;
num2 = temp;
//方法二:可能超出存储范围,只能适用于数值类型
num1 = num1 + num2;
num2 = num1 - num2;
num1 = num1 - num2;
//方法三:使用位运算
num1 = num1 ^ num2;
num2 = num1 ^ num2;
num1 = num1 ^ num2;
  • 8、~,按补码取反。

  • 面试题:最高效的方式计算 2 * 8? 2 << 3 或 8 << 1

  • 下面是面试的一道题:答案是z=46

boolean x = true;
boolean y = false;//try y = true;
short z = 42;
if((z++ == 42) && (y = true))z++;//赋值为true表现为true,&&第一个为false短路
if((x = false) || (++z == 45))z++;//赋值为false表现为false,||第一个为true短路
System.out.println("z = " + z);

练习1,答案x = 2, y = 2

int x = 1;
int y = 1;
if(x++ == 2 & ++y == 2)
{
x = 7;
}

练习2,答案x = 2, y = 1

int x = 1;
int y = 1;
if(x++ == 2 && ++y == 2)
{
x = 7;
}

练习3,答案x = 7, y = 2

int x = 1;
int y = 1;
if(x++ == 1 | ++y == 1)
{
x = 7;
}

练习4,答案x = 7, y = 1

int x = 1;
int y = 1;
if(x++ == 1 || ++y == 1)
{
x = 7;
}

2021年12月15日

三元运算

  • 三元表达式中,表达式1和表达式2要求一致。
  • 三元运算可以嵌套使用。
  • 凡是可以使用三元运算符的地方,都可以改为if-else,反之不行。
  • 如果既可以使用三元运算又可以使用if-else,优先使用三元运算,原因简洁、高效 三个数比大小,例子:
int n1 = 10;
int n2 = 20;
int n3 = 30;
int max1 = (n1 > n2)? n1 : n2;
int max2 = (max1 > n3)? max1 : n3;

运算符优先级

  • 只有单目运算符、三元运算符、赋值运算符是从右向左运算的。
  • 单目运算符是指运算所需变量为一个的运算符,即在运算当中只有一个操作数,又叫一元运算符,其中有逻辑非运算符:!、按位取反运算符:~、自增自减运算符:++, --等。

2021年12月16日

运算符推荐使用

  • 开发中实现+2操作的两种方法:
  1. num = num + 2;//不推荐使用
  2. num += 2;//推荐使用
  • 开发中实现+1操作的两种方法:
  1. num = num + 1;//不推荐使用
  2. num += 1;//不推荐使用
  3. num++;//推荐使用
int i = 1;
i *= 0.1;//不改变i的数据类型
System.out.println(i);
i++;
System.out.println(i);

取模运算

  1. 结果的符号与被模数的符号相同。12%5=2;-12%5=-2;12%-5=2;-12%-5=-2
  2. 开发中,经常使用%来判断能否被除尽

整除 /

12/5应该等于2.4,为了得到这个结果尝实以下几种方法:

int m = 12;
int n = 5;
int result1 = m / 2;//2
int result2 = m / n * n;//10
double result3 = m / 2;//2.0
double result4 = m / n + 0.0;//2.0
double result5 = m / (m + 0.0);//2.4
double result6 = (double)m /n;//2.4
double result7 = (double)(m / n);//2.0

例题:如何求一个0~255范围内的整数的十六进制,例如60的十六进制表示形式3C

  • 自动实现
String str1 = Integer.toBinaryString(60);//111100,Integer类
String str2 = Integer.toHexString(60);//3c
  • 手动实现
int i1 = 60;
int i2 = i1 & 15;//位运算,去后四位,后四位是1100&1111,正好是1100,如果是取3位,就是和7&。
String j = (i2 > 9)?(char)(i2 - 10 + 'A') + "":i2 + "";//取出后四位看是否是大于9,因为10就要用A表示,
int temp = i1 >>> 4;//无符号位移,只有/2的时候才使用>>
i2 = temp & 15;
String k = (i2 > 9)?(char)(i2 - 10 + 'A') + "":i2 + "";
System.out.println(k+""+j);

2021年12月16日

scanner类

  • 从键盘获取不同类型变量,使用scanner类。具体步骤如下:
  1. 导包:import java.util.Scanner;。
  2. Scanner的实例化:Scanner scan = new Scanner(System.in);。
  3. 调用Scanner类的相关方法,来获取指定类型的变量。
  4. 先显示文字,后收集数据。
import java.util.Scanner;//导报
class IfTest
{
    public static void main(String[] args)
    {
        Scanner scan = new Scanner(System.in);//实例化
        System.out.println("输入考试的成绩: ");//显示用户文字
        int score = scan.nextInt();//收集数
        if(score == 100)
        {
            System.out.println("奖励BMW");
        }
        else if(score > 80 && score <= 99)
        {
            System.out.println("奖励iphone");
        }
        else if(score >=60 && score <=80)
        {
            System.out.println("奖励ipad");
        }
        else
        {
            System.out.println("什么奖励也没有!");
        }
    }
}

2021年12月19日

else说明

  1. else结构是可选的
  2. 如果多个表达式之间是“互斥关系”(没有交集的关系),哪个判断和执行语句声明在上面还是在下面,无所谓。
  3. 如果多个表达式之间是有交集的关系,需要根据实际情况,考虑清楚应该哪个结构声明放在上面。
  4. 如果多个表达式之间有包含的关系,通常情况下,需要将范围小的声明放在范围大的上面。否则范围小的就没有机会执行。score>=60范围大于score>80

输入三个数,然后把三个数从小到大排列,分支就是先用num1和num2比较然后再用num3分别跟num1和num2比较。

import java.util.Scanner;
class IfTest2 
{
	public static void main(String[] args)
	{
		Scanner shuru = new Scanner(System.in);//实例化
		System.out.println("输入第一个数:");
		int num1 = shuru.nextInt();
		System.out.println("输入第二个数:");
		int num2 = shuru.nextInt();
		System.out.println("输入第三个数:");
		int num3 = shuru.nextInt();

		if (num1 >= num2)
			if(num3 >= num1)
			{
				System.out.println(num2 + "," + num1 + "," + num3);
			}
			else if (num3 <= num2)
			{
				System.out.println(num3 + "," + num2 + "," + num1);
			}
			else
			{
				System.out.println(num2 + "," + num3 + "," + num1);
			}
		else
			if(num3 >= num2)
			{
				System.out.println(num1 + "," + num2 + "," + num3);
			}
			else if(num3 <= num1)
			{
				System.out.println(num3 + "," + num1 + "," + num2);
			}
			else
			{
				System.out.println(num1 + "," + num3 + "," + num2);
			}
	}
}

2021年12月19日

如何获取一个随机数:10-99

int values = (int)(Math.random() * 90 + 10);//[0.0,1.0)-->[0.0,90.0)-->[10.0,100.0)-->[10,99]最后一步是取整
//公式:[a,b]:(int)(Math.random() * (b - a + 1) + a)