数据类型与运算符
int和String之间的相互转换
int=>String
int num = 10;
// 方法1
String str1 = num + "";
// 方法2
String str2 = String.valueOf(num);
+号是被String类型重载的运算符,可以起到字符串拼接的功能。
String类的静态方法valueof几乎可以把各种类型的变量转换成String类型。
String=>int
String str = "100";
int num = Integer.parseInt(str);
打印输出
基本语法
System.out.println(msg); // 输出一个字符串, 带换行
System.out.print(msg); // 输出一个字符串, 不带换行
System.out.printf(format, msg); // 格式化输出
System.out.format(format, msg); // 完全等同于printf
- println 输出的内容自带 %n, print 不带 %n .
- printf 的格式化输出方式和 C 语言的 printf 是基本一致的.
运算符
赋值运算符
=
int a = 10;
a = 20;
算数运算符
基本四则运算符
+ - * / %
规则比较简单, 值得注意的是除法:
a) int / int 结果还是 int, 需要使用 double 来计算.
int a = 1;
int b = 2;
System.out.println(a / b);
// 结果为 0
b) 0 不能作为除数
int a = 1;
int b = 0;
System.out.println(a / b)
// 运行时异常
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Test.main(Test.java:5)
c) % 表示取余, 不仅仅可以对 int 求模, 也能对 double 来求模
System.out.println(11.5 % 2.0);
// 输出结果
1.5
增量赋值运算符
+= -= *= /= %=
int a = 10;
a += 1; // 等价于 a = a + 1
System.out.println(a);
自增/自减运算符
++ - -
int a = 10;
int b = ++a;
System.out.println(b);
int c = a++;
System.out.println(c)
结论:前置++和后置++的区别主要在于取表达式的返回值。如果不去返回值,两者一样,效果等价。
++a表达式返回的是自增之后的结果. |
a++表达式返回的是自增之前的结果. |
把++操作理解成一个函数,写出以下伪代码
前置++(intnum){
num += 1;
return num;
}
后置++(int num){
int temp = num;
num += 1;
return temp;
}
看上去后置++比前置++运行效率高,实际这取决于编译器自身对代码的优化。比如在C++里,因为C++支持“运算符重载”,被++的操作数可能是一个复杂的类,这时编译器就不好优化,C++中的前置自增确实可能比后置自增效率更高。C++程序员代码都写成++a。Java中还是主要写成a++这样。
注意点:表达式的求值顺序是不固定的,一种可能的顺序。
int a=1;
int ret=(++a)+(++a);
这是错误代码,运行结果是未定义行为。
表达式的求值顺序是不固定的,一种可能的顺序。
1.++a a=>2 1.++a a=>2
2.++a a=>3 2.x=a x=>2
3.x=a x=>3 3.++a a=>3
4.y=a y=>3 4.y=a y=>3
5.x+y=>6 5.x+y=>5
Python中直接废弃了++运算,Go废弃了前置++,同时要求后置++不能进行返回值。
关系运算符
关系运算符主要有六个:
== != < > <= >=
注意: 关系运算符的表达式返回值都是 boolean 类型.
逻辑运算符
逻辑运算符主要有三个:
&& || !
注意: 逻辑运算符的操作数(操作数往往是关系运算符的结果)和返回值都是 boolean。
逻辑与 &&
规则: 两个操作数都为 true, 结果为 true, 否则结果为 false。
逻辑或 ||
规则: 两个操作数都为 false, 结果为 false, 否则结果为 true。
逻辑非 !
规则: 操作数为 true, 结果为 false; 操作数为 false, 结果为 true(这是个单目运算符, 只有一个操作数)。
短路求值
&& 和 || 遵守短路求值的规则。
System.out.println(10 > 20 && 10 / 0 == 0); // 打印 false
System.out.println(10 < 20 || 10 / 0 == 0); // 打印 true
结论:
1.对于 && , 如果左侧表达式值为 false, 则表达式的整体的值一定是 false, 无需计算右侧表达式。
2.对于 ||, 如果左侧表达式值为 true, 则表达式的整体的值一定是 true, 无需计算右侧表达式。
& 和 | (不太常用)
& 和 | 如果操作数为 boolean 的时候, 也表示逻辑运算. 但是和 && 以及 || 相比, 它们不支持短路求值。
位运算符
Java 中对数据的操作的最小单位不是字节, 而是二进制位.
位运算符主要有四个:
& | ~ ^
按位与 &: 如果两个二进制位都是 1, 则结果为 1, 否则结果为 0。
按位或 |: 如果两个二进制位都是 0, 则结果为 0, 否则结果为 1。
注意: 当 & 和 | 的操作数为整数(int, short, long, byte) 的时候, 表示按位运算, 当操作数为 boolean 的时候, 表示逻辑运算。
按位取反 ~: 针对整数,如果该位为 0 则转为 1, 如果该位为 1 则转为 0。
按位异或 ^: 如果两个数字的二进制位相同, 则结果为 0, 相异则结果为 1。
移位运算符
<< >> >>>
都是按照二进制位来运算.
左移 <<: 和C语言一样,最左侧位不要了, 最右侧补 0, 左移 1 位, 相当于原数字 * 2. 左移 N 位, 相当于原数字 * 2 的N次方。
int a = 0x10;
System.out.printf("%x\n", a << 1);
// 运行结果(注意, 是按十六进制打印的)
20
右移 >>: 最右侧位不要了, 最左侧补符号位(正数补0, 负数补1),右移同理,只不过变为/2。
无符号右移 >>>: 最右侧位不要了, 最左侧补 0。
条件运算符
条件运算符只有一个:
表达式1 ? 表达式2 : 表达式3
当 表达式1 的值为 true 时, 整个表达式的值为 表达式2 的值; 当 表达式1 的值为 false 时, 整个表达式的值为 表达式3 的值。
**?:**优先级较低。
注释
每个人的代码风格都是不一样的,编写代码的过程中,注释就显得极为重要,它能展示出一个程序员的职业素养。拥有好的注释,能给自己带来非常大的优势。可以说注释是一个人编写代码过程中的灵魂。
基本规则
Java中的注释主要分为以下三种
单行注释:// 注释内容(用的最多)
多行注释:/* 注释内容*/(不推荐)
文档注释: /** 文档注释*/(常见于方法和类之上描述方法和类的作用),可用来自动生成文档
注释规范
- 内容准确
- 篇幅合理
- 使用中文
- 积极向上
关键字
关键字就是一组有特定含义的单词,这些关键字往往不能作为变量名、方法名或者类名。
关键字不需要记住,随查随用。
Java常见代码错误
运行时异常
异常是一种运行错误,比较严重,一旦出现。代码就无法继续执行。
运行错误
运行错误概念广泛,有些代码没有异常,但结果不符合预期,这种就算运行错误。