算术运算符
Java 中的算法运算符, 包括以下几种:
算术运算符 | 名称 | 举例 |
+ | 加法 | 1+2=3 |
- | 减法 | 2-1=1 |
* | 乘法 | 2*3=6 |
/ | 除法 | 24/8=3 |
% | 求余 | 24%7=3 |
++ | 自增 1 | int i = 1; i++ |
-- | 自减 1 | int i = 1; i-- |
我们本文要重点讲的是 "++" 和 "--", 其他的算术运算符相对比较简单直观, 本文就不花精力去讲解了, 之所以要把 "++" 和 "--" 单独拿出来讲, 是因为在使用他们的时候有很多坑需要开发者注意, 最重要的是 "++" 和 "--" 也是面试题中高频出现的面试题.
先来看 "++" 的基本使用:
- int i = 1;
- int i2 = ++i; // ++i 相当于 i = 1 + i
- System.out.println(i); // 2
- System.out.println(i2); // 2
++i 和 i++ 的区别
++i 先自加再赋值
i++ 先赋值再自加
比如:
- int i = 0;
- int i2 = i++;
- int j = 0;
- int j2 = ++j;
- System.out.println("i2="+i2);
- System.out.println("j2="+j2);
输出结果:
i2=0 j2=1
代码解析: i++ 是先给 i2 赋值再自身 +1 , 所以 i2 等于 0 , 而 ++j 是先自加等于 1 之后, 再赋值给 j2 , 所以 j2 等于 1 .
注意事项
++/-- 是非线程安全的, 也就是说 ++/-- 操作在多线程下可能会引发混乱, 例如下面代码:
- private static int count;
- public static void main(String[] args) {
- new Thread(){
- @Override
- public void run() {
- for (int i = 0; i <100000; i++){
- System.out.println("thread:" + this.getName() + ",count=" + (++count));
- }
- }
- }.start();
- new Thread() {
- @Override
- public void run() {
- for (int i = 0; i < 100000; i++){
- System.out.println("thread:" + this.getName() + ",count=" + (++count));
- }
- }
- }.start();
- }
执行的结果, 如下图:
如上图所示, 每台机器的执行结果可能略有差距, 但大多数情况下并不能给我们想要的真实值 200000.
原理分析
"++" 操作在多线程下引发混乱的原因: 因为 ++ 操作对于底层系统来说, 并不是一条 CPU 指令, 而是 三条 CPU 操作指令一一取值, 累加, 存储, 因此无法保证原子性, 就会出现上面代码执行后的误差.
如何避免 ++/-- 操作在多线程下的 "误差"?
方法一: ++/-- 操作放在同步块 synchronized 中.
方法二: 自己声明锁, 把 ++/-- 操作放入其中.
方法三: 使用 AtomicInteger 类型代替 int 类型.
最后, 因为 -- 的语法和 ++ 完全一致, 所以 -- 的操作, 请参照上面的 ++ 语法.
- String s = 3> 1 ? "三大于一" : "三小于等于一";
- System.out.println(s);
- int i = 1;
- if (i> 1){
- System.out.println("i 大于一");
- }else if (i == 1){
- System.out.println("i 等于一");
- }else {
- System.out.println("其他");
- }
- int i = 0;
- while (i < 3){
- System.out.println(++i);
- }
- int i = 0;
- do {
- System.out.println(++i);
- }while (i < 3);
- for (int i = 0; i < 10; i++){
- System.out.println("i =" + i);
- }
- for (int i = 1; i < 4; i++){
- if (i == 2) continue;
- System.out.println("i=" + i);
- }
来源: http://www.bubuko.com/infodetail-3253588.html