JAVA整理

Java成长之路(三)

Posted by MiaoMiaoMiao on January 5, 2021

Java成长之路三

运算符

  • 运算符操纵数据;
  • 所有运算符都能根据自己的运算生成一个值;
  • 此外一些运算符可以改变运算对象的值,这叫做“副作用”(Side Effect)
  • 几乎所有的运算符只能操作基本类型(Primitives),例外是=, ==!=,它们能操作所有对象;
  • 此外String支持 ++=;

优先级

  • 运算符的优先级决定了存在多个运算符时,一个表达式的各个运算顺序;

赋值

  • =右边赋值给左边的变量,右边可以使任何变量,常量或者可以产生一个返回值的表达式,但左边必须是一个明确已知的变量;
  • 必须有一个物理空间来存放右边的值;
  • 基本类型的赋值是直接的,而不像对象,赋予的只是内存的引用;
  • a=b中,b是基本类型,那么赋值操作是将b的值复制一份给变量a;若a的值发生改变是不会影响到b;
  • 若为对象赋值,实际操作的是其引用;我们将右边的对象赋予左边时,赋予的是该对象的引用此时两者指向的堆中的对象还是同一个;
  • 当t1和t2指向堆中同一个对象时,通常称为别名(aliasing).

算术运算符

  • +,-,*,/,%
  • %取模(从证书除法中获得余数,整数除法会直接砍掉小数,而不是进位)
  • Random(seed)不代参数的Random会利用当前的时间作为随机”种子”(seed),从而为程序每次执行生成不同的输出;
  • ++a--a先执行递增/递减运算再返回值;
  • a++a--先返回值再执行递增/递减运算;

关系运算符

  • 关系运算符会通过产生一个布尔(boolean)结果来表示操作数之间的关系;>,<,!=,==,>=,<=
  • 比较两个对象内容是否相同:使用所有对象(不包括基本类型)存在的equals()方法;

逻辑运算符

  • &&,||,!-与,或,非
  • 整个表达式会运行到可以明确结果就会停止并返回结果,这意味着该逻辑表达式后半部分不会被执行到,这就是短路;

字面值常量

  • 当我们向程序插入一个字面值常量(Literal)时,编译器会确切地识别它的类型;
  • 当类型不明确时,必须辅以字面值常量关联来帮助编译器识别;

下划线

  • 可以在数字字面量中包含下划线_,使结果更清晰;
    1. 仅限单一,不能多条相连;
    2. 数值开头结尾不允许出现;
    3. F、D和L的前后禁止出现;
    4. 二进制前导b和十六进制x前后禁止出现;

指数计数法

  • e代表自然对数的基础,约等于2.718(Java里用一种更精确的double值Match.E来表示自然对数)
  • e(-43) <=>程序员<=>10(-43)次方

位运算符

  • &,|,~,^
  • ~为一元运算符不能与=联合使用,其他均可;
  • ^异或(相同为0,不相同为1);
  • 位运算符具有逻辑运算符相同的结果,只是它不会中途“短路”;
  • 在移位表达式中,禁止使用逻辑运算符;

移位运算符

  • 运算对象是二进制的“位”,只能用于处理证书类型其中一种;
  • 左移位运算符<<能将其左边的运算对象的左移董右侧指定的位数;右移位运算符>>
  • 右移位运算符有正负值;若为正,则在高位插入0;若为负,则高位输入1;
  • “不分正负”的右移位运算符>>>,默认高位植入0;
  • 如果移动char,byte和short,则在移动前将其提升为int,结果为int,仅使用右值(value)的5个低阶位。若对一个long值进行处理,最后得到的结果也是long;
  • 移位可以与等号组合使用>>=,<<=,>>>=左值被替代为移动后的值
  • 左移尾添0,右移(正数:首填0;负数:添1)

三元运算符

  • 布尔表达式?值1:值2

字符串运算符

  • 连接字符串 “+”
  • 若表达式以一个String类型开头(编译器会自动将双引号”“标注的字符序列专为字符串)
  • "”空字符串跟着一个基本类型的数据,这是隐式将其转换为字符串,以代替繁琐的显式调用方法;

类型转换

  • int i = (int)5.4;
  • 基本类型的数据可转换为另一种基本类型的数据;(除了布尔型)
  • 类是不能进行类型转换的;
  • floatdouble转换为整数时,小数位将被截断;
  • 若想四舍五入,需使用java.lang.math中的round()方法;

类型提升

  • 对小于int的基本数据类型(即char,byte或short)执行任何算术运算或按位操作,这些类型都会提升为int,结果为int。若想使用转小的类型,必须进行强制转换;
  • float * double => double

bye