牛客Java基础专项题 Day 1

这里是IT蛋的12月计划之一:刷完牛客的java专项题,

展示的是自己还不熟练的知识点,或者认为有必要留着复习的题目,每天记录十题。

如果有疏漏不足的地方还请多多指教。


题目展示方式为:

题目

(答案)

解析(部分参考牛客的解答)




1.在 JAVA 编程中, Java 编译器会将 Java 程序转换为

( 字节码 )

  1. 编译器将Java源代码编译成字节码class文件
  2. 类加载到JVM里面后,执行引擎把字节码转为可执行代码
  3. 执行的过程,再把可执行代码转为机器码,由底层的操作系统完成执行。



2.下面的输出结果是什么?jdk1.8版本

public class Demo {
 public static void main(String args[])
{
   String str=new String("hello");
   if(str=="hello")
  {
     System.out.println("true");
  }      
   else     {
     System.out.println("false");
  }
}
}

(false)

“==”判断的是对象引用地址是否相同

String str=new String("hello"); 这句话new了一个新的String对象,所以地址与"hello"字符串常量的地址不同

如果判断字符串是否相等应给用str.equals("hello")方法



3.实现或继承了Collection接口的是

(List,Iterator,Set)

Map接口未实现Collection接口

List接口的定义为

public interface List<E> extends Collection<E>

Vector定义为

public  class Vector<E> extends AbstractList<E> implements List<E>,RandomAccess, Cloneable, Serializable      

Iterator接口未实现Collection接口

Set接口继承自Collection接口

public interface Set<E> extends Collection<E>



4.下列程序执行后输出结果为( )


class BaseClass {
   public BaseClass() {
  {
       System.out.println("I’m BaseClass class");
  }
    static {
        System.out.println("static BaseClass");
    }
}
public class Base extends BaseClass {
    public Base() {}
    {
        System.out.println("I’m Base class");
    }
    static {
        System.out.println("static Base");
    }
    public static void main(String[] args) {
        new Base();
    }
}

static BaseClass

static Base

I’m BaseClass class

I’m Base class


执行顺序从左到右:

父类静态代码块 ->子类静态代码块 ->父类非静态代码块 -> 父类构造函数 -> 子类非静态代码块 -> 子类构造函数。

案例代码如下:

public class Father {
   static {
       System.out.println("父类静态代码块");  
  }    
  {
       System.out.println("父类非静态代码块");
  }
   public Father(){
       System.out.println("父类构造函数");  
  }
}
public class Son extends Father{
static {
       System.out.println("子类静态代码块");  
}
  {
       System.out.println("子类非静态代码块");  
}  
public Son(){
       System.out.println("子类构造函数");  
}  
public static void main(String[] args) {
       Son son = new Son();  
}
}
结果为:  
   父类静态代码块
   子类静态代码块
   父类非静态代码块
   父类构造函数
   子类非静态代码块
   子类构造函数



5.对于JVM内存配置参数:-Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio=3

其最小内存值和Survivor区总大小分别是

(10240m,2048m)

-Xmx:最大堆大小 -Xms:初始堆大小 -Xmn:年轻代大小

-XXSurvivorRatio:年轻代中Eden区与Survivor区的大小比值 年轻代5120m,

Eden:Survivor=3,Survivor区大小=1024m (3x+x+x=5120 x=1024)

(Survivor区有两个,即将年轻代分为5份,每个Survivor区占一份),总大小为2048m。

-Xms初始堆大小即最小内存值为10240m



6.在Java中,以下数据类型中,需要内存最多的是 :byte long Object int

(long)

Object 是引用数据类型,只申明而不创建实例,只会在栈内存中开辟空间,默认为空,空占1 bit.



7. 下列可作为java语言标识符的是(a1、 $1、 _1、 11)?

(a1、$1、_1)

Java标识符由数字,字母和下划线(_),美元符号($)组成。在Java中是区分大小写的,而且还要求首位不能是数字。最重要的是,Java关键字不能当作Java标识符。



8. 下面说法正确的是?()

A 调用Thread的sleep()方法会释放锁,调用wait()方法不释放锁

B 一个线程调用yield方法,可以使具有相同优先级线程获得处理器

C 在Java中,高优先级的可运行的线程会抢占低优先级线程的资源

D java中,线程可以调用yield方法使比自己低优先级的线程运行

(BC)

wait():等待时线程别人可以用。

sleep():等待时线程还是自己的,别人不能用。

yield():释放锁,同优先级的其他线程有机会获得锁。



9. 以下各类中哪几个是线程安全的?(ArrayList、Vector、Hashtable、Stack )

(Vector、Hashtable、Stack )

ArrayList线程不安全,Vector线程安全

HashMap线程不安全,Hashtable线程安全

由于Stack继承了Vector,所以线程也是安全的



10. 假如某个JAVA进程的JVM参数配置如下:

-Xms1G -Xmx2G -Xmn500M -XX:MaxPermSize=64M -XX:+UseConcMarkSweepGC -XX:SurvivorRatio=3,请问eden区最终分配的大小是多少?

(300M)

先分析一下里面各个参数的含义:

-Xms:1G , 就是说初始堆大小为1G -Xmx:2G , 就是说最大堆大小为2G

-Xmn:500M ,就是说年轻代大小是500M(包括一个Eden和两个Survivor)

-XX:MaxPermSize:64M , 就是说设置持久代最大值为64M

-XX:+UseConcMarkSweepGC , 就是说使用使用CMS内存收集算法

-XX:SurvivorRatio=3 , 就是说Eden区与Survivor区的大小比值为3:1:1题目中所问的Eden区的大小是指年轻代的大小,直接根据-Xmn:500M和-XX:SurvivorRatio=3可以直接计算得出500M(3/(3+1+1)) =500M(3/5) =500M*0.6 =300M 所以Eden区域的大小为300M。





题外话:

想问下大家tag怎么打,因为之前没写过文章,这一下还没找到Tag在哪里打,所以这篇文章应该没有加tag

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP