操作符

Java 的数据是通过操作符来操作的。几乎所有操作符都只能操作“基本类型”,但“=”、“==“和”!=“能操作所有对象。String支持”+“和”+=“。

操作符具有优先级,但建议使用括号明确规定计算顺序。

public static void main(String[] args) {
   int a = 1;
   int b = 2;
   String str = "123";
   //当一个String类型后紧跟一个非String类型,系统会尝试将非String类型转为String类型
   System.out.println(a + b);
   System.out.println(a + b + str);
   System.out.println(a + str + b);
}

赋值使用操作符”=“。将右值赋给左值,右值可以为任意常数、变量、表达式(能生成值),左值必须为已命名的变量(已声明为final类型的在某些情况下不行)。

基本类型的赋值是直接赋值,对象的赋值只是赋值了引用。对于方法中传参也符合这个规则,当然 String 是个特例,你可以把它看成是 char 的包装类就容易理解了。

public static void main(String[] args) {
   int a = 1;
   int b = 2;
   System.out.println("a=" + a + ";b=" + b);
   a = b;
   System.out.println("将b的值赋给a后,a=" + a + ";b=" + b);
   a = 3;
   System.out.println("修改赋值后的a,b值并未受影响,a=" + a + ";b=" + b);
   Person person1 = new Person(1);
   Person person2 = new Person(10);
   System.out.println("person1=" + person1.toString() + ";person2=" + person2);
   //将person2赋值给person1,person1的之前的引用不再被引用,过一段时间就会被垃圾回收器回收
   person1 = person2;
   System.out.println("将person2的引用赋值给person1,person1=" + person1.toString() + ";person2=" + person2);
   //修改person1的数据将影响person2,因为两者的引用指向同一个对象
   person1.setAge(100);
   System.out.println("修改person1的age将影响person2的age,person1=" + person1.toString() + ";person2=" + person2);
}

public static class Person {
   private int age;

   public Person(int age) {
       this.age = age;
   }

   public int getAge() {
       return age;
   }

   public void setAge(int age) {
       this.age = age;
   }

   @Override
   public String toString() {
       return "Person{" +
               "age=" + age +
               '}';
   }
}

输出如下:

a=1;b=2
将b的值赋给a后,a=2;b=2
修改赋值后的a,b值并未受影响,a=3;b=2
person1=Person{age=1};person2=Person{age=10}
将person2的引用赋值给person1,person1=Person{age=10};person2=Person{age=10}
修改person1的age将影响person2的age,person1=Person{age=100};person2=Person{age=100}

++:称为自动递增操作符
--:称为自动递减操作符
++i称为前缀式,i++称为后缀式。前缀式先生成值再运算,后缀式先运算再生成值。

">"、"<"、">="、"<="、"=="、"!="是关系操作符。表达式为真则返回true,为假返回false。

其中 boolean 类型只适用"=="和"!="。

补充:”==“和”!=“用于比较对象的引用是否相等。重写 Object 类的 equals() 方法即可比较对象的值是否相等,但是 equals() 方法默认也是比较对象的引用。

逻辑操作符

”与(&&)“、”或(||)“、”非(!)“根据参数的逻辑关系生成一个布尔值。且只能应用于布尔值的表达式。”与(&&)“和”或(||)“具有”短路“现象。一旦能准确无误的判断表达式的值,就不再计算余下部分。

直接常量

L(l):long
F(f):float
D(d):double
0x(0X):十六进制,0-9、a-f
0:八进制,0-7

在 Java 中,可以调用 Integer 或者 Long 中相应的方法,将十进制数转化为二进制、八进制或者十六进制。

public static void main(String[] args) {
   int a = 16;
   //二进制
   System.out.println("Binary="+Integer.toBinaryString(a));
   //八进制
   System.out.println("Octal="+Integer.toOctalString(a));
   //十六进制
   System.out.println("Hex="+Integer.toHexString(a));
}

位运算符

位运算符有如下几种:


77c6a7efce1b9d1688c4b844f1deb48f8
  • 按位与”&“:只有对应的两个二进位均为1时,结果位才为1 ,否则为0。1&1=1,1&0=0,0&1=0,0&0=0
  • 按位或”|“:只要对应的二个二进位有一个为1时,结果位就为1。1&1=1,1&0=1,0&1=1,0&0=0
  • 按位异或”“:参与运算的两个值,如果两个相应位相同,则结果为0,否则为1。00=0,10=1,01=1,1^1=0。按位异或可以实现两个数的交换,而不必借助临时变量。
  • 取反”“:1=0,~0=1
  • 左移”<<“:地位插入0。
  • 右移”>>“:若符号为正,则高位插入0;若符号为负,则高位插入1。
  • 无符号右移“>>>”:无论正负,都在高位插入0。

以上为操作符,除按位异或“^”外,其余都可与“=”连用。

验证按位异或”^“可以实现两个数的交换:

public static void main(String[] args) {
   int a = 16;
   int b = 10;
   System.out.println("异或前,Binary,a=" + Integer.toBinaryString(a) + ";b=" + Integer.toBinaryString(b));
   a = a ^ b;
   b = b ^ a;
   a = a ^ b;
   System.out.println("异或后,Binary,a=" + Integer.toBinaryString(a) + ";b=" + Integer.toBinaryString(b));
}

输出如下:

异或前,Binary,a=10000;b=1010
异或后,Binary,a=1010;b=10000

这里我们来验证下异或运算的效率如何。

public static final int TIMES = 1000000000;

public static void main(String[] args) {
   exchange1();
   exchange2();
}

private static void exchange1() {
   long start = System.currentTimeMillis();
   int a = 16;
   int b = 10;
   for (int i = 0; i < TIMES; i++) {
       a = a ^ b;
       b = b ^ a;
       a = a ^ b;
   }
   System.out.println("执行" + TIMES + "次异或操作交换数据要" + (System.currentTimeMillis() - start) + "ms");
}

private static void exchange2() {
   long start = System.currentTimeMillis();
   int a = 16;
   int b = 10;
   int temp;
   for (int i = 0; i < TIMES; i++) {
       temp = a ;
       a = b;
       b = temp;
   }
   System.out.println("执行" + TIMES + "次使用临时变量交换数据要" + (System.currentTimeMillis() - start) + "ms");
}

输出如下:

执行1000000000次异或操作交换数据要1820ms
执行1000000000次使用临时变量交换数据要4ms

发现使用异或操作实现值得交换竟然没有使用临时变量来的高效。

三元操作符

三元操作符的表达式形如:

//若布尔表达式为真,则计算value1
//否则,计算value2
boolean-exp ? value1 : value2

类型转换

在 Java 中,基本类型的转换有两种方式:

  1. 扩展转换:低精度类型转换成高精度类型,编译器会自动执行,不需要显示申明。如,将 int 转换为 long 类型
  2. 窄化转换:将高精度类型转换为低精度类型,需要显示申明,因为窄化转换会丢失数据。如,将 long 转换为 int 类型。

Java 中的基本数据类型除 boolean 类型外,都允许类型转换。类也能实现转换,但仅限于同一类。

WechatIMG34

截尾和舍入

Java 中将浮点数转换为 int 或 long ,执行的是截尾操作。如需进行舍入操作,则需要使用 Math.round() 方法。

public static void main(String[] args) {
   float a = 1.6f;
   System.out.println("(int)a=" + (int) a);
   System.out.println("Math.round(a)=" + Math.round(a));
}

输出如下:

(int)a=1
Math.round(a)=2

以上就是《Java 编程思想》操作符这一章节的读书笔记~

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

推荐阅读更多精彩内容

  • 一元操作符 只能操作一个值的操作符。 递增和递减操作符 前置型:位于要操作的变量之前; 后置型:位于要操作的变量之...
    Sketch阅读 329评论 0 0
  • 操作符是执行某种数学,逻辑或赋值操作的符号。在某些情况下,有助于缩短代码(我们将在本章中看到)。 让我们看一个基于...
    芒果web阅读 393评论 0 4
  • 我叫兰唱。 今天是周一,早上的升旗仪式,旗手依旧是一班的陈子默。我认识他,一班的学习委员,书法协会的会长。 他家在...
    我是猫白啊阅读 459评论 2 1
  • 这个八戒画的有点忧伤,可能被孙猴子欺负了。 步骤图如下:简单一些。 八戒是唐僧四人取经路上的成员之一,他的特点是有...
    辉高阅读 269评论 7 8
  • 教你阅读Python开源项目代码 https://zhuanlan.zhihu.com/p/22275595?re...
    pcliuyang阅读 624评论 0 3