文章目录
1. Java vs JavaScript
1.1 题目
Web客户端的编程语言JavaScript源自Java,其功能是Java SE的子集。
1.2 答案
错误。
雷锋(java
)和雷锋塔(javascript
)。雷锋塔(javascript
)不是雷锋(java
)的。
2. sleep() vs wait()
2.1 题目
关于sleep
和wait
,以下描述错误的是
sleep
是线程类的方法,wait
是object
的方法
sleep
不释放对象锁,wait
放弃对象锁
sleep
暂停线程,但监控状态依然保持,结束后会自动恢复
wait
进入等待锁定池,只有针对此对象发出notify
方法获得对象锁进入运行状态
2.2 答案
D。
sleep()
是Thread
类中的方法,而wait()
则是Object
类中的方法。- 在调用
sleep()
方法的过程中,线程不会释放对象锁。 sleep()
方法导致了程序暂停,但是他的监控状态依然保持着,当指定的时间到了又会自动恢复运行状态。wait()
方法会导致线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()
方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。准备获取非立即获取,是进入就绪状态。
3. 内存泄露
3.1 题目
java程序内存泄露的最直接表现是( )
频繁FullGc
jvm崩溃
程序抛内存控制的Exception
java进程异常消失
3.2 答案
C. 程序抛内存控制的Exception
java是自动管理内存的,通常情况下程序运行到稳定状态,内存大小也达到一个 基本稳定的值
但是内存泄露导致GC
不能回收泄露的垃圾,内存不断变大.
最终超出内存界限,抛出OutOfMemoryExpection
首先理解一下内存泄漏的概念,内存泄漏就是对象引用消失了,对象内存却没有被回收。
A答案:FullGC
是老年代内存空间不足的时候,才会触发的,老年代一般是生命周期较长的对象或者大对象,频繁的 FullGC 不会可能会影响程序性能(因为内存回收需要消耗CPU等资源),但是并不会直接导致内存泄漏。
B 答案:JVM
奔溃的可能是内存溢出引起的,也可能是其他导致 JVM
崩溃的操作,例如设置了错误的JVM
参数等。
C 答案:内存异常,最常见的 就是 StackOverFlow
了把,内存溢出,其实内存泄漏的最终结果就是内存溢出。所以,基本上C是对的答案。
D 答案:Java 进程异常消失,这个明显不对的。
4. volatile
4.1 题目
volatile关键字的说法错误的是
能保证线程安全
volatile关键字用在多线程同步中,可保证读取的可见性
JVM保证从主内存加载到线程工作内存的值是最新的
volatile能禁止进行指令重排序
4.2 答案
A
出于运行速率的考虑,java编译器会把经常经常访问的变量放到缓存(严格讲应该是工作内存)中,读取变量则从缓存中读。但是在多线程编程中,内存中的值和缓存中的值可能会出现不一致。volatile
用于限定变量只能从内存中读取,保证对所有线程而言,值都是一致的。但是volatile
不能保证原子性,也就不能保证线程安全。
5. int vs Integer
5.1 题目
在jdk1.5之后,下列 java 程序输出结果为______。
int i=0;
Integer j = new Integer(0);
System.out.println(i==j);
System.out.println(j.equals(i));
true,false
true,true
false,true
false,false
对于不同的环境结果不同
程序无法执行
5.2 答案
B
i==j
,这个是基本类型与 Integer
的比较, j 会自动拆箱成 int
类型,然后比较的是值。因此返回真。
j.equals(i)
,调用 equals
方法后,这个 i 会自动装箱成 Integer
类型,然后再比较值,所以也返回真。
6. 反射获得类中方法
6.1 题目
考虑下面这个简单的例子,让我们看看reflection是如何工作的。
import java.lang.reflect.*;
public class DumpMethods{
public static void main(String[] args) {
try {
Class c=Class.forName(args[0]);
Method m[]=c.getDeclaredMethods();
for (int i = 0; i < m.length; i++) {
System.out.println(m[i].toString());
}
} catch (Throwable e) {
System.err.println(e);
}
}
}
其中"c.getDeclaredMethods"的作用是:
取得类的公有方法对象
取得类的所有公有方法名称
取得类的所有方法对象
以上选项都不正确
6.2 答案
C少了一句除了继承的方法。
当一个类或接口被加载到JVM
的时候便会产生一个与之关联的一个Java.lang.Class
对象,我们可以通过此Class
对象来得到被装入的类的详细信息。
其中:
Method[] getDeclaredMethods()
返回 Class
对象表示的类或接口的所有已声明的方法数组,但是不包括从父类继承和接口实现的方法。
Method[] getMethods()
返回当前 Class
对象表示的类或接口的所有公有成员方法对象数组,包括已声明的和从父类继承或实现接口的方法。
7. 开放定址法
7.1 题目
java8中,下面哪个类用到了解决哈希冲突的开放定址法
LinkedHashSet
HashMap
ThreadLocal
TreeMap
7.2 答案
C
ThreadLocalMap
中使用开放地址法来处理散列冲突,而HashMap
中使用的是分离链表法。之所以采用不同的方式主要是因为:在ThreadLocalMap
中的散列值分散得十分均匀,很少会出现冲突。并且ThreadLocalMap
经常需要清除无用的对象,使用纯数组更加方便。
8. 单例模式(还是不太懂)
8.1 题目
单例模式中,两个基本要点是
构造函数私有
静态工厂方法
以上都不对
唯一实例
8.2 答案
AD
单例模式 ===>懒汉模式和饿汉模式
懒汉模式在调用方法时创建对象,饿汉模式在类初始化时创建对象
特点:构造方法私有 单一实例
9. ThreadLocal
9.1 题目
关于ThreadLocal类 以下说法正确的是
ThreadLocal继承自Thread
ThreadLocal实现了Runnable接口
ThreadLocal重要作用在于多线程间的数据共享
ThreadLocal是采用哈希表的方式来为每个线程都提供一个变量的副本
ThreadLocal保证各个线程间数据安全,每个线程的数据不会被另外线程访问和破坏
9.2 答案
DE
1、ThreadLocal
的类声明:
public class ThreadLocal<T>
可以看出ThreadLocal
并没有继承自Thread
,也没有实现Runnable
接口。所以AB都不对。
2、ThreadLocal
类为每一个线程都维护了自己独有的变量拷贝。每个线程都拥有了自己独立的一个变量。
所以ThreadLocal
重要作用并不在于多线程间的数据共享,而是数据的独立,C选项错。
由于每个线程在访问该变量时,读取和修改的,都是自己独有的那一份变量拷贝,不会被其他线程访问,
变量被彻底封闭在每个访问的线程中。所以E对。
3、ThreadLocal
中定义了一个哈希表用于为每个线程都提供一个变量的副本:
static class ThreadLocalMap {
static class Entry extends WeakReference<ThreadLocal> {
/** The value associated with this ThreadLocal. */
Object value;
Entry(ThreadLocal k, Object v) {
super(k);
value = v;
}
}
/**
\* The table, resized as necessary.
\* table.length MUST always be a power of two.
*/
private Entry[] table;
}
所以D对。
10. 类之间常见的关系
10.1 题目
类之间存在以下几种常见的关系:
“USES-A”关系
“HAS-A”关系
“IS-A”关系
“INHERIT-A”关系
10.2 答案
ABC
use-a 是依赖关系
has-a 一般是组合关系
is-a 一般是继承关系
USES-A: 依赖关系,A类会用到B类,这种关系具有偶然性,临时性。但B类的变化会影响A类。这种在代码中的体现为:A类方法中的参数包含了B类。
**关联关系:**A类会用到B类,这是一种强依赖关系,是长期的并非偶然。在代码中的表现为:A类的成员变量中含有B类。
HAS-A: 聚合关系,拥有关系,是关联关系的一种特例,是整体和部分的关系。比如鸟群和鸟的关系是聚合关系,鸟群中每个部分都是鸟。
IS-A:表示继承。父类与子类,这个就不解释了。
要注意:还有一种关系:组合关系也是关联关系的一种特例,它体现一种contains-a的关系,这种关系比聚合更强,也称为强聚合。它同样体现整体与部分的关系,但这种整体和部分是不可分割的。
11. 异常
11.1 题目
下面有关 JAVA 异常类的描述,说法正确的有()
异常的继承结构:基类为 Throwable,Error 和 Exception 实现 Throwable,RuntimeException 和 IOException 等继承 Exception
非 RuntimeException 一般是外部错误(不考虑Error的情况下),其必须在当前类被 try{}catch 语句块所捕获
Error 类体系描述了 Java 运行系统中的内部错误以及资源耗尽的情形,Error 不需要捕捉
RuntimeException 体系包括错误的类型转换、数组越界访问和试图访问空指针等等,必须 被 try{}catch 语句块所捕获
11.2 答案
[外链图片转存失败(img-lYw0fzor-1563159700618)(E:\【Java】\Java1811业余班\Typora笔记_牛客错题\图片\190715_异常关系)]
都是Throwable
的子类:
1.Exception(异常)
2.Error(错误): 是程序无法处理的错误。这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,一般不需要程序处理。
3.检查异常(编译器要求必须处置的异常) : 除了Error
,RuntimeException
及其子类以外,其他的Exception
类及其子类都属于可查异常。这种异常的特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么用try-catch
语句捕获它,要么用throws
子句声明抛出它,否则编译不会通过。
4.非检查异常(编译器不要求处置的异常): 包括运行时异常(RuntimeException
与其子类)和错误(Error
)。