public class Test
{
public int x;
public static void main(String []args)
{
System. out. println("Value is" + x);
}
}
对于上面这段代码,以下说法正确的是:
正确答案: C 你的答案: A (错误)
A.程序会打出 “Value is 0”
B.程序会抛出 NullPointerException
C.非静态变量不能够被静态方法引用
D.编译器会抛出 "possible reference before assignment"的错
Object obj=new Object();
List aList=new ArrayList();
List bList=new LinkedList();
long t1=System.currentTimeMillis();
for(int i=0;i<50000;i++){
aList.add(0,obj);
}
long t2=System.currentTimeMillis()-t1;
t1=System.currentTimeMillis();
for(int i=0;i<50000;i++){
bList.add(0,obj);
}
long t3=System.currentTimeMillis()-t1;
正确答案: D 你的答案: C (错误)
t2
t2=t3
不确定
t2>t3
解析:ArrayList内部是动态数组实现,在增加空间时会复制全部数据到新的容量大一些的数组中。而LinkedList内部为双向链表,可以按需分配空间,扩展容量简单,因此LinkedList用时少。
Math.floor(-8.5)=( )
正确答案: D 你的答案: D (正确)
(float)-8.0
(long)-9
(long)-8
(double)-9.0
解析:
例如:Math.floor(-4.2) = -5.0
例如:Math.ceil(5.6) = 6.0
例如:Math.round(-4.6) = -5
由这个题,引出了一个问题,代码如下:
package cn.lbl.face.Test;
public class RoundTest {
public static void main(String[] args) {
System.out.println(Math.round(-8.5)); //-8
System.out.println(Math.round(-8.6)); //-9
System.out.println(Math.round(-4.6)); //-5
System.out.println(Math.round(-4.51)); //-5
System.out.println(Math.round(8.5)); //9
System.out.println(Math.round(8.49)); //8
System.out.println(Math.round(4.6)); //5
}
}
round方法里面是正数时,是我们小学数学的知识,四舍五入如:
System.out.println(Math.round(8.5)); //9
System.out.println(Math.round(8.49)); //8
但当round方法里面为负数时,四舍五入就不适用了,代码如下:
System.out.println(Math.round(-8.5)); //-8
System.out.println(Math.round(-8.6)); //-9
System.out.println(Math.round(-4.6)); //-5
System.out.println(Math.round(-4.51)); //-5
发现当负数正好为x.5时,是被舍的,如上面代码中的-8.5,round方法得到的是-8,如果是正8.5,得到的是9。而负数-4.51得到的是-5,所以可以得出结论,正数是四舍五入,负数也是四舍五入但不包括五,负数五的时候是舍。
以下Java程序运行的结果是:
public class Tester{
public static void main(String[] args){
Integer var1=new Integer(1);
Integer var2=var1;
doSomething(var2);
System.out.print(var1.intValue());
System.out.print(var1==var2);
}
public static void doSomething(Integer integer){
integer=new Integer(2);
}
}
正确答案: A 你的答案: C (错误)
1true
2true
1false
2false
解析:
可能有些同学觉得,只要是引用传递,对引用的修改直接影响着原对象,其实不然,只有对引用对象的内部做了修改,才会影响原对象,如果直接将引用修改了,则对原对象没有影响,唯一的影响就是:这个被修改的引用,现在不是原来对象的引用,而是新对象的引用。
引用传递指的是传递的时候,传递的是对象的引用。如果对引用的内部成员进行操作,则会直接影响到原对象,但是如果直接把此引用指向了其他对象,那对不起,这个引用从此以后,便与之前的对象没有任何关系,当前代表的仅仅是新指向的对象。
java中引用类型的实参向形参的传递,只是传递的引用,而不是传递的对象本身。
String str = new String(“abc”),“abc”在内存中是怎么分配的?
正确答案: A C 你的答案: C (错误)
堆
栈
字符串常量区
寄存器
解析:
题目考查的为Java中的字符串常量池和JVM运行时数据区的相关概念。
什么是字符串常量池
JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量池或者字符串字面量池
工作原理
当代码中出现字面量形式创建字符串对象时,JVM首先会对这个字面量进行检查,如果字符串常量池中存在相同内容的字符串对象的引用,则将这个引用返回,否则新的字符串对象被创建,然后将这个引用放入字符串常量池,并返回该引用。
实现前提
字符串常量池实现的前提条件就是Java中String对象是不可变的,这样可以安全保证多个变量共享同一个对象。如果Java中的String对象可变的话,一个引用操作改变了对象的值,那么其他的变量也会受到影响,显然这样是不合理的。
关于堆和栈
Java中所有由类实例化的对象和数组都存放在堆内存中,无论是成员变量,局部变量,还是类变量,它们指向的对象都存储在堆内存中。而栈内存用来存储局部变量和方法调用。
关于寄存器
Java中运行时数据区有一个程序寄存器(又称程序计数器),该寄存器为线程私有。Java中的程序计数器用来记录当前线程中正在执行的指令。如果当前正在执行的方法是本地方法,那么此刻程序计数器的值为undefined
关于本题目中,"abc"为字面量对象,其存储在堆内存中。而字符串常量池则存储的是字符串对象的一个引用。