Java基础学习笔记 Chapter03

Chapter03

算术运算符

除法" / "的使用

System.out.println(10 / 4); //java中 2 
System.out.println(10.0 / 4); //java中是 2.5
double d = 10 / 4;
System.out.println(d); //是 2.0。 10 / 4 是2,再赋给双精度是2.0

" % "取模,取余。公式:a % b = a - a / b * b

当a是小数时,公式:a - (int)a / b * b (有小数参与的运算是近似值)

10 % 3; //1
-10 % 3;//-1 => -10 - (-10) / 3 * 3 = -10 + 3 * 3 = -1
10 % -3; //1
-10 % -3;//-1
-10.5 % 3;// => -10.5 - (-10) / 3 * 3 = -10.5 + 9 = -1.5

自增++、自减–

  1. 作为独立语句的使用:前++、后++完全等价于 i = i + 1
  2. 作为表达式使用:前++:++i先自增后赋值、后++:i++先赋值后自增
int i = 10;
i++;  //独立语句的使用
System.out.println("i=" + i); // i = 11

int j = 8;
int k = ++j; // 等价于 j = j + 1 , k = j = 9
int k = j++; // 等价于 k = j = 9 , j = j + 1 = 10
  1. 面试题:
int i = 1;
i = i++; //先赋值后自增 使用临时变量(1)tmp = i;(2)i = i + 1;(3)i = temp
// i = ++i; //先自增后赋值 (1)i = i + 1;(2)tmp = i;(3)i = temp = 2
System.out.println(i); // 1

关系运算符

结果都是boolean。instanceof:检查是否是类的对象

"yyw" instanceof String; //true

逻辑运算符

  1. 短路与 &&,短路或 ||,取反 !
  2. 逻辑与 &,逻辑或 |,逻辑异或 ^

注意:

  1. 短路与 && ,若判断第一个条件为false,则返回false,不会判断第二个条件,效率高。实际开发中使用。逻辑与 &,不管条件如何两个条件都要判断,效率低。
  2. 短路或 ||,若判断第一个条件为true,则返回true,不会判断第二个条件,效率高,实际开发中使用。逻辑与,不管条件如何两个条件都要判断,效率低。

赋值运算符

  1. 运算顺序是从右向左 int num = a + b + c; 先运算a + b+ c,再赋值给num
  2. 复合赋值运算符会进行类型转换
byte b = 3;
b += 2; //error  b = b + 2;后面是int -> byte error 
//底层有一个类型转换 等价于 b = (byte)(b + 2);编译通过,但是运行出错

三元运算符

条件表达式 ?表达式1 :表达式2

条件表达式为true,运算表达式后的结果为表达式1,若为false,则结果为表达式2

细节:

  1. 表达式1、2要为可以赋值给接收变量的数据类型
  2. 实质上是if -else 语句

运算符优先级

优先级

只有单目运算符、赋值运算符是从右向左运算的

标识符命名规则和规范

规则:

  1. 26个大小写字母、数字、_和$组成
  2. 数字不能开头
  3. 不能使用关键字和保留字
  4. Java严格区分大小写,长度无限制
  5. 标识符不能有空格

规范:

  1. 包名:多单词组成时所有字母都小写:aaa.bbb.ccc //比如 com.hsp.crm

  2. 类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz 【大驼峰】

  3. 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz 【小驼峰】驼峰法

  4. 常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ

关键字与保留字

关键字中所有字母都为小写

保留字,现Java版本没有,以后版本会使用的关键字

键盘输入

import java.util.Scanner;

public class Input{

	public static void main(String[] args) {
		
		Scanner myScanner = new Scanner(System.in);
		System.out.println("请输入:");
		String name = myScanner.next(); //接收用户输入

		System.out.println("请输入年龄:");
		int age = myScanner.nextInt(); //接收用户输入

	}
}

进制

二进制:0,1 ,满 2 进 1。以 0b 或 0B 开头。

十进制:0-9 ,满 10 进 1。

八进制:0-7 ,满 8 进 1. 以数字 0 开头表示。

十六进制:0-9 及 A(10)-F(15),满 16 进 1. 以 0x 0X 开头表示。此处的 A-F 不区分大小写

进制转换

原码、反码、补码

对于有符号的而言:

  1. 二进制的最高位是符号位:0表示正数,1表示负数
  2. 正数的原码,反码,补码都一样
  3. 负数的反码 = 原码符号位不变,其它位取反
  4. 负数的补码 = 它的反码 + 1,负数的反码 = 负数的补码 - 1
  5. 0的反码,补码都是0
  6. Java没有无符号数,java中的数都是有符号的
  7. 在计算机运算的时候,都是以补码的方式来运算的
  8. 当我们看运算结果的时候,要看原码

位运算符

按位与& 按位或| 按位异或^ 按位取反~

算术右移>> :低位溢出,符号位不变,用符号位补溢出的高位

算术左移<< :符号位不变,低位补0

逻辑右移(无符号右移)>>> :低位溢出,高位补0

没有<<<这个运算符

异或

理解为无进位相加

10110

+00111

————

10001

性质:

  1. 0^N = N , N^N = 0
  2. 满足交换律和结合律: a^b = b^a , a ^ b ^ c = a ^ (b^c)

一个数组有一个数出现了奇数次,其他数字都是偶数次,请找出该数字,如果是两个数出现了 奇数次,请找出该两数的值。

  1. 时间复杂度O(N),空间复杂度O(1),使用异或运算的性质,用一个循环,对数组的全部元素进行异或运算,结果就是出现奇数次的那个数
  2. 如果是两个数a,b,使用上述思想得到的结果是a^b,如何将两个数分开输出呢,因为这两个数不相等,其中某一个二进制位肯定不等于0,将最右边的那个1位置挑出来,写一个循环,与数组中的元素进行与运算,若结果等于0,则该结果就是a或者b,(其中肯定有其他的元素也满足该情况,但是是偶数个,则结果不受影响),再将结果与先前的结果a ^ b,进行异或得到另一个数。
int eor = 0;
int[] arr = {1,1,2,3};
for(int i = 0; i < arr.length; i++) {
    eor ^= arr[i]; // 得到a ^ b
}
int rightOne = eor & (~eor + 1); // 得到最右边的一个等于1的
int onlyOne = 0; // 用于接收其中一个数
for(int i = 0; i < arr.length; i++) {
	if((arr[i] & rightOne) == 0) {
        onlyOne ^= arr[i];
    }  
}
int theAnother = onlyOne ^ eor; // 另一个数
System.out.println(onlyOne +" "+ theAnother);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Roger Seamus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值