Skip to content

1、如何写一段简单的死锁代码?

这个笔试的话频率也挺高(遇见笔试的公司要三思啊),所以这里直接给出一个答案(有很多版本的)。

public class DeadLockDemo {
    public static void main(String[] args) {
        Object object1 = new Object();
        Object object2 = new Object();
        Thread t1 = new Thread(() -> {
            synchronized (object1) {
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (object2) {
                }
            }
        }, "deadlock-demo-1");

        t1.start();
        Thread t2 = new Thread(() -> {
            synchronized (object2) {
                synchronized (object1) {
                }
            }
        }, "deadlock-demo-2");
        t2.start();
    }
}

2、栈帧都有哪些数据?

JVM的运行是基于栈的,和C语言的栈类似,它的大多数数据都是在堆里面的,只有少部分运行时的数据存在于栈上。

在JVM中,每个线程栈里面的元素,就叫栈帧

栈帧包含:局部变量表、操作数栈、动态连接、返回地址等。

3、float f=3.4;是否正确?

答:不正确。3.4是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换float f =(float)3.4; 或者写成float f =3.4F;。

4、形参与实参

形参:全称为“形式参数”,是在定义方法名和方法体的时候使用的参数,用于接收调用该方法时传入的实际值;实参:全称为“实际参数”,是在调用方法时传递给该方法的实际值。

5、BIO、NIO、AIO 有什么区别?

BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。

NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。

AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。

6、什么是自旋

很多synchronized里面的代码只是一些很简单的代码,执行时间非常快,此时等待的线程都加锁可能是一种不太值得的操作,因为线程阻塞涉及到用户态和内核态切换的问题。既然synchronized里面的代码执行得非常快,不妨让等待锁的线程不要被阻塞,而是在synchronized的边界做忙循环,这就是自旋。如果做了多次忙循环发现还没有获得锁,再阻塞,这样可能是一种更好的策略。

7、我们可以在 hashcode() 中使用随机数字吗?

答案

http://javarevisited.blogspot.sg/2011/10/override-hashcode-in-java-example.html

不行,因为对象的 hashcode 值必须是相同的。参见答案获取更多关于 Java 中重写 hashCode() 方法的知识。

8、你所知道网络协议有那些?

1、 HTTP:超文本传输协议

2、 FTP:文件传输协议

3、 SMPT:简单邮件协议

4、 TELNET:远程终端协议

5、 POP3:邮件读取协议

9、构造器Constructor是否可被override

在讲继承的时候我们就知道父类的私有属性和构造方法并不能被继承,所以Constructor也就不能被override,但是可以overload,所以你可以看到一个类中有多个构造函数的情况。

10、什么是双亲委派机制?

双亲委派机制的意思是除了顶层的启动类加载器以外,其余的类加载器,在加载之前,都会委派给它的父加载器进行加载。这样一层层向上传递,直到祖先们都无法胜任,它才会真正的加载。

11、JDBC中如何进行事务处理?

12、程序的结构有那些?

13、怎么打出线程栈信息?

14、抽象类(abstract class)和接口(interface)有什么异同?

15、怎么打破双亲委派模型?

16、你知道哪些垃圾收集器?

17、什么是多线程中的上下文切换?

18、sleep() 和 wait() 有什么区别?

19、构造方法能不能重载?能不能重写?

20、什么是游标?

21、在异常捕捉时,如果发生异常,那么try.catch.finally块外的return语句会执行吗?

22、CAS 的会产生什么问题?

23、List,Set,Map三者的区别?

24、什么是面向对象?

25、在没有使用临时变量的情况如何交换两个整数变量的值?

26、JVM 数据运行区,哪些会造成 OOM 的情况?

27、描述一下JVM加载class文件的原理机制?

28、什么是线程池? 为什么要使用它?

29、什么情况下会违反迪米特法则?为什么会有这个问题?

30、Java中的包装类都是那些?

31、String 类的常用方法都有那些?

32、String s = new String(“xyz”);创建了几个字符串对象?

33、CopyOnWriteArrayList 的缺点?

34、什么是线程池?有哪几种创建方式?

35、什么是观察者模式

36、使用JDBC操作数据库时,如何提升读取数据的性能?如何提升更新数据的性能?

37、Java 中会存在内存泄漏?简述一下

38、什么是多线程中的上下文切换?

39、谈谈永久代

40、HashMap 与 HashTable 有什么区别?

用心去做高质量的内容网站,欢迎 star ⭐ 让更多人发现