Skip to content

1、Thread 类中的 yield 方法有什么作用?

使当前线程从执行状态(运行状态)变为可执行态(就绪状态)。

当前线程到了就绪状态,那么接下来哪个线程会从就绪状态变成执行状态呢?可能是当前线程,也可能是其他线程,看系统的分配了。

2、如何在两个线程间共享数据?

在两个线程间共享变量即可实现共享。

一般来说,共享变量要求变量本身是线程安全的,然后在线程内使用的时候,如果有对共享变量的复合操作,那么也得保证复合操作的线程安全性。

3、在一个静态方法内调用一个非静态成员为什么是非法的?

由于静态方法可以不通过对象进行调用,因此在静态方法里,不能调用其他非静态变量,也不可以访问非静态变量成员。

4、设计模式分类

1、 创建型模式,共五种:工厂方法模式、抽象工厂模式单例模式、建造者模式、原型模式。

2、 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

3、 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

5、为什么wait和notify方法要在同步块中调用?

Java API强制要求这样做,如果你不这么做,你的代码会抛出IllegalMonitorStateException异常。还有一个原因是为了避免wait和notify之间产生竞态条件。

6、接口与抽象类有什么区别?

1、 抽象类有构造方法,接口没有构造方法

2、 抽象类只能单继承,接口可以多继承

3、 抽象类可以有普通方法,接口中的所有方法都是抽象方法

4、 接口的属性都是public static final修饰的,而抽象的不是

7、我能在不进行强制转换的情况下将一个 double 值赋值给 long 类型的变量吗?

不行,你不能在没有强制类型转换的前提下将一个 double 值赋值给 long 类型的变量,因为 double 类型的范围比 long 类型更广,所以必须要进行强制转换。

8、说出几条 Java 中方法重载的最佳实践?

下面有几条可以遵循的方法重载的最佳实践来避免造成自动装箱的混乱。

a)不要重载这样的方法:一个方法接收 int 参数,而另个方法接收 Integer 参数。

b)不要重载参数数量一致,而只是参数顺序不同的方法。

c)如果重载的方法参数个数多于 5 个,采用可变参数。

9、垃圾收集算法

GC最基础的算法有三种:标记 -清除算法、复制算法、标记-压缩算法,我们常用的垃圾回收器一般都采用分代收集算法。

标记 -清除算法

“标记-清除”(Mark-Sweep)算法,如它的名字一样,算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。

复制算法

“复制”(Copying)的收集算法,它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。

标记-压缩算法

标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存

分代收集算法

“分代收集”(Generational Collection)算法,把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法

10、Java 程序是怎样运行的?

首先通过 Javac 编译器将 .java 转为 JVM 可加载的 .class 字节码文件。

Javac 是由 Java 编写的程序,编译过程可以分为:① 词法解析,通过空格分割出单词、操作符、控制符等信息,形成 token 信息流,传递给语法解析器。② 语法解析,把 token 信息流按照 Java 语法规则组装成语法树。③ 语义分析,检查关键字使用是否合理、类型是否匹配、作用域是否正确等。④ 字节码生成,将前面各个步骤的信息转换为字节码。

字节码必须通过类加载过程加载到 JVM 后才可以执行,执行有三种模式,解释执行、JIT 编译执行、JIT 编译与解释器混合执行(主流 JVM 默认执行的方式)。混合模式的优势在于解释器在启动时先解释执行,省去编译时间。

之后通过即时编译器 JIT 把字节码文件编译成本地机器码。

Java 程序最初都是通过解释器进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁,就会认定其为"热点代码",热点代码的检测主要有基于采样和基于计数器两种方式,为了提高热点代码的执行效率,虚拟机会把它们编译成本地机器码,尽可能对代码优化,在运行时完成这个任务的后端编译器被称为即时编译器。

还可以通过静态的提前编译器 AOT 直接把程序编译成与目标机器指令集相关的二进制代码。

11、Java 中,Comparator 与 Comparable 有什么不同?

12、四种构建线程池的区别及特点?

13、synchronized的作用?

14、什么情况发生栈溢出?

15、对象的相等与指向他们的引用相等,两者有什么不同?

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

17、在做文件上传的时候,form表单的enctype的指是什么?

18、死锁的原因

19、SynchronizedMap和ConcurrentHashMap有什么区别?

20、你做过 JVM 调优,说说如何查看 JVM 参数默认值?

21、你是如何调用 wait()方法的?使用 if 块还是循环?为什么?

22、什么是重写?什么是重载?

23、Java 中 WeakReference 与 SoftReference 的区别?

24、String str=”aa”,String s=”bb”,String aa=aa+s;一种创建了几个对象?

25、如何设置请求的编码以及响应内容的类型?

26、JVM怎么判断一个对象是不是要回收?

27、有哪些 GC 算法?

28、Serial 与 Parallel GC之间的不同之处?

29、ArrayList和Vector有什么不同之处?

30、如何在 Windows 和 Linux 上查找哪个线程cpu利用率最高?

31、在Java中,如何跳出当前的多重嵌套循环?

32、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?

33、集合和数组的区别

34、线程池的执行原理?

35、你知道有哪些开源框架?

36、如何确保线程安全?

37、个线程和 2 个线程的同步代码,哪个更容易写?

38、说说自己是怎么使用 synchronized 关键字,在项目中用到了吗

39、接口是否可继承(extends)接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concrete class)?

40、ArrayList 与 LinkedList 的不区别?

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