2.10Java专项测试复盘

  • 下列程序的运行结果

    public static void main(String args[]) {
            Thread t = new Thread() {
                public void run() {
                    pong();
                }
            };
            t.run();
            System.out.print("ping");
        }
        static void pong() {
            System.out.print("pong");
        }
    }

    A. pingpong
    B. pongping
    C. pingpong和pongping都有可能
    D. 都不输出

    解析:在第7行的时候,调用的是t.run();方法,之间调用run方法就是普通的方法调用而已,所以肯定是先执行pong()再执行System.out.print(“ping”);
    如果第7行换成t.start()方法,答案就应该选择c,因为t.start()后,线程变为就绪状态,什么时候开始执行时不确定的,可能是主程序先继续执行,也可能是新线程先执行。

    答案:B

  • 要使某个类能被同一个包中的其他类访问,但不能被这个包以外的类访问,可以( )
    A. 让该类不使用任何关键字
    B. 使用private关键字
    C. 使用protected关键字
    D. 使用void关键字

    解析:
    在这里插入图片描述
    protected接受包外的子类访问
    答案:A

  • 在Web应用程序中,( )负责将HTTP请求转换为HttpServletRequest对象
    A. Servlet对象
    B. HTTP服务器
    C. Web容器
    D. JSP网页

    解析:web容器是一种服务程序,在服务器一个端口就有一个提供相应服务的程序,而这个程序就是处理从客户端发出的请求,如JAVA中的Tomcat容器,ASP的IIS或PWS都是这样的容器。一个服务器可以多个容器。
    答案:C

  • Hashtable 和 HashMap 的区别是:
    A. Hashtable 是一个哈希表,该类继承了 AbstractMap,实现了 Map 接口
    B. HashMap 是内部基于哈希表实现,该类继承AbstractMap,实现Map接口
    C. Hashtable 线程安全的,而 HashMap 是线程不安全的
    D. Properties 类 继承了 Hashtable 类,而 Hashtable 类则继承Dictionary 类
    E. HashMap允许将 null 作为一个 entry 的 key 或者 value,而 Hashtable 不允许。

    解析:Hashtable:
    (1)Hashtable 是一个散列表,它存储的内容是键值对(key-value)映射。
    (2)Hashtable 的函数都是同步的,这意味着它是线程安全的。它的key、value都不可以为null。
    (3)HashTable直接使用对象的hashCode。
    HashMap:
    (1)由数组+链表组成的,基于哈希表的Map实现,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的。
    (2)不是线程安全的,HashMap可以接受为null的键(key)和值(value)。
    (3)HashMap重新计算hash值
    Hashtable,HashMap,Properties继承关系如下:

    public class Hashtable<K,V> extends Dictionary<K,V>
        implements Map<K,V>, Cloneable, java.io.Serializable
        
    public class HashMap<K,V>extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable

     

    java.lang.Objecct
      java.util.Dictionary<K,V>        
           java.util.Hashtable<Object,Object>
                      java.util.Properties

    答案:BCDE

  • 下列说法错误的有( )
    A. Java面向对象语言容许单独的过程与函数存在
    B. Java面向对象语言容许单独的方法存在
    C. Java语言中的非静态方法属于类中的成员(member)
    D. Java语言中的方法必定隶属于某一类(对象),调用方法与C语言的过程或C++语言的函数相同

    解析: java不允许单独的方法,过程或函数存在,需要隶属于某一类中。——AB错;java语言中的方法属于对象的成员,而不是类的成员。不过,其中静态方法属于类的成员。——C错;D问的是java调用方法和C调用过程,C+ + 的函数一样?肯定不一样。错
    答案:ABCD

  • 下列哪项不属于jdk1.6垃圾收集器?
    A. Serial收集器
    B. parNew收集器
    C. CMS收集器
    D. G1收集器

    解析:G1收集器是jdk1.7引入的
      
    在这里插入图片描述

    答案:D

  • Test.main()函数执行后的输出是( )

    class Test {
        public static void main(String[] args) {
            System.out.println(new B().getValue());
        }
        static class A {
            protected int value;
            public A (int v) {
                setValue(v);
            }
            public void setValue(int value) {
                this.value= value;
            }
            public int getValue() {
                try {
                    value ++;
                    return value;
                } finally {
                    this.setValue(value);
                    System.out.println(value);
                }
            }
        }
        static class B extends A {
            public B () {
                super(5);
                setValue(getValue()- 3);
            }
            public void setValue(int value) {
                super.setValue(2 * value);
            }
        }
    }

     

    A. 6 7 7
    B. 22 34 17
    C. 22 74 74
    D. 11 17 34

    解析:new B()第一步执行B的构造方法,先调用super(5),父类构造器中执行setValue()方法,由于B重写了setValue()方法,所以执行的是B中的setValue()方法,此时value = 2×5 = 10。
    new B()第二步setValue(getValue()- 3);,先调用getValue()方法,B没重写getValue方法,所以调用A中的getValue方法。value++; return value;此时返回的value = 11。但是由于getValue块被try finally块包围,因此finally中的语句无论如何都将被执行,所以11这个返回值会先暂存起来,到finally语句块执行完毕后再真正返回出去。finally块中this.setValue(value);调用的是B的setValue方法,此时value = 2×11=22,打印输出。但不影响返回值为11。此时B构造器中setValue的参数为11-3=8,执行完之后value = 2 × 8 =16。
    主函数中输出的是new B().getValue(),我们还要执行getValue方法。同之前一样,getValue中的返回值为16+1=17,打印值为2×17=34,主函数中输出的是返回值17.
    所以输出为22 34 17

    答案:B

  • java8中,下面哪个类用到了解决哈希冲突的开放定址法
    A. LinkedHashSet
    B. HashMap
    C. ThreadLocal
    D. TreeMap

    解析:ThreadLocal的set方法可能会有的情况。
    1.探测过程中slot都不无效,并且顺利找到key所在的slot,直接替换即可
    2.探测过程中发现有无效slot,调用replaceStaleEntry,效果是最终一定会把key和value放在这个slot,并且会尽可能清理无效slot
    2.1 在replaceStaleEntry过程中,如果找到了key,则做一个swap把它放到那个无效slot中,value置为新值
    2.2 在replaceStaleEntry过程中,没有找到key,直接在无效slot原地放entry
    3.探测没有发现key,则在连续段末尾的后一个空位置放上entry,这也是线性探测法的一部分。放完后,做一次启发式清理,如果没清理出去key,并且当前table大小已经超过阈值了,则做一次rehash,rehash函数会调用一次全量清理slot方法也即expungeStaleEntries,如果完了之后table大小超过了threshold – threshold / 4,则进行扩容2倍。

    答案:C

  • 在Java中,对于不再使用的内存资源,如调用完成的方法,“垃圾回收器”会自动将其释放。( )

    解析:java 虚拟机,对于方法的调用采用的是栈帧(方法调用和方法执行),调用则入栈,完成之后则出栈。不就回收了内存资源。而针对于其他,GC回收的时间不定。
    答案:ב’

  • Java数据库连接库JDBC用到哪种设计模式?
    A. 生成器
    B. 桥接模式
    C. 抽象工厂
    D. 单例模式

    解析:桥接模式是结构型模式,关注点在依赖关系的维护。对于jdbc技术来说,它解耦了业务与数据库通信协议这两个纬度之间的关系,所以这两个纬度之间的关系就需要一个桥,即Driver,至于DriverManager把这个关系接到哪里就是运行时的事情了。
    微观上,从connection的创建来看,它更像一个抽象工厂模式,特定的Driver创建对应的connection。
    宏观上,从业务代码与connection的关系来看,关键点在于一个sql怎么转化为对应的通信协议,就属于桥接。

    答案:B

  • 关于下面的一段代码,以下哪些说法是正确的:

    public static void main(String[] args) {
        String a = new String("myString");
        String b = "myString";
        String c = "my" + "String";
        String d = c;
        System.out.print(a == b);
        System.out.print(a == c);
        System.out.print(b == c);
        System.out.print(b == d);
    }

     

    A. System.out.print(a == b)打印出来的是false
    B. System.out.print(a == c)打印出来的是true
    C. System.out.print(b == c)打印出来的是false
    D. System.out.print(b == d)打印出来的是true

    解析:A:a指向堆内存,b指向常量池,因此地址不相等,false
    B:java有常量优化机制,c也指向常量池,且与b指向同一个,则a与c地址不相等,false;
    C:b与c地址相等,true
    D:d是c的副本,地址相同,所以b与d地址相等,true

    答案:AD

posted @ 2020-02-10 22:23  19呀  阅读(244)  评论(0编辑  收藏  举报