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则会执行完毕,导致结果不可预测。