牛客刷题知识点整理(1)

1.关于容器下面说法正确的是? ( )

A.列表(List)和集合(Set)存放的元素都是可重复的。
B.列表(List)和集合(Set)存放的元素都是不可重复的。
C.映射(Map)<key,value>中key是可以重复的。
D.映射(Map)<key,value>中value是可以重复的。

正确答案:D

解析:List底层是数组存储数据,有序、可重复的

           set底层是HashMap,无序、不可重复的

set在添加元素的过程就是调用map的put()方法,添加的元素作为map的key,value是一个Object对象,HashMap底层是哈希表,数组+链表形式,根据key的hashcode()方法获取到的值与它的高16位进行一个异或运算,得到哈希值,再通过计算定位出它在数组中存放的位置,所以说是无序的,如果定位的位置有元素了,那就采用链地址法,就是比较hash值,如果有相同的新的值覆盖掉旧的值,如果没有,jdk1.7是新元素放在头节点,jdk1.8是放在尾节点,jdk1.8新增了红黑树
总之,map的key不可重复,value是可以重复的


2.给定以下方法声明,调用执行mystery(1234)的输出结果?

1

2

3

4

5

6

7

8

9

10

11

//precondition:  x >=0

public void mystery (int x)

{

System.out.print(x % 10);

if ((x / 10) != 0)

{

mystery(x / 10);

}

System.out.print(x % 10);

}

A.1441
B.43211234
C.3443
D.12344321

正确答案:B

注意:程序是从上往下执行的,所以当一个方法,调用另一个或本方法时,程序会等调用完毕以后在接着执行

1.第一次调用mystery方法,此时参数(x)为1234,进入第四行,x不变为x=1234,1234%10=4,输出 4

2.接着进入if语句,1234/10=123 !=0,进入if语句,此时x还是1234,接着第二次调用mystery方法此时第一次调用的方法不会继续执行,会等第二次(本次)调用的方法执行完毕后继续执行),mystery(x/10),传入的参数(x)为123,然后第四行123%10=3,参数还是不变为123,输出 3

3.接着进入if语句,第三次调用mystery()方法(此时第二次调用的方法不会继续执行,会等第三次(本次)调用的方法执行完毕后继续执行)传入参数为123/10=12, x=12,接着第四行12%10=2,传入的参数值不会变,输出 2

4.然后进入if语句12/10!=0,第四次调用mystery()方法(此时第三次调用的方法不会继续执行,会等第四次调用的方法(本次)执行完毕后继续执行),传入的参数(x=1)为1,进入第四行1%10,输出 1

5.然后进入if语句1/10=0不满足if语句x/10 != 0,所以本次不会继续调用mystery方法,然后程序继续执行调用下面的输出参数为1,1%10,输出 1

6.然后第四次调用的方法执行结束然后返回第三次调用的方法继续执行,调用下面的输出,参数为12,x%10=2,输出 2

7.然后第三次调用的方法执行结束然后返回第二次调用的方法继续执行,此时调用下面的输出,参数为123,x%10=3,输出 3

8.最后第二次调用的方法执行结束然后回第一次调用的方法继续执行,此时调用下面的输出,参数为1234,x%10=4,输出 4

9.第一次调用方法结束


3.一维数组与线性表的区别是(    )。

A.前者长度固定,后者长度可变
B.后者长度固定,前者长度可变
C.两者长度均固定
D.两者长度均可变

正确答案:A

数组的长度是固定不变的,线性表的长度是线性表中数据元素的个数,随着线性表的插入删除操作进行,量发生改变。


4.下列关于Java中类的构造方法的描述,正确的是()

A.构造方法的返回类型为void
B.可以定义一个类而在代码中不写构造方法。
C.在同一个类中定义的重载构造方法不可以相互调用。
D.子类不允许调用父类的构造方法。

正确答案:B

在同一个类中一个构造方法想调用另一个构造方法,需要用this()的形式,自动调用到对应的构造方法。在JAVA中如果不写构造方法的话,会默认加上一个无参数的构造方法,但是如果已经有了一个有参数的构造方法,那么无参数的构造方法就不会默认被加上。


5.给出以下代码

1

2

3

4

5

6

7

8

9

10

public class TestObj{

    public static void main(String[] args){

        Object o=new Object(){

            public boolean equals(Object obj){

                return true;

            }

        };

        System.out.println(o.equals("Fred"));

    }

}

请给出结果:()

A.运行时抛出异常
B.true
C.Fred
D.第三行编译错误

正确答案:B

创建了一个匿名内部类,并将所创建的匿名对象赋给 Object (多态:子类对象赋给超类引用)。同时,该匿名内部类重写了 Object 类的 equals 方法。


6下列哪些操作会使线程释放锁资源?

A.sleep()
B.wait()
C.join()
D.yield()

正确答案:B D

1.sleep()方法

在指定时间内让当前正在执行的线程暂停执行,但不会释放“锁标志”。不推荐使用。

sleep()使当前线程进入阻塞状态,在指定时间内不会执行。

2.wait()方法

在其他线程调用对象的notify或notifyAll方法前,导致当前线程等待。线程会释放掉它所占有的“锁标志”,从而使别的线程有机会抢占该锁。

当前线程必须拥有当前对象锁。如果当前线程不是此锁的拥有者,会抛出IllegalMonitorStateException异常。

唤醒当前对象锁的等待线程使用notify或notifyAll方法,也必须拥有相同的对象锁,否则也会抛出IllegalMonitorStateException异常。

waite()和notify()必须在synchronized函数或synchronized block中进行调用。如果在non-synchronized函数或non-synchronized block中进行调用,虽然能编译通过,但在运行时会发生IllegalMonitorStateException的异常。

3.yield方法

暂停当前正在执行的线程对象。

yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。

yield()只能使同优先级或更高优先级的线程有执行的机会。 

4.join方法

join()等待该线程终止。

等待调用join方法的线程结束,再继续执行。如:t.join();//主要用于等待t线程运行结束,若无此句,main则会执行完毕,导致结果不可预测


7.有关hashMap跟hashtable的区别,说法正确的是?

A.HashMap和Hashtable都实现了Map接口
B.HashMap是非synchronized,而Hashtable是synchronized
C.HashTable使用Enumeration,HashMap使用Iterator
D.HashMap允许将 null 作为一个 entry 的 key 或者 value,而 Hashtable 不允许。

正确答案:A B C D

1.HashMap是继承自AbstractMap类,而HashTable是继承自Dictionary类。不过它们都实现了同时实现了map、Cloneable(可复制)、Serializable(可序列化)这三个接口

2.对外提供的接口不同
Hashtable比HashMap多提供了elments() 和contains() 两个方法。

elments() 方法继承自Hashtable的父类Dictionnary。elements() 方法用于返回此Hashtable中的value的枚举。

contains()方法判断该Hashtable是否包含传入的value。它的作用与containsValue()一致。事实上,contansValue() 就只是调用了一下contains() 方法。

3.线程安全性不同
Hashtable是线程安全的,它的每个方法中都加入了Synchronize方法。在多线程并发的环境下,可以直接使用Hashtable,不需要自己为它的方法实现同步

HashMap不是线程安全的,在多线程并发的环境下,可能会产生死锁等问题。具体的原因在下一篇文章中会详细进行分析。使用HashMap时就必须要自己增加同步处理,

4.Hashtable既不支持Null key也不支持Null value。Hashtable的put()方法的注释中有说明。

HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,可能是 HashMap中没有该键,也可能使该键所对应的值为null。

详情请看原文链接:https://blog.csdn.net/wangxing233/article/details/79452946


8.在JDK1.7中,下述说法中抽象类与接口的区别与联系正确的有哪些?

A.抽象类中可以有普通成员变量,接口中没有普通成员变量。
B.抽象类和接口中都可以包含静态成员常量。
C.一个类可以实现多个接口,但只能继承一个抽象类
D.抽象类中可以包含非抽象的普通方法,接口中的方法必须是抽象的,不能有非抽象的普通方法。

正确答案:A B C D

抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型


9.下面代码运行结果是?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

public class Test{

static{

   int x=5;

}

static int x,y;

public static void main(String args[]){

   x--;

   myMethod( );

   System.out.println(x+y+ ++x);

}

public static void myMethod( ){

  y=x++ + ++x;

 }

}

 

A.compiletime error
B.prints:1
C.prints:2
D.prints:3
E.prints:7
F.prints:8

正确答案:D

1.JVM加载class文件时,就会执行静态代码块,静态代码块中初始化了一个变量x并初始化为5,由于该变量是个局部变量,静态代码快执行完后变被释放。

2.申明了两个静态成员变量x,y,并没有赋初值,会有默认出值,int类型为0,

3.执行x--操作,变量单独进行自增或自减操作x--和--x的效果一样,此时x变为了-1

4.调用MyMethod()方法,在该方法中对x和y进行计算,由于x和y都是静态成员变量,所以在整个类的生命周期内的x和y都是同一个

5.y=x++ + ++x可以看成是y=(x++)+(++x),当++或者--和其它变量进行运算时,x++表示先运算,再自增,++x表示先自增再参与运算

所以就时x为-1参与运算,然后自增,x此时为0,++x后x为1,然后参与运算,那么y=-1+1就为0,此时x为1

6.执行并打印x+y + ++x运算方式和第5步相同,最后计算结果就为3.


10.关于线性表叙述,正确的是()

A.不可随机访问任意节点
B.插入需要移动元素
C.删除不需要移动元素
D.存储空间可以离散分布

正确答案:D

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值