Java 运算符

运算符指明对操作数的运算方式。组成表达式的Java有很多种。运算符按照其要求的操作数数目来分,可以有一元(单目)运算符,二元(双目)运算符和三元(三目)运算符,它们分别对应于1个、2个、3个操作数。运算符按其功能来分,有算术运算符、赋值运算符、关系运算符、逻辑运算符、位运算符和其他运算符。

下图表示运算符的优先级和结合性。

java运算符.png

注:结合性的左表示先算符号的左半部分,例如:1+2+3 按照先后应该是(1+2)+3,右就表示先算符号的右半部分。

算数运算符( +、-、*、/、%、++、 --)

算数运算符和平时在数学中的应用基本一致。

    /**
     * 算数运算符 测试
     */
    private static void arithmeticOperator() {
        int a = 102;
        int b = 5;
        int sum = a + b;            //两数之和
        int difference = a - b;     //两数之差
        int product = a * b;        //两数之积
        int quotient = a / b;       //两数之商的整数部分
        int remainder = a % b;      //余数: a - b*(a/b)
        int c = a++;                //a 放在++之前表示 c 先取到a原来的值,之后a自增1,此时a = 103
        int d = ++a;                //a 放在++之后表示 a先自增1,即103+1=104,之后d取到现在a的值.
        System.out.println("a + b =" + sum);
        System.out.println("a - b =" + difference);
        System.out.println("a * b =" + product);
        System.out.println("a / b =" + quotient);
        System.out.println("a % b =" + remainder);
        System.out.println("a++ 的值" + c);
        System.out.println("++a 的值" + d);
    }
算数运算符

关系运算符(==、!=、<、>、<=、>=)

关系运算符用于比较两个数值之间的大小,其运算结果为一个逻辑类型(boolean布尔类型)的数值。

    /**
     * 关系运算符 测试
     */
    private static void relationalOperator() {
        int a = 100;
        int b = 50;
        System.out.println("a 等于 b :" + (a == b));
        System.out.println("a 不等于b:" + (a != b));
        System.out.println("a 小于 b :" + (a < b));
        System.out.println("a 大于 b :" + (a > b));
        System.out.println("a 不小于b:" + (a >= b));
        System.out.println("a 不大于b:" + (a <= b));
        //注意: 当 == 在比较对象时,比较的是对象的内存地址,而不是对象的属性和值
        String s = "hello";
        String str = "hello";
        String s1 = new String(s);
        String s2 = new String(s);
        System.out.println("s 等于 str:" + (s == str));        //true, 如果String缓冲池内存在与其指定值相同的String对象,
        // 那么此时虚拟机将不为此创建新的String对象,而直接返回已存在的String对象的引用,和基本类型数据相似
        System.out.println("s1 等于 s2 :" + (s1 == s2));//false ,s1和s2是String两个不同的对象.
        System.out.println(" s 等于 s1 :" + (s == s1)); //false ,s == str != s1 != s2

    }

关系运算符

注:"=="习惯用于原生(primitive)类型之间的比较,当== 用于对象之间的比较时,比较的是对象的内存地址

逻辑运算符(&、| 、!、 ^、 &&、 ||)

逻辑运算符要求操作数的数据类型为布尔型,其运算结果也是布尔型。


逻辑运算符

需要注意的是:

  • 异或 ^ :两边相同时为flase,两边不同时为true;
  • & | 和 && ||的区别:& 和 && 都表示"与",只是&&具有短路的功能,也就是所当 && 左边为false时就跳过右边的判断,不管右边是什么结果都为false,减少计算机的开支;和&&类似,当||的左边为true时,不管右边是true还是false,结果都为true。在编程时,建议使用&& 和|| 进行判断操作。

位运算符(&、|、^、~、>>、<<、>>>)

位运算是以二进制位为单位进行的运算,其操作数和运算结果都是整型值。

注意:

  • 0&1 = 0, 1&1 = 1 只有两边都是1结果才是1;
  • 0|1 = 1, 0|0 = 0 只有两边都是0结果才是0;
  • 0^0 = 0, 1^1 = 0 , 0^1 = 1, 1^0 = 1;
  • ~0 = 1,~1 = 0;
  • ">>" 是有符号的,即当 >>左边的数是正数时,缺失位用0填,>>左操作数是负数时,缺失位用1填。
  • << 和 >>>是无符号的,即 << 和>>>左操作数无论正负,缺失位都要用0填;
/**
     * 位运算符 测试
     */
    private static void bitOperator() {
        int a = 56;
        int b = 78;
        String aStr = Integer.toBinaryString(a);    //a 转为二进制是:0b0000_0000_0000_0000_0000_0000_0011_1000
        String bStr = Integer.toBinaryString(b);    //b 转为二进制是:0b0000_0000_0000_0000_0000_0000_0100_1110
        int and = a & b;        //将a和b的二进制数同位进行&计算,and = 0b0000_0000_0000_0000_0000_0000_0000_1000
        int or = a | b;         //将a和b的二进制数同位进行|计算,or  = 0b0000_0000_0000_0000_0000_0000_0111_1110
        int xor = a ^ b;        //将a和b的二进制数同为进行^计算,xor = 0b0000_0000_0000_0000_0000_0000_0111_0110
        int not = ~a;           //将a的二进制数进行~计算,       not = 0b1111_1111_1111_1111_1111_1111_1100_0111
        //注意:这里看出求int的二进制负数其实就是 其绝对值减1后二进制进行~计算。
        //eg. a=50, 那么求-50的二进制数,先将50-1=49, -50的二进制就是 ~49
        System.out.println("a 的二进制表示是:" + aStr);
        System.out.println("b 的二进制表示是:" + bStr);
        System.out.println("a & b 的结果是:" + and);
        System.out.println("a | b 的结果是:" + or);
        System.out.println("a ^ b 的结果是:" + xor);
        System.out.println("~a 的结果是:" + not);


        int b1 = 115;       //b1 的二进制数是: 0b0000_0000_0000_0000_0000_0000_0111_0011
        int b2 = -7;        //b2 的二进制数是: 0b1111_1111_1111_1111_1111_1111_1111_1001
        int b1_left_2 =  b1 << 2;   // 将b1左移2位末尾两位用0填上得 0b0000_0000_0000_0000_0000_0001_1100_1100 (460)
        int b1_right_2 = b1 >> 2;   // 将b1右移2位开头用0填上得     0b0000_0000_0000_0000_0000_0000_0001_1100 (28)
        int b2_left_2 =  b2 << 2;   // 将b2左移2位末尾两位用0填上得 0b1111_1111_1111_1111_1111_1111_1110_0100 (-28)
        int b2_right_2 = b2 >> 2;   // 将b2右移2位来头两位用1填上得 0b1111_1111_1111_1111_1111_1111_1111_1110 (-2)
        //注意:>> 是有符号的,即当 >>左边的数是正数时,缺失位用0填,>>左操作数是负数时,缺失位用1填。
        //      << 是无符号的,即 << 左操作数无论正负,缺失位都要用0填;
        //      与 << 相对应的是 无符号右移 >>>, 其缺失位也全都用0填。
        int b1_right_2_no_sign = b1 >>> 2;  // 将b1右移2位开头用0填上得 0b0000_0000_0000_0000_0000_0000_0001_1100 (28)
        int b2_right_2_no_sign = b2 >>> 2;  // 将b2右移2位开头用0填上得 0b0011_1111_1111_1111_1111_1111_1111_1110 (103740822)
        System.out.println("b1 左移2位得:" + b1_left_2);
        System.out.println("b1 右移2位得:" + b1_right_2);
        System.out.println("b2 左移2位得:" + b2_left_2);
        System.out.println("b2 右移2位得:" + b2_right_2);
        System.out.println("b1 无符号右移2位得:" + b1_right_2_no_sign);
        System.out.println("b2 无符号右移2位得:" + b2_right_2_no_sign);
    }
位运算符结果

赋值运算符

赋值运算符是 "=" 与二元算术运算符、逻辑运算符和位运算符组合成简捷运算符,从而可以简化一些常用表达式的书写。

赋值运算符

其他运算符

三元运算符
三元运算符是软件编程中的一个固定格式,语法是“条件表达式?表达式1:表达式2”。
当条件表达式为true时,结果 “表达式1”,条件为false时,结果是“表达式2”
三元运算符可以简化if else的书写。

       String isLate = "";
        if(new Date().getHours() > 9){
            isLate = "迟到了";
        }else{
            isLate = "没迟到";
        }
        System.out.println(isLate);

可以简写成

      String isLate = new Date().getHours() > 9 ? "迟到了" : "没迟到";
      System.out.println(isLate);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容