190715 — 反射、单例模式特点、ThreadLocal、类之间常见关系、异常关系

1. Java vs JavaScript

1.1 题目

Web客户端的编程语言JavaScript源自Java,其功能是Java SE的子集。

1.2 答案

错误。

雷锋(java)和雷锋塔(javascript)。雷锋塔(javascript)不是雷锋(java)的。

2. sleep() vs wait()

2.1 题目

关于sleepwait,以下描述错误的是

sleep是线程类的方法,waitobject的方法
sleep不释放对象锁,wait放弃对象锁
sleep暂停线程,但监控状态依然保持,结束后会自动恢复
wait进入等待锁定池,只有针对此对象发出notify方法获得对象锁进入运行状态

2.2 答案

D。

  1. sleep()Thread类中的方法,而wait()则是Object类中的方法。
  2. 在调用sleep()方法的过程中,线程不会释放对象锁。
  3. sleep()方法导致了程序暂停,但是他的监控状态依然保持着,当指定的时间到了又会自动恢复运行状态。
  4. 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.检查异常(编译器要求必须处置的异常) : 除了ErrorRuntimeException及其子类以外,其他的Exception类及其子类都属于可查异常。这种异常的特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。

4.非检查异常(编译器不要求处置的异常): 包括运行时异常(RuntimeException与其子类)和错误(Error)。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值