&和&&的区别
&运算符有两种用法:(1)按位与;(2)逻辑与。&&运算符是短路与运算。
逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是 true 整个表达式的值才是 true。&&之所以称为短路运算是因为,如果&&左边的表达式的值是 false,右边的表达式会被直接短路掉,不会进行运算。
注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此。
解释内存中的栈(stack)、堆(heap)和静态存储区的用法。
通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间;而通过 new 关键字和构造器创建的对象放在堆空间;程序中的字面量(literal)如直接书写的 100、“hello”和常量都是放在静态存储区中。栈空间操作最快但是也很小,通常大量的对象都是放在堆空间,整个内存包括硬盘上的虚拟内存都可以被当成堆空间来使用。
String str = new String(“hello”);
补充:较新版本的 Java 中使用了一项叫“逃逸分析“的技术,可以将一些局部
对象放在栈上以提升对象的操作性能。
Math.round(11.5) 等于多少? Math.round(-11.5)等于多少?
答:Math.round(11.5)的返回值是 12,Math.round(-11.5)的返回值是-11。四
舍五入的原理是在参数上加 0.5 然后进行下取整。
swtich 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上?
早期的 JDK 中,switch(expr)中,expr 可以是 byte、short、char、int。
从 1.5 版开始,Java 中引入了枚举类型(enum),expr 也可以是枚举,从 JDK 1.7 版开始,还可以是字符串(String);长整型(long)是不可以的。
用最有效率的方法计算 2 乘以 8?
2 << 3(左移 3 位相当于乘以 2 的 3 次方,右移 3 位相当于除以 2 的 3次方)。
补充:我们为编写的类重写 hashCode 方法时,可能会看到如下所示的代码,其实我们不太理解为什么要使用这样的乘法运算来产生哈希码(散列码),而且为什么这个数是个素数,为什么通常选择 31 这个数?前两个问题的答案你可以
选择 31 是因为可以用移位和减法运算来代替乘法,从而得到更好的性能。说到这里你可能已经想到了:31 * num <==> (num << 5) - num,左移 5 位相当于乘以 2 的 5 次方(32)再减去自身就相当于乘以 31。现在的 VM 都能自动完成这个优化。