"在最底层,Java中的数据是通过使用操作符来操作的" (Thinking in Java)

1 算术操作符

  Java 中的基本算术操作符和其他大多数程序设计语言是相同的。其中包括加(+)、减(-)、乘(*)、除(/)和取模操作符(%,求余数)。整数除法会直接去掉结果的小数位,而不是进行四舍五入计算结果。除了这四种基本算术操作符,还有一种同时进行运算和赋值的运算符(在基本算术操作符后面紧跟一个等号来表示:+=、-=、*=、/=)。下面这个例子展示各种算术操作符的用法:

  1. 1 /**
  2. 2 * 算术操作符用法
  3. 3 */
  4. 4 public class ArithmeticOperation {
  5. 5 public static void main(String[] args) {
  6. 6 // 创建一个随机数对象,数字 47 是随机数种子(经过多次试验得到,由47做种后,产生的随机数更加体现了随机性)
  7. 7 Random random = new Random(47);
  8. 8 int i, j, k;
  9. 9 // 产生 1~100的随机数
  10. 10 i = random.nextInt(100) + 1;
  11. 11 j = random.nextInt(100) + 1;
  12. 12
  13. 13 System.out.println("i : " + i + "\nj : " + j);
  14. 14
  15. 15 k = i + j;
  16. 16 System.out.println("i+j : " + k);
  17. 17 k = i - j;
  18. 18 System.out.println("i-j : " + k);
  19. 19 k = i * j;
  20. 20 System.out.println("i*j : " + k);
  21. 21 k = i / j;
  22. 22 System.out.println("i/j : " + k);
  23. 23 k = i % j;
  24. 24 System.out.println("i%j : " + k);
  25. 25 i %= j;
  26. 26 System.out.println("i %= j : " + i);
  27. 27
  28. 28 float u, v, w;
  29. 29 u = random.nextFloat();
  30. 30 v = random.nextFloat();
  31. 31 System.out.println("u : " + u + "\nv : " + v);
  32. 32 w = u + v;
  33. 33 System.out.println("u + v : " + w);
  34. 34 w = u - v;
  35. 35 System.out.println("u + v : " + w);
  36. 36 w = u * v;
  37. 37 System.out.println("u + v : " + w);
  38. 38 w = u / v;
  39. 39 System.out.println("u + v : " + w);
  40. 40
  41. 41 w += u;
  42. 42 System.out.println("w += u : " + w);
  43. 43 w -= u;
  44. 44 System.out.println("w -= u : " + w);
  45. 45 w *= u;
  46. 46 System.out.println("w *= u : " + w);
  47. 47 w /= u;
  48. 48 System.out.println("w /= u : " + w);
  49. 49
  50. 50 /**
  51. 51 * output:
  52. 52 * i : 59
  53. 53 * j : 56
  54. 54 * i+j : 115
  55. 55 * i-j : 3
  56. 56 * i*j : 3304
  57. 57 * i/j : 1
  58. 58 * i%j : 3
  59. 59 * i %= j : 3
  60. 60 * u : 0.5309454
  61. 61 * v : 0.0534122
  62. 62 * u + v : 0.5843576
  63. 63 * u + v : 0.47753322
  64. 64 * u + v : 0.028358962
  65. 65 * u + v : 9.940527
  66. 66 * w += u : 10.471473
  67. 67 * w -= u : 9.940527
  68. 68 * w *= u : 5.2778773
  69. 69 * w /= u : 9.940527
  70. 70 */
  71. 71 }
  72. 72 } 

2 自动递增和递减

  递增操作符为  “++”,意为 “增加一个单位”;递减操作符为  “--”,意为 “减少一个单位”。这两个操作符各有两种使用方式,通常称为  “前缀式”  和  “后缀式”。若  “++” 位于变量或表达式前面即为前缀递增,后面即为后缀递增;若  “--” 位于变量或者表达式后面即为后缀递减,前面即为前缀递减。对于前缀递增或递减(如 ++a 或 --a),会先进行计算,再赋值。而对于后缀递增或递减(如 a++ 或 a--),会先赋值,再进行计算。

例子如下:

  1. 1 /**
  2. 2 * 自动递增或递减运算
  3. 3 */
  4. 4 public class AutoTest {
  5. 5
  6. 6 public static void main(String[] args) {
  7. 7 int a = 1;
  8. 8 System.out.println("a : " + a);
  9. 9 // 先计算将 a 加 1 变为 2,再输出
  10. 10 System.out.println("++a : " + ++a);
  11. 11 // 先输出 a , 再计算将 a 加 1
  12. 12 System.out.println("a++ : " + a++);
  13. 13 System.out.println("a : " + a);
  14. 14
  15. 15 System.out.println("--a : " + --a);
  16. 16 System.out.println("a-- : " + a--);
  17. 17 System.out.println("final a : " + a);
  18. 18 /**
  19. 19 * output:
  20. 20 * a : 1
  21. 21 * ++a : 2
  22. 22 * a++ : 2
  23. 23 * a : 3
  24. 24 * --a : 2
  25. 25 * a-- : 2
  26. 26 * final a : 1
  27. 27 */
  28. 28 }
  29. 29
  30. 30 }

3 关系操作符

  关系操作符执行结果为boolean (布尔) 值,若为真即为 true (真) ,反之即为 false (假)。关系操作符包括小于(<)、大于(>)、小于或等于(<=)、大于或等于、等于(==)以及不等于(!=)。等于和不等于适用于所有的基本数据类型(byte,short,int,long,float,double,boolean,char),而其他比较符不适用于boolean类型。因为boolean 只有true和false两种值,“大于” 和 “小于” 没有实际意义。

3.1 测试对象的等价性

  ==  和  != 也适用于任何对象,但是他们比较的是对象的引用(也就是引用所指向的内存地址)。若要比较两个对象的实际内容,必须使用所有对象都实用的 equals() 方法,但是这个方法不适用于基本数据类型,基本数据类型直接使用 == 或 != 即可。

例子如下:

  1. 1 /**
  2. 2 * 相等测试
  3. 3 */
  4. 4 public class EquivalenceTest {
  5. 5 public static void main(String[] args) {
  6. 6 Integer integer0 = new Integer(27);
  7. 7 Integer integer1 = new Integer(27);
  8. 8
  9. 9 System.out.println(integer0 == integer1);
  10. 10 System.out.println(integer0 != integer1);
  11. 11 /**
  12. 12 * output:
  13. 13 * false
  14. 14 * true
  15. 15 */
  16. 16 }
  17. 17 }

此外,对于这种为包装类直接赋值的比较

  1. Integer a = 355;
    Integer b = 455;

阿里Java开发规范建议:

  1. 所有的包装类对象之间值的比较,全部使用equals方法比较。
  2. 说明:对于Integer var=?在-128127之间的赋值,Integer对象是在IntegerCache.cachec产生,会复用已有对象,这个区间内的值可以直接使用==进行判断,但是这个区间以外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用
  3. equals方法进行判断。
  4. if(a.equals(b)){
  5. // code
  6. }

4 逻辑操作符

  逻辑操作符 “与”(&)、“或”(|)、“非”(!)、“短路与”(&&)和  “短路或”(||)。这里就解释下  &&  和 || 。“与” 表示为两个布尔值都为true时方为true,操作符两边的表达式都会执行。而&& 表示“短路与”,即一种短路现象,若第一个表达式的值为false,则不会去执行第二个表达式的boolean值。短路或也是同样的道理,若第一个表达式的值为true,则不会执行操作符右边的表达式,因为 “或” 只要有一个为true即为true。

示例如下:

  1. 1 public class Bool {
  2. 2 public static void main(String[] args) {
  3. 3 int i=1, j = 2;
  4. 4 // & 两边表达式都会执行
  5. 5 System.out.println((i > 0) & (j < 0));
  6. 6 //短路与 第一个表达式为 false ,第二个表达式不会执行
  7. 7 System.out.println((i < 0) && (j < 0));
  8. 8 // | 两边表达式都会执行
  9. 9 System.out.println((i > 0) | (j < 0));
  10. 10 //短路或 第一个表达式为 true ,第二个表达式不会执行
  11. 11 System.out.println((i > 0) || (j < 0));
  12. 12 // boolean 转String
  13. 13 System.out.println("boolean 转 String : " + (i > 0));
  14. 14 /**
  15. 15 * output:
  16. 16 * false
  17. 17 * false
  18. 18 * true
  19. 19 * true
  20. 20 * boolean 转 String : true
  21. 21 */
  22. 22 }
  23. 23 }

5 按位操作符

  按位操作符用来操作整数基本数据类型(byte,short,int,long)中的单个“比特”(bit),即二进制位。按位操作符会对两个参数中对应的位执行布尔代数运算,并最终生成一个结果。按位操作符与逻辑操作符使用了相同的符号,但是按位操作符没有“短路”。若两个输入位都为1,则按位“与”(&)输出1,反之输出0;若两个输入位里只要有一个为1,则按位“或”(|)输出1,反之输出0;若两个输入位不全为1或不全为0,则按位异或(^)输出1,反之输出0。按位“非”(~),生成与输入位相反的值,即若输入1,则输出0;若输入0,则输出1。

  按位操作符可以与等号(=)联合使用,以便合并运算和赋值:&=,|=,^= 都是合法的,由于“非”(~)是一元操作符,所以不可与“等号”(=)联合使用。

示例代码如下:

  1. 1 /**
  2. 2 * 按位操作符代码示例
  3. 3 */
  4. 4 public class BitwiseOperatorTest {
  5. 5 public static void main(String[] args) {
  6. 6 // 0b 表示二进制
  7. 7 int x = 0b01;
  8. 8 int y = 0b10;
  9. 9 int z;
  10. 10 z = x & y;
  11. 11 // toBinaryString 方法转为二进制字符串形式
  12. 12 System.out.println(Integer.toBinaryString(z));
  13. 13 z = x | y;
  14. 14 System.out.println(Integer.toBinaryString(z));
  15. 15 z = x ^ y;
  16. 16 System.out.println(Integer.toBinaryString(z));
  17. 17 x &= y;
  18. 18 System.out.println(Integer.toBinaryString(x));
  19. 19 x |= y;
  20. 20 System.out.println(Integer.toBinaryString(x));
  21. 21 x ^= y;
  22. 22 System.out.println(Integer.toBinaryString(x));
  23. 23 /**
  24. 24 * output:
  25. 25 * 0
  26. 26 * 11
  27. 27 * 11
  28. 28 * 0
  29. 29 * 10
  30. 30 * 0
  31. 31 */
  32. 32 }
  33. 33 }

6 移位操作符

  移位操作符操作的运算对象也是二进制的“位”。移位操作符只可以用来处理整数类型(int和long,其他的类型都会转换为int在进行移位运算)。左移操作符(<<)能按照操作符右侧(如 1<<2)指定的位数将操作符左侧的操作数向左移动(在低位补0,即右侧移动空出来的位数)。右移操作符分为“有符号”右移和“无符号”右移。“有符号”右移操作符(>>)则按照操作符右侧(如 1>>2)指定的位数将操作符左侧的操作数向右移动。“有符号”中,若符号位正,则在高位插入0;若符号为符,则在高位插入1。“无符号”右移操作符(>>>),就是无论正负(相当于取绝对值),都在高位插入0。

  如果对byte、short、char 类型的数值进行移位运算,那么在移位之前都会被转为int类型,并且得到的结果也是int类型的值。对于int的位移运算,操作符右侧的操作位数,只有低5位才有用(因为:5位二进制数所能表示的最大数为11111,即 2^5-1=31,而在Java中int类型占4个字节,也就是32位),这样可以防止我们位移超过int型值所具有的的位数。若对long类型的数值进行移位运算,最后得到的结果也是long型,此时只有低6位有用(同理,在Java中long类型找8个字节64位)。

  另外,移位操作符也可以与“等号”(=)结合使用:<<=、>>=、>>>=。

示例代码如下:

  1. 1 /**
  2. 2 * 移位操作符测试代码
  3. 3 */
  4. 4 public class ShiftOperatorTest {
  5. 5 public static void main(String[] args) {
  6. 6 int u = 0b01, v = 0b10, w;
  7. 7 w = u << 2;
  8. 8 System.out.println(Integer.toBinaryString(w));
  9. 9 w = u >> 2;
  10. 10 System.out.println(Integer.toBinaryString(w));
  11. 11 w = v >> 2;
  12. 12 System.out.println(Integer.toBinaryString(w));
  13. 13 w = v >>> 2;
  14. 14 System.out.println(Integer.toBinaryString(w));
  15. 15 u <<= 2;
  16. 16 System.out.println(Integer.toBinaryString(u));
  17. 17 v >>= 2;
  18. 18 System.out.println(Integer.toBinaryString(v));
  19. 19 u >>>= 2;
  20. 20 System.out.println(Integer.toBinaryString(u));
  21. 21 /**
  22. 22 * output:
  23. 23 * 100
  24. 24 * 0
  25. 25 * 0
  26. 26 * 0
  27. 27 * 100
  28. 28 * 0
  29. 29 * 1
  30. 30 */
  31. 31 }
  32. 32 }

6 三元操作符

三元操作符表达式为:(boolean-expression ? value0 : value1),当布尔表达式值为true时,计算value0并返回结果,否则计算value1返回(计算)结果。

例如:  

  1. // 值为 7
    int chooseMax = 2 > 7 ? 2 : 7;

  该表达式不要频繁使用,因为很容易产生可读性极差的代码。

7 知识点

  在对基本数据类型执行算术运算或者按位运算时,表达式中出现的最大数据类型决定了表达式最终结果的数据类型。如果将一个float值与一个double值相乘,结果为double类型;若将一个int值和一个long值相加,则结果为long。此外,整数的默认类型为int类型,浮点型的默认类型为double型。

  还有很多细节知识需要多多实践~~

----------------------------end-----------------------------------有时候你不努力一下,都不知道什么叫做绝望。

Java 操作符小记的更多相关文章

  1. Java操作符

    几乎所有运算符都只能操作"主类型"(Primitives).例外是"="."= ="和"! =",它们能操作所有对象.除 ...

  2. JavaSE复习日记 : Java操作符\关系运算符\逻辑运算符\赋值运算符\字符串连接符\三元运算符

    // Java操作符\关系运算符\逻辑运算符\赋值运算符\字符串连接符\三元运算符 /* * 一 Java操作符 * * Java操作符都有哪些? * +, -, *, /, %, ++, -- * ...

  3. effective java读书小记(一)创建和销毁对象

    序言 <effective java>可谓是java学习者心中的一本绝对不能不拜读的好书,她对于目标读者(有一点编程基础和开发经验)的人来说,由浅入深,言简意赅.每一章节都分为若干的条目, ...

  4. Java操作符真的简单到易如反掌?

    之前我写了一篇<吃人的那些Java名词:对象.引用.堆.栈和堆栈>,本以为凭借自己8年的Java编程经验足够把这些“吃人”的Java名词解释清楚了,但有网友不以为然,在文章底部评论说:“老 ...

  5. [THINKING IN JAVA]操作符

    3 操作符 3.1 static import 可以static import静态方法和变量,这样就可以在不写类名的前提下调用类中的静态方法和变量: package com.chenlei.study ...

  6. Java 操作符

    子系统的特点 instanceof 操作符 Animal类是Dog的直接父类,Creature类和Object类是Dog的间接父类,因此 Dog dog=new Dog(); System.out.p ...

  7. java编程小记

    http://blog.csdn.net/pipisorry/article/details/51050189 很久没写java,什么都不会了,小记一下. 类型转换 字符串转int类型:Integer ...

  8. Java JPA小记

    什么是JPA JPA之于ORM(持久层框架,如MyBatis.Hibernate等)正如JDBC之于数据库驱动. JDBC是Java语言定义的一套标准,规范了客户端程序访问关系数据库(如MySQL.O ...

  9. Java操作符,<<、>>等

    数学意义:在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方. 计算:3 << 2 3 << 2,则是将数字3左移2位 1. ...

随机推荐

  1. Spring 框架学习

    转载自前辈:我没有三个新脏 Spring学习(1)--快速入门 认识 Spring 框架 Spring 框架是 Java 应用最广的框架,它的成功来源于理念,而不是技术本身,它的理念包括 IoC (I ...

  2. (课内)信安数基RSA-基础&&解密加速

    RSA基本实现 首先获得N比特的伪随机数:使用Random库中内容. randint(n,m) 表示生成一个在n和m之间的随机数, **表示乘幂. getPrime找素数,or 1运算是一种优化:如果 ...

  3. 机器学习:KNN

    KNN:K-nearst neighbors 简介: k-近邻算法采用测量不同特征值之间的距离来进行分类,简而言之为:人以类聚,物以群分 KNN既可以应用于分类中,也可用于回归中:在分类的预测是,一般 ...

  4. 【二食堂】Alpha - Scrum Meeting 10

    Scrum Meeting 10 例会时间:4.20 18:00~18:20 进度情况 组员 昨日进度 今日任务 李健 1. 与柴博合作完成登录注册页面issue 继续完成登录注册页面issue 柴博 ...

  5. oo第三次博客-JML规格

    这三周的作业主要是围绕以JML来约束代码开发,以确保程序的正确性与鲁棒性. Part 1:三次作业的实现与bug 第一次作业没有任何算法和数据结构上的难度,对于Path和PathContainer的各 ...

  6. 架构师之路-https底层原理

    引子 先说说我对架构师的理解.从业务能力上,需要的是发现问题和解决问题的能力:从团队建设上,需要的是能培养团队的业务能力:从项目管理上,把控好整个项目和软件产品的全生命周期. 我搜索了一下架构师的培训 ...

  7. C语言单片机项目实战超声波雷达测距

    本实验是基于MSP430利用HC-SR04超声波传感器进行测距,测距范围是3-65cm,讲得到的数据显示在LCD 1602液晶屏上. 模块工作原理如下 (1)采用 IO 触发测距,给至少 10us 的 ...

  8. DDD领域驱动设计架构模式:防腐层(Anti-corruption layer)

    在微服务(Microservices)架构实践中,架构设计借用了DDD中的一些概念和技术,比如一个微服务对应DDD中的一个限界上下文(Bounded Context):在微服务设计中应该首先识别出DD ...

  9. 什么是操作系统fork()进程

    1.fork()是创建进程函数. 2.c程序一开始,就会产生 一个进程,当这个进程执行到fork()的时候,会创建一个子进程. 3.此时父进程和子进程是共存的,它们俩会一起向下执行c程序的代码. 4. ...

  10. iscsi基本命令

    磁阵操作命令 根据磁阵端配置的业务地址(targetIP)和端口(3260),命令iscsiadm -m discovery -t sendtargets -p targetIP:port(3260) ...