在Java的表达式运算中的运算符中,逻辑运算符&和&&区别是什么?
&是按位and运算,比如 1 & 2,那么结果是 0,因为1是01,2是10,结果是 00
&&是逻辑and运算,比如1&&2,因为1是true,2也是true,所以结果是true
在使用“&”进行逻辑运算时,不论左边为true或者false,右边的表达式都会进行运算。而使用“&&”进行运算,当左边为false时,右边的表达式不会再进行运算,因此“&&”被称作短路与。
同与操作类似,“||”表示短路或,当运算符“||”的左边为true时,右边的表达式不会再进行运算。
就是最常见的普通对象引用,我们平常典型编码Object obj = new Object()中的obj就是强引用。通过关键字new
创建的对象所关联的引用就是强引用
只要这个强引用还指向着某一对象,那就说明这个对象还“活着”,垃圾收集器就不会碰,当JVM内存空间不足,JVM宁愿
抛出OutOfMemoryError运行时错误(OOM),使程序异常终止,也不会靠随意回收具有强引用的“存活”对象来解决内
存不足的问题。
对于一个普通的对象,如果没有其他的引用关系,只要超出了引用的作用域或显示的将(强)引用赋值
为null,就是可以被垃圾收集的了。当然具体的回收时机还得看垃圾收集策略。
从名字可以看出,这是一种相对于强引用更弱化的一种引用,它可以让所指对象豁免一下垃圾收集,只有当JVM认为
内存不足时,才会去尝试回收软引用所指的对象。JVM会确保在抛出 OutOfMemoryError 之前,清理软引用所指
对象。软引用通常用来实现内存敏感的缓存,如果还有空闲的内存,就可以暂时保留缓存,当内存不足时就清理掉,
这样就保证了使用了缓存的同时,又不会耗尽内存。
这种引用并不会让所指对象豁免垃圾回收,仅仅是提供一种访问在弱引用状态下的对象的途径。这就可以用来构建一
种没有特定约束的关系,,比如,维护一种非强制性的映射关系,如果试图获取对象时,对象还在,就使用它,否则
就重新实例化。它同样是很多缓存的选择。
不能通过它来访问对象, 幻想引用仅仅是提供了一种确保对象被 finalize 以后,做某些事情的机制。,比如,通
常用来做所谓的 Post-Mortem 清理机制, Java 平台自身 Cleaner 机制等,也有人利用幻想引用监控对象的创建和销毁。
在Java表达式中,逻辑运算符&和&&的不同如下:
&和&&都是作用于boolean值的逻辑运算符,表示逻辑‘与’的关系,只有所有的运算量都为真,最终结果才为真。
与的优先级不同。&的优先级大于| |,| |的优先级比&的低。如果优先级不同,先计算高优先级的运算符和括号内的部分。
&和&&还有短路与以及短路或。如果最左边的表达式能够定论整个表达式的值,就不会计算第二个表达式。
&和&&还有二进制异或符号^。二者的运算结果不同。&表示按位‘与’,&&则不是。&操作优先级低于^操作。
附:Java中的位运算符: &:按位与 比如: 1100&1011=1000
|:按位或 比如: 1100|1011=1111
^:按位异或,按位不同才为1。 比如:1100^1011=0111
〜:按位非,按位取反 比如: 〜1100=0011 〜1011=0100
<<:左移动,移动是有一遍0补齐。比如:1100<<2=111100
:右移动,高位使用符号位,比如:011100>>2=000111
:无符号右移动,高位请使用0,比如: 011100>>>2=000111
根据参考资料中的示例代码,我们通过反射机制实现访问Java对象的属性,并可以通过反射比较两个对象的不同之处。此外,比较两个对象的不同之处也涉及到位运算知识。