美文网首页Android面试
牛客网Java练习4

牛客网Java练习4

作者: 香沙小熊 | 来源:发表于2018-11-14 15:38 被阅读3次
    1.下列哪些语句关于内存回收的说明是正确的? ( )

    A 程序员必须创建一个线程来释放内存
    B 内存回收程序负责释放无用内存
    C 内存回收程序允许程序员直接释放内存
    D 内存回收程序可以在指定的时间释放内存对象
    答案 B

    A、JVM一旦启动,就会创建一个守护线程来监测是否需要有对象内存被释放。
    C、无法直接释放。
    D、不可以指定时间,System.gc(),只是提醒JVM可以进行一次Full GC,但是什么时候真正执行,还是不知道的。

    2.Java程序中的类名称必须与存放该类的文件名相同。

    A 对
    B 错

    答案:B
    声明为public类型的类名必须与文件名相同,默认权限的可以不同
    并且内部类的类名一般与文件名不同

    3.ArrayList list = new ArrayList(20);中的list扩充几次

    A 0
    B 1
    C 2
    D 3

    答案

    本题需要注意的是:调用的是带参的构造方法。

    另外也要注意:

    1、如果不指定容量,而初始大小为10,动态增长时,增长到当前容量的1.5倍。

    2、与之类似的还有,HashMap的初始大小为16,增长时,直接容量翻番,如源代码。

    void addEntry(int hash, K key, V value, int bucketIndex) {
        if ((size >= threshold) && (null != table[bucketIndex])) {
            resize(2 * table.length);
            hash = (null != key) ? hash(key) : 0;
            bucketIndex = indexFor(hash, table.length);
        }
     
        createEntry(hash, key, value, bucketIndex);
    }
    
    

    3、Vector的初始大小为10,如果没有指定每次增长的大小,则默认是翻倍增长。

    4.关于匿名内部类叙述正确的是? ( )

    A 匿名内部类可以继承一个基类,不可以实现一个接口
    B 匿名内部类不可以定义构造器
    C 匿名内部类不能用于形参
    D 以上说法都不正确

    答案 B

    匿名内部类的创建格式为:

    new 父类构造器(参数列表)|实现接口(){
    //匿名内部类的类体实现
    }
    
    1. 使用匿名内部类时,必须继承一个类或实现一个接口
    2. 匿名内部类由于没有名字,因此不能定义构造函数
    3. 匿名内部类中不能含有静态成员变量和静态方法
    5.以下程序的输出结果为
    class Base{
        public Base(String s){
            System.out.print("B");
        }
    }
    public class Derived extends Base{
        public Derived (String s) {
            System.out.print("D");
        }
        public static void main(String[] args){
            new Derived("C");
        }
    }
    

    A BD
    B DB
    C C
    D 编译错误
    答案 D

    在调用子类构造器之前,会先调用父类构造器,当子类构造器中没有使用"super(参数或无参数)"指定调用父类构造器时,是默认调用父类的无参构造器,如果父类中包含有参构造器,却没有无参构造器,则在子类构造器中一定要使用“super(参数)”指定调用父类的有参构造器,不然就会报错。

    6.下列说法正确的是()?

    A 对于局部内部类,只有在方法的局部变量被标记为final或局部变量是effctively final的,内部类才能使用它们
    B 成员内部类位于外部类内部,可以直接调用外部类的所有方法(静态方法和非静态方法)
    C 由于匿名内部类只能用在方法内部,所以匿名内部类的用法与局部内部类是一致的
    D 静态内部类可以访问外部类的成员变量
    答案 AB


    image.png
    7.关于下面的程序Test.java说法正确的是( )。
    public class Test {
        static String x="1";
        static int y=1;
        public static void main(String args[]) {
            static int z=2;
            System.out.println(x+y+z);
        }
    }
    

    A 3
    B 112
    C 13
    D 程序有编译错误
    答案 D
    被static修饰的变量称为静态变量,静态变量属于整个类,而局部变量属于方法,只在该方法内有效,所以static不能修饰局部变量

    8.关于访问权限说法正确的是 ? ( )

    A 类定义前面可以修饰public,protected和private
    B 内部类前面可以修饰public,protected和private
    C 局部内部类前面可以修饰public,protected和private
    D 以上说法都不正确
    答案 B
    对于外部类来说,只有两种修饰,public和默认(default),因为外部类放在包中,只有两种可能,包可见和包不可见。
    对于内部类来说,可以有所有的修饰,因为内部类放在外部类中,与成员变量的地位一致,所以有四种可能。

    9.Servlet的生命周期可以分为初始化阶段,运行阶段和销毁阶段三个阶段,以下过程属于初始化阶段是()。

    A 加载Servlet类及.class对应的数据
    B 创建servletRequest和servletResponse对象
    C 创建ServletConfig对象
    D 创建Servlet对象
    答案 A C D


    image.png

    Servlet的生命周期可以分为初始化阶段,运行阶段和销毁阶段三个阶段,以下过程属于初始化阶段是

    1. 加载Servlet类及.class对应的数据
    2. 创建ServletConfig对象
    3. 创建Servlet对象
      每一次请求来到容器时,会产生HttpServletRequest与HttpServlceResponse对象,并在调用service()方法时当做参数传入。
      在WEB容器启动后,会读取Servlet设置信息,将Servlet类加载并实例化,并为每个Servlet设置信息产生一个ServletConfig对象,而后调用Servlet接口的init()方法,并将产生的ServletConfig对象当作参数传入。
    10.下列关于Java并发的说法中正确的是()

    A CopyOnWriteArrayList适用于写多读少的并发场景
    B ReadWriteLock适用于读多写少的并发场景
    C ConcurrentHashMap的写操作不需要加锁,读操作需要加锁
    D 只要在定义int类型的成员变量i的时候加上volatile关键字,那么多线程并发执行i++这样的操作的时候就是线程安全的了

    答案 B

    A,CopyOnWriteArrayList适用于写少读多的并发场景

    B,ReadWriteLock即为读写锁,他要求写与写之间互斥,读与写之间互斥,

    读与读之间可以并发执行。在读多写少的情况下可以提高效率

    C,ConcurrentHashMap是同步的HashMap,读写都加锁

    D,volatile只保证多线程操作的可见性,不保证原子性

    9.在运行时,由java解释器自动引入,而不用import语句引入的包是()。

    A java.lang
    B java.system
    C java.io
    D java.util

    答案 A
    java.lang包是java语言的核心包,lang是language的缩写
    java.lang包定义了一些基本的类型,包括Integer,String之类的,是java程序必备的包,有解释器自动引入,无需手动导入

    10.关于java编译和运行命令叙述不正确的是? ( )

    A 运行“java Scut.class”
    B 运行“java Scut”
    C 运行“javac Scut.java”的输出文件是Scut.class
    D java这个命令的运行对象是Scut.class

    答案 A
    A 错误 运行命令是 java + 你的 Java 程序的名字但是不加后缀 所以这道题错在多了 .class这个后缀
    B 正确
    C javac 是编译命令,后跟 你的 Java 程序名字加后缀,也就是 YourClassName.java 所以答案正确
    D JVM (Java 虚拟机)运行的是编译后的字节码文件(以.class为后缀的文件),也就是 YourClassName.class 所以答案正确

    11.假设如下代码中,若t1线程在t2线程启动之前已经完成启动。代码的输出是()
    public static void main(String[]args)throws Exception {
        final Object obj = new Object();
        Thread t1 = new Thread() {
            public void run() {
                synchronized (obj) {
                    try {
                        obj.wait();
                        System.out.println("Thread 1 wake up.");
                    } catch (InterruptedException e) {
                    }
                }
            }
        };
        t1.start();
        Thread.sleep(1000);//We assume thread 1 must start up within 1 sec.
        Thread t2 = new Thread() {
            public void run() {
                synchronized (obj) {
                    obj.notifyAll();
                    System.out.println("Thread 2 sent notify.");
                }
            }
        };
        t2.start();
    }
    

    A
    Thread 1 wake up
    Thread 2 sent notify.
    B
    Thread 2 sent notify.
    Thread 1 wake up
    C A、B皆有可能
    D 程序无输出卡死

    答案 B
    执行obj.wait();时已释放了锁,所以t2可以再次获得锁,然后发消息通知t1执行,但这时t2还没有释放锁,所以肯定是执行t2,然后释放锁,之后t1才有机会执行。

    12.下列说法正确的有:()

    A class中的constructor不可省略
    B constructor必须与class同名,但方法不能与class同名
    C constructor在一个对象被new 时执行
    D 一个class只能定义一个constructor

    答案 C

    A.constructor可以省略会有一个默认的无参构造方法

    B. 方法可以和类名同名的,和构造方法唯一的区别就是,构造方法没有返回值。

    D.一个class可以有多个重在的构造方法

    13.观察以下代码:
    class Car extends Vehicle
    {
        public static void main (String[] args)
        {
            new  Car(). run();
        }
        private final void run()
        {
            System. out. println ("Car");
        }
    }
    class Vehicle
    {
        private final void run()
        {
            System. out. println("Vehicle");
        }
    }
    

    下列哪些针对代码运行结果的描述是正确的?
    A Car
    B Vehicle
    C Compiler error at line 3
    D Compiler error at line 5
    E Exception thrown at runtime
    答案 A

    首先final声明的方法是不能被覆盖的,但是这里并不错误,因为方法是private的,也就是子类没有继承父类的run方法,因此子类的run方法跟父类的run方法无关,并不是覆盖。new Car().run()也是调用子类的run方法。

    14.关于JAVA的垃圾回收机制,下面哪些结论是正确?

    A 程序可以任意指定释放内存的时间
    B JAVA程序不能依赖于垃圾回收的时间或者顺序
    C 程序可明确地标识某个局部变量的引用不再被使用
    D 程序可以显式地立即释放对象占有的内存
    答案 B
    GC是完全自动的,不能确定具体的回收时间

    15.在开发中使用泛型取代非泛型的数据类型(比如用ArrayList<String>取代ArrayList),程序的运行时性能会变得更好。

    A 对
    B 错
    答案 B
    泛型仅仅是java的一颗语法糖,它不会影响java虚拟机生成的汇编代码,在编译阶段,虚拟机就会把泛型的类型擦除,还原成没有泛型的代码,顶多编译速度稍微慢一些,执行速度是完全没有什么区别的。

    16.对于文件的描述正确的是( )

    A 文本文件是以“.txt”为后缀名的文件,其他后缀名的文件是二进制文件。
    B File类是Java中对文件进行读写操作的基本类。
    C 无论文本文件还是二进制文件,读到文件末尾都会抛出EOFException异常。
    D Java中对于文本文件和二进制文件,都可以当作二进制文件进行操作。
    答案 D
    A.文件分为文本文件和二进制文件,计算机只认识二进制,所以实际上都是二进制的不同解释方式。文本文件是以不同编码格式显示的字符,例如Ascii、Unicode等,window中文本文件的后缀名有".txt",".log",各种编程语言的源码文件等;二进制文件就是用文本文档打开是看不懂乱码,只要能用文本打开的文件都可以算是文本文件,只是显示的结果不是你想要的,二进制文件只有用特殊的应用才能读懂的文件,例如".png",".bmp"等,计算机中大部分的文件还是二进制文件。
    B.File类是对文件整体或者文件属性操作的类,例如创建文件、删除文件、查看文件是否存在等功能,不能操作文件内容;文件内容是用IO流操作的。
    C.当输入过程中意外到达文件或流的末尾时,抛出EOFException异常,正常情况下读取到文件末尾时,返回一个特殊值表示文件读取完成,例如read()返回-1表示文件读取完成。
    D.上面A选项已经说了,不论是文本文件还是二进制文件,在计算机中都是以二进制形式存储的,所以都当做二进制文件读取。

    17.以下代码的输出结果是?
    public class B
    {
        public static B t1 = new B();
        public static B t2 = new B();
        {
            System.out.println("构造块");
        }
        static
        {
            System.out.println("静态块");
        }
        public static void main(String[] args)
        {
            B t = new B();
        }
    }
    

    A 静态块 构造块 构造块 构造块
    B 构造块 静态块 构造块 构造块
    C 构造块 构造块 静态块 构造块
    D 构造块 构造块 构造块 静态块
    答案 C

    开始时JVM加载B.class,对所有的静态成员进行声明,t1 t2被初始化为默认值,为null,又因为t1 t2需要被显式初始化,所以对t1进行显式初始化,初始化代码块→构造函数(没有就是调用默认的构造函数),咦!静态代码块咋不初始化?因为在开始时已经对static部分进行了初始化,虽然只对static变量进行了初始化,但在初始化t1时也不会再执行static块了,因为JVM认为这是第二次加载类B了,所以static会在t1初始化时被忽略掉,所以直接初始化非static部分,也就是构造块部分(输出''构造块'')接着构造函数(无输出)。接着对t2进行初始化过程同t1相同(输出'构造块'),此时就对所有的static变量都完成了初始化,接着就执行static块部分(输出'静态块'),接着执行,main方法,同样也,new了对象,调用构造函数输出('构造块')

    18.下面有关java类加载器,说法正确的是?

    A 引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的
    B 扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。
    C 系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类
    D tomcat为每个App创建一个Loader,里面保存着此WebApp的ClassLoader。需要加载WebApp下的类时,就取出ClassLoader来使用
    答案 A B C D

    19.JDK提供的用于并发编程的同步器有哪些?

    A Semaphore
    B CyclicBarrier
    C CountDownLatch
    D Counter

    答案:ABC
    A,Java 并发库 的Semaphore 可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。
    B,CyclicBarrier 主要的方法就是一个:await()。await() 方法没被调用一次,计数便会减少1,并阻塞住当前线程。当计数减至0时,阻塞解除,所有在此 CyclicBarrier 上面阻塞的线程开始运行。
    C,直译过来就是倒计数(CountDown)门闩(Latch)。倒计数不用说,门闩的意思顾名思义就是阻止前进。在这里就是指 CountDownLatch.await() 方法在倒计数为0之前会阻塞当前线程。
    D,Counter不是并发编程的同步器

    20.有关线程的叙述正确的是()

    A 可以获得对任何对象的互斥锁定
    B 通过继承Thread类或实现Runnable接口,可以获得对类中方法的互斥锁定
    C 线程通过使用synchronized关键字可获得对象的互斥锁定
    D 线程调度算法是平台独立的
    答案 C D

    线程调度分为协同式调度和抢占式调度,Java使用的是抢占式调度,也就是每个线程将由操作系统来分配执行时间,线程的切换不由线程本身来决定(协同式调度)。这就是平台独立的原因。
    D正确

    相关文章

      网友评论

        本文标题:牛客网Java练习4

        本文链接:https://www.haomeiwen.com/subject/cmqlfqtx.html