牛客网java专项练习错题集--1

 1.有关hashMap跟hashTable的区别,说法正确的是?(ABCD)

A HashMap和Hashtable都实现了Map接口

 

B HashMap是非synchronized,而Hashtable是synchronized

 

C HashTable使用Enumeration,HashMap使用Iterator

 

D HashMap允许将 null 作为一个 entry 的 key 或者 value,而 Hashtable 不允许。

HashTable和HashMap区别

1 继承不同。

public class Hashtable extends Dictionary implements Map 
public class HashMap extends AbstractMap implements Map
2
Hashtable 中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。在多线程并发的环境下,
可以直接使用Hashtable,但是要使用HashMap的话就要自己增加同步处理了。
3
Hashtable中,key和value都不允许出现null值。
在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返
回null值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能
由get()方法来判断HashMap中是否存在某个键, 而应该用containsKey()方法来判断。
4 两个遍历方式的内部实现上不同。
Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。
5
哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。
⑥
Hashtable和HashMap它们两个内部实现方式的数组的初始大小和扩容的方式。HashTable中hash数组默认大小
是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。 

 

2.下面关于变量及其范围的陈述哪些是不正确的(C)

A 实例变量是类的成员变量

 

B 实例变量用关键字static声明

 

C 在方法中定义的局部变量在该方法被执行时创建

 

D 局部变量在使用前必须被初始化

链接:https://www.nowcoder.com/questionTerminal/8594961e5b04442084ab6d5ae0f536e2
来源:牛客网

A.类的成员变量包括实例变量和类变量(静态变量),成员方法包括实例方法和类方法(静态方法)。 A正确
B.类变量(静态变量)用关键字static声明,B错误
C.方法中的局部变量在方法被调用加载时开始入栈时创建,方法入栈创建栈帧包括局部变量表操作数栈,
局部变量表存放局部变量,并非在执行该方法时被创建,C错误
D.局部变量被使用前必须初始化,否则程序报错。D正确

3. 以下哪种方式实现的单例是线程安全的(ABCD)

A 枚举

 

B 静态内部类

 

C 双检锁模式

 

D 饿汉式

1.饿汉式(线程安全,调用效率高,但是不能延时加载); 
2.懒汉式(线程安全,调用效率不高,但是能延时加载); 
3.Double CheckLock实现单例:DCL也就是双重锁判断机制(由于JVM底层模型原因,偶尔会出问题,不建议使用); 
4.静态内部类实现模式(线程安全,调用效率高,可以延时加载); 
5.枚举类(线程安全,调用效率高,不能延时加载,可以天然的防止反射和反序列化调用)。
 

4.如果希望监听TCP端口9000,服务器端应该怎样创建socket?(B)

A new Socket("localhost",9000);

 

B new ServerSocket(9000);

 

C new Socket(9000);

 

D new ServerSocket("localhost",9000);

 

ServerSocket(int port) 是服务端绑定port端口,调accept()监听等待客户端连接,
它返回一个连接队列中的一个socket。
Socket(InetAddress address , int port)是创建客户端连接主机的socket流,
其中InetAddress是用来记录主机的类,port指定端口。

socket和servletSocket的交互如下图所示:

 

5.以下代码的输出结果是?(C)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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 构造块 构造块 构造块 静态块

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

 6.下面有关JAVA swing的描述,说法错误的是?(c)

A Swing是一个基于Java的跨平台MVC框架。使用单线程模式。

 

B Swing 是为了解决 AWT 存在的问题而新开发的包,它以 AWT 为基础的

 

C Swing优化了AWT,运行速度比AWT快

D Swing是一个基于组件的框架,所有的组件都是从javax.swing.JComponent类继承来的

Swing 是在AWT的基础上构建的一套新的图形界面系统,它提供了AWT 所能够提供的所有功能,
并且用纯粹的Java代码,对AWT 的功能进行了大幅度的扩充。
AWT 是基于本地方法的C/C++程序,其运行速度比较快;
Swing是基于AWT 的Java程序,其运行速度比较慢。
 

 7.java中下面哪个能创建并启动线程(c)

 

1

2

3

4

5

public class MyRunnable implements Runnable          { 

     public void run()             { 

         //some code here 

     } 

 }

 

A new Runnable(MyRunnable).start()

 

B new Thread(MyRunnable).run()

 

C new Thread(new MyRunnable()).start()

D new MyRunnable().start()

链接:https://www.nowcoder.com/questionTerminal/8f4a97a1101148cab4efa69bd67e5ac3
来源:牛客网

首先:创建并启动线程的过程为:定义线程—》实例化线程—》启动线程。
一 、定义线程: 1、扩展java.lang.Thread类。 2、实现java.lang.Runnable接口。
二、实例化线程: 1、如果是扩展java.lang.Thread类的线程,则直接new即可。
                 2、如果是实现了java.lang.Runnable接口的类,则用Thread的构造方法:
        Thread(Runnable target) 
        Thread(Runnable target, String name) 
        Thread(ThreadGroup group, Runnable target) 
        Thread(ThreadGroup group, Runnable target, String name) 
        Thread(ThreadGroup group, Runnable target, String name, long stackSize)
所以A、D的实例化线程错误。
三、启动线程: 在线程的Thread对象上调用start()方法,而不是run()或者别的方法。
所以B的启动线程方法错误

 

8.类B从类A派生,则类B可以访问类A中的( ABC)成员?

A public成员

 

B private成员

 

C protected成员

 

D 所有数据成员

 

E 所有函数成员

DE 数据成员和函数成员默认是default访问权限,同一个包下的所有类都可以访问
类B不一定和类A同包,所以DE才错
 

 

9. 看以下代码:

文件名称:forward.jsp

1

2

3

4

5

6

<html>  

     <head><title> 跳转  </title> </head> 

     <body>  

         <jsp:forward page="index.htm"/>     

     </body>

 </html> 

如果运行以上jsp文件,地址栏的内容为(A)

 

A http://127.0.0.1:8080/myjsp/forward.jsp

 

B http://127.0.0.1:8080/myjsp/index.jsp

 

C http://127.0.0.1:8080/myjsp/index.htm

 

D http://127.0.0.1:8080/myjsp/forward.htm

 

redirect:请求重定向:客户端行为,本质上为2次请求,地址栏改变,前一次请求对象消失。

举例:你去银行办事(forward.jsp),结果告诉你少带了东西,你得先去***局办(index.html)临时身份证,

这时你就会走出银行,自己前往***局,地址栏变为index.html.

forward:请求转发:服务器行为,地址栏不变。

举例:你把钱包落在出租车上,你去警察局(forward.jsp)报案,警察局说钱包

落在某某公司的出租车上(index.html),这时你不用亲自去找某某公司的出租车,警察局让出租车自己给你送来,

你只要在警察局等就行。所以地址栏不变,依然为forward.jsp

 

10. 下列哪些操作会使线程释放锁资源?(BC)

A sleep()

 

B wait()

 

C join()

 

D yield()

链接:https://www.nowcoder.com/questionTerminal/3a3f308d61d0453e91ccc23bd6aff468

来源:牛客网

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

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值