牛客网第二天

  1. 下列循环语句序列执行完成后,i的值是()
    int i;
    for(i=2;i<=10;i++){
    System.out.println(i);
    }
    A.2
    B.10
    C.11
    D.不确定
    正确答案: C 你的答案: C (正确)
    解析:++是先用在+1,当10的时候还满足i<=10,然后+1,11不满足先输出再+1
    所以输出的数是11。
    2.下面属于java合法变量定义的是?
    A.final
    B.1var1
    C._var2
    D.var3&
    正确答案: C 你的答案: C (正确)
    解析:
    A.final 是关键字
    B.不能以数字做首写
    C.首写字母可以为下划线
    D.不能与&相组合来命名
    3.在Java中,关于HashMap类的描述,以下错误的是
    A.HashMap使用键/值得形式保存数据
    B.HashMap 能够保证其中元素的顺序
    C.HashMap允许将null用作键
    D.HashMap允许将null用作值
    正确答案: B 你的答案: B (正确)
    解析:. 关于HashMap的一些说法:
    a) HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。HashMap的底层结构是一个数组,数组中的每一项是一条链表。
    b) HashMap的实例有俩个参数影响其性能: “初始容量” 和 装填因子。
    c) HashMap实现不同步,线程不安全。 HashTable线程安全
    d) HashMap中的key-value都是存储在Entry中的。
    e) HashMap可以存null键和null值, 不保证元素的顺序恒久不变 ,它的底层使用的是数组和链表,通过hashCode()方法和equals方法保证键的唯一性
    f) 解决冲突主要有三种方法:定址法,拉链法,再散列法。HashMap是采用拉链法解决哈希冲突的。
    注: 链表法是将相同hash值的对象组成一个链表放在hash值对应的槽位;
    用开放定址法解决冲突的做法是:当冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列。 沿此序列逐个单元地查找,直到找到给定 的关键字,或者碰到一个开放的地址(即该地址单元为空)为止(若要插入,在探查到开放的地址,则可将待插入的新结点存人该地址单元)。拉链法解决冲突的做法是: 将所有关键字为同义词的结点链接在同一个单链表中 。若选定的散列表长度为m,则可将散列表定义为一个由m个头指针组成的指针数 组T[0…m-1]。凡是散列地址为i的结点,均插入到以T[i]为头指针的单链表中。T中各分量的初值均应为空指针。在拉链法中,装填因子α可以大于1,但一般均取α≤1。拉链法适合未规定元素的大小。
    4 . 有如下4条语句:()
    Integer i01=59;
    int i02=59;
    Integer i03=Integer.valueOf(59);
    Integer i04=new Integer(59);
    以下输出结果为false的是:
    A.System.out.println(i01i02);
    B.System.out.println(i01
    i03);
    C.System.out.println(i03i04);
    D.System.out.println(i02
    i04);
    正确答案: C 你的答案: C (正确)
    解析: ①无论如何,Integer与new Integer不会相等。不会经历拆箱过程,
    ②两个都是非new出来的Integer,如果数在-128到127之间,则是true,否则为false
    java在编译Integer i2 = 128的时候,被翻译成-> Integer i2 = Integer.valueOf(128);而valueOf()函数会对-128到127之间的数进行缓存
    ③两个都是new出来的,都为false
    ④int和integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比
    5 . 当使包含 applet 程序的页面从最小化恢复时,以下选项中的哪个方法将被执行?( )
    A.paint()
    B.start()
    C.destroy()
    D.stop()
    正确答案: A 你的答案: B (错误)
    applet页面刚打开时,程序调用init()然后调用start()再然后paint()
    用户离开applet页面,程序自动调用stop(),用户关闭浏览器,程序触发destroy()
    并且paint()在每一次浏览器显示页面时被调用。
    最小化点开–>页面重新显示,之前进程没丢,只有paint()。
    6.关于String,StringBuilder以及StringBuffer,描述错误的是()
    A.对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象
    B.StringBuffer是线程安全
    C.StringBuilder是线程安全
    D.可以修改StringBuilder和StringBuffer的内容
    正确答案: C 你的答案: B (错误)
    解析:1.ava中的字符串存储在字符串常量区,不会改变,发生改变是会新创建一个对象
    2.线程安全:(Buffer是一个资源,有锁访问的,线程安全的)
    非线程安全的情况:当A获取到这条数据,准备修改时,B线程进来了,校验完数据,发现数据不正确,就把数据移除了,这时A线程仍旧认为当前持有的数据还是开始获取的数据,这样再做处理就会报空了。
    线程安全的情况:就是当一个线程需要对这个数据进行改写时,会给这个数据上一个同步锁,比如A线程拿到数据后,给数据加上同步锁,这时候B线程进来了,但是这时候数据已经上锁,B线程则需要等待A线程释放锁之后才能对数据进行操作,这样就防止了脏数据的产生。
    String:字符串常量,字符串长度不可变。Java中String是immutable(不可变)的。
    7.关于PreparedStatement与Statement描述错误的是()
    A.一般而言,PreparedStatement比Statement执行效率更高
    B.PreparedStatement会预编译SQL语句
    C.Statement每次都会解析/编译SQL,确立并优化数据获取路径
    DStatement执行扫描的结果集比PreparedStatement大
    正确答案: D 你的答案: C (错误)
    解析:因为PreparedStatement有预编译的过程,所以第一次扫描的集合
    PreparedStatement会大于等于 Statement

  2. 说明输出结果。
    package test;
    import java.util.Date;
    public class SuperTest extends Date{
    private static final long serialVersionUID = 1L;
    private void test(){
    System.out.println(super.getClass().getName());
    }
    public static void main(String[]args){
    new SuperTest().test();
    }
    }
    A.SuperTest
    B.SuperTest.class
    C.test.SuperTest
    D.test.SuperTest.class
    正确答案: C 你的答案: C (正确)
    解析: TestSuper和Date的getClass都没有重写,他们都是调用Object的getClass,而Object的getClass作用是返回的是运行时的类的名字。这个运行时的类就是当前类,所以
    super.getClass().getName()
    返回的是test.SuperTest,与Date类无关
    要返回Date类的名字需要写super.getClass().getSuperclass()
    9.java中下面哪些是Object类的方法()
    A.notify()
    B.notifyAll()
    C.sleep()
    D.wait()
    正确答案: A B D 你的答案: B (错误)
    解析:Object类中方法:
    protected Object clone()创建并返回此对象的一个副本。
    boolean equals(Object obj)指示其他某个对象是否与此对象“相等”。
    protected void finalize()当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
    class getClass()返回此 Object 的运行时类。
    int hashCode()返回该对象的哈希码值。
    void notify()唤醒在此对象监视器上等待的单个线程。
    void notifyAll()唤醒在此对象监视器上等待的所有线程。
    String toString()返回该对象的字符串表示。
    void wait()在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
    void wait(long timeout)在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量前,导致当前线程等待。
    void wait(long timeout, int nanos)在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量前,导致当前线程等待。
    10.public class NameList
    {
    private List names = new ArrayList();
    public synchronized void add(String name)
    {
    names.add(name);
    }
    public synchronized void printAll() {
    for (int i = 0; i < names.size(); i++)
    {
    System.out.print(names.get(i) + ””);
    }
    }

    public static void main(String[]args)
    {
    final NameList sl = new NameList();
    for (int i = 0; i < 2; i++)
    {
    new Thread()
    {
    public void run()
    {
    sl.add(“A”);
    sl.add(“B”);
    sl.add(“C”);
    sl.printAll();
    }
    } .start();
    }
    }
    }
    Which two statements are true if this class is compiled and run?
    A.An exception may be thrown at runtime.
    B.The code may run with no output, without exiting.
    C.The code may run with no output, exiting normally(正常地).
    D.The code may rum with output “A B A B C C “, then exit.
    E.The code may rum with output “A B C A B C A B C “, then exit.
    F.The code may ruin with output “A A A B C A B C C “, then exit.
    G.The code may ruin with output “A B C A A B C A B C “, then exit.
    解析:
    在每个线程中都是顺序执行的,所以sl.printAll();必须在前三句执行之后执行,也就是输出的内容必有(连续或非连续的)ABC。
    而线程之间是穿插执行的,所以一个线程执行 sl.printAll();之前可能有另一个线程执行了前三句的前几句。
    E答案相当于线程1顺序执行完然后线程2顺序执行完。
    G答案则是线程1执行完前三句add之后线程2插一脚执行了一句add然后线程1再执行 sl.printAll();输出ABCA。接着线程2顺序执行完输出ABCABC
    输出加起来即为ABCAABCABC。

你可能感兴趣的:(练习题)