每日java笔试五小题

每日java笔试五小题


   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用时少。

  1. Math.floor(-8.5)=( )

    正确答案: D 你的答案: D (正确)

    (float)-8.0
    (long)-9
    (long)-8
    (double)-9.0
    

解析:

  • floor: 求小于参数的最大整数。返回double类型-----n. 地板,地面

​ 例如:Math.floor(-4.2) = -5.0

  • ceil: 求大于参数的最小整数。返回double类型-----vt. 装天花板;

​ 例如:Math.ceil(5.6) = 6.0

  • round: 对小数进行四舍五入后的结果。返回int类型

​ 例如: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中引用类型的实参向形参的传递,只是传递的引用,而不是传递的对象本身。

img

  1. String str = new String(“abc”),“abc”在内存中是怎么分配的?

    正确答案: A C 你的答案: C (错误)

    堆
    栈
    字符串常量区
    寄存器
    

解析:

题目考查的为Java中的字符串常量池和JVM运行时数据区的相关概念。

什么是字符串常量池

JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量池或者字符串字面量池

工作原理

当代码中出现字面量形式创建字符串对象时,JVM首先会对这个字面量进行检查,如果字符串常量池中存在相同内容的字符串对象的引用,则将这个引用返回,否则新的字符串对象被创建,然后将这个引用放入字符串常量池,并返回该引用。

实现前提

字符串常量池实现的前提条件就是Java中String对象是不可变的,这样可以安全保证多个变量共享同一个对象。如果Java中的String对象可变的话,一个引用操作改变了对象的值,那么其他的变量也会受到影响,显然这样是不合理的。

​ 关于堆和栈

Java中所有由类实例化的对象和数组都存放在堆内存中,无论是成员变量,局部变量,还是类变量,它们指向的对象都存储在堆内存中。而栈内存用来存储局部变量和方法调用。

关于寄存器

Java中运行时数据区有一个程序寄存器(又称程序计数器),该寄存器为线程私有。Java中的程序计数器用来记录当前线程中正在执行的指令。如果当前正在执行的方法是本地方法,那么此刻程序计数器的值为undefined

关于本题目中,"abc"为字面量对象,其存储在堆内存中。而字符串常量池则存储的是字符串对象的一个引用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值