数据类型与运算符

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中的注释主要分为以下三种

单行注释:// 注释内容(用的最多)
多行注释:/* 注释内容*/(不推荐)
文档注释: /** 文档注释*/(常见于方法和类之上描述方法和类的作用),可用来自动生成文档

注释规范

  1. 内容准确
  2. 篇幅合理
  3. 使用中文
  4. 积极向上

关键字

关键字就是一组有特定含义的单词,这些关键字往往不能作为变量名、方法名或者类名。
关键字不需要记住,随查随用。

Java常见代码错误

运行时异常

异常是一种运行错误,比较严重,一旦出现。代码就无法继续执行。

运行错误

运行错误概念广泛,有些代码没有异常,但结果不符合预期,这种就算运行错误。