Java笔试题整理(五)— 20190325

1.(单选)下面代码等价于

public interface IService {String NAME="default";}

A. public String NAME=“default”;

B. public static String NAME=“default”;

C. public static final String NAME=“default”;

D. private String NAME=“default”;

【知识点】 接口

【分析】 接口中的变量默认是public static final 的,方法默认是public abstract 的

【答案】 C

2.(单选)多个线程可同时操作一个数据,为了保证该数据的准确性,可将操作该数据的部分改为 ()

A. 同步

B. 异步

C. 只读

D. 只写

【知识点】 多线程

【分析】

  1. 并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个 处理机 上运行。其中两种并发关系分别是同步和互斥
  2. 互斥:进程间相互排斥的使用临界资源的现象,就叫互斥。
  3. 同步: 进程之间的关系不是相互排斥临界资源的关系,而是相互依赖的关系。进一步的说明:就是前一个进程的输出作为后一个进程的输入,当第一个进程没有输出时第二个进程必须等待。具有同步关系的一组并发进程相互发送的信息称为消息或事件。
    其中并发又有伪并发和真并发,伪并发是指单核处理器的并发,真并发是指多核处理器的并发。
  4. 并行:在单处理器中多道程序设计系统中,进程被交替执行,表现出一种并发的外部特征;在多处理器系统中,进程不仅可以交替执行,而且可以重叠执行。在多处理器上的程序才可实现并行处理。从而可知,并行是针对多处理器而言的。并行是同时发生的多个并发事件,具有并发的含义,但并发不一定并行,也亦是说并发事件之间不一定要同一时刻发生。
  5. 多线程:多线程是程序设计的逻辑层概念,它是进程中并发运行的一段代码。多线程可以实现线程间的切换执行。
  6. 异步:异步和同步是相对的,同步就是顺序执行,执行完一个再执行下一个,需要等待、协调运行。异步就是彼此独立,在等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作。线程就是实现异步的一个方式。异步是让调用方法的主线程不需要同步等待另一线程的完成,从而可以让主线程干其它的事情。
    异步和多线程并不是一个同等关系,异步是最终目的,多线程只是我们实现异步的一种手段。异步是当一个调用请求发送给被调用者,而调用者不用等待其结果的返回而可以做其它的事情。实现异步可以采用多线程技术或则交给另外的进程来处理。

【答案】 A

3. (读程序)下面程序运行后在屏幕上显示的结果是()

public class test {
    public static void main(String args[]) {
        int x,y;
        x=5>>2;
        y=x>>>2;
        System.out.println(y);
	}
}

【知识点】 位运算

>>表示右移,如果该数为正,则高位补0,若为负数,则高位补1;

>>>表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0。

<< 左移,相当于乘以2的几次方。 >>右移,相当于除以2的几次方。 <<<无符号左移,和<<一样,都是在末尾补0 >>>无符号右移,忽略符号,空位都以0补齐。

【答案】

5 >> 2 -> 5 / 2 2 = 1 5/2^2=1 5/22=1

1>>>2 -> 1 / 2 2 1/2^2 1/22 = 0(空位补0)

4.(读程序)以下java程序运行的结果是()

public class Tester{
    public static void main(String[] args){
       Integer var1=new Integer(1);
       Integer var2=var1;
       doSomething(var2);
       System.out.print(var1.intValue());
       System.out.print(var1==var2);
    }
    public static void doSomething(Integer integer){
        integer=new Integer(2);
    }
}

【知识点】 基本数据类型包装类

【分析】

Java笔试题整理(五)— 20190325_第1张图片

【答案】 1true

5.(单选)下列关于java并发的说法中正确的是:

A. copyonwritearraylist适用于写多读少的并发场景

B. readwritelock适用于读多写少的并发场景

C. concurrenthashmap的写操作不需要加锁,读操作需要加锁

D. 只要在定义int类型的成员变量i的时候加上volatile关键字,那么多线程并发执行i++这样的操作的时候就是线程安全的了

【知识点】 并发

【分析】

CopyOnWriteArrayList适合使用在读操作远远大于写操作的场景里,比如缓存。

ReadWriteLock 当写操作时,其他线程无法读取或写入数据,而当读操作时,其它线程无法写入数据,但却可以读取数据 。适用于 读取远远大于写入的操作。

ConcurrentHashMap是一个线程安全的Hash Table,它的主要功能是提供了一组和HashTable功能相同但是线程安全的方法。ConcurrentHashMap可以做到读取数据不加锁,并且其内部的结构可以让其在进行写操作的时候能够将锁的粒度保持地尽量地小,不用对整个ConcurrentHashMap加锁。

【答案】 B

6.(读程序题)以下程序执行后结果为

public class Test {
    public static void main(String[] args) {   
        Object o = new Object() {  
             public boolean equals(Object obj) {  
                 return true; 
         }
     };   
     System.out.println(o.equals("Fred"));
     }
}

【分析】

重写了Object中的equals方法

【答案】

true

7.(单选题)java 的字符类型采用的是 Unicode 编码方案,每个 Unicode 码占用()个比特位。

A. 8

B. 16

C. 32

D. 64

【分析】 在java中一个unicode占2个字节(byte),一个字节等于8比特位(bit),所以每个Unicode码占用16个比特位。

【答案】 B

8.(多选题)对于构造方法,下列叙述正确的是()

A. 构造方法的优先级一般比代码块低。

B. 构造方法的返回类型只能是void型。

C. 构造方法的主要作用是完成对类的对象的初始化工作。

D. 一般在创建新对象时,系统会自动调用构造方法。

【知识点】 构造方法

【分析】

A:静态成员变量或静态代码块>main方法>非静态成员变量或非静态代码块>构造方法
B:think in java中提到构造器本身并没有任何返回值。
C: 构造方法的主要作用是完成对类的对象的初始化工作。
D: 一般在创建(new)新对象时,系统会自动调用构造方法。

【答案】 ACD

9.(多选题)关于volatile关键字,下列描述不正确的是?

A. 用volatile修饰的变量,每次更新对其他线程都是立即可见的。

B. 对volatile变量的操作是原子性的。

C. 对volatile变量的操作不会造成阻塞。

D. 不依赖其他锁机制,多线程环境下的计数器可用volatile实现。

【知识点】 多线程

【分析】

一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:

1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。

2)禁止进行指令重排序。

volatile只提供了保证访问该变量时,每次都是从内存中读取最新值,并不会使用寄存器缓存该值——每次都会从内存中读取。

而对该变量的修改,volatile并不提供原子性的保证。

由于及时更新,很可能导致另一线程访问最新变量值,无法跳出循环的情况

多线程下计数器必须使用锁保护。

【答案】 BD

10.(读程序题)下列代码执行结果是( )

public class Demo{
 public static void main(String args[]){
   int num = 10;
   System.out.println(test(num));
}
public static int test(int b){
   try
   {
    b += 10;
    return b;
   }
   catch(RuntimeException e)
   {
   }
   catch(Exception e2)
   {
   }
   finally
   {
    b += 10;
    return b;
   }
  }
}

【知识点】 多线程

【分析】

如果finally块中有return语句的话,它将覆盖掉函数中其他return语句。

【答案】 30

11.(单选)结构型模式中最体现扩展性的模式是()

A. 装饰模式

B. 合成模式

C. 桥接模式

D. 适配器

【知识点】 设计模式——结构型模式

结构型模式是描述如何将类对象结合在一起,形成一个更大的结构,结构模式描述两种不同的东西:类与类的实例。故可以分为类结构模式和对象结构模式。

在GoF设计模式中,结构型模式有:

1.适配器模式 Adapter

适配器模式是将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

两个成熟的类需要通信,但是接口不同,由于开闭原则,我们不能去修改这两个类的接口,所以就需要一个适配器来完成衔接过程。

2.桥接模式 Bridge

桥接模式将抽象部分与它的实现部分分离,是它们都可以独立地变化。它很好的支持了开闭原则和组合锯和复用原则。实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这些多角度分离出来让他们独立变化,减少他们之间的耦合。

3.组合模式 Composite

组合模式将对象组合成树形结构以表示部分-整体的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。

4.装饰模式 Decorator

装饰模式动态地给一个对象添加一些额外的职责,就增加功能来说,它比生成子类更灵活。也可以这样说,装饰模式把复杂类中的核心职责和装饰功能区分开了,这样既简化了复杂类,有去除了相关类中重复的装饰逻辑。 装饰模式没有通过继承原有类来扩展功能,但却达到了一样的目的,而且比继承更加灵活,所以可以说装饰模式是继承关系的一种替代方案。

5.外观模式 Facade

外观模式为子系统中的一组接口提供了同意的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

外观模式中,客户对各个具体的子系统是不了解的,所以对这些子系统进行了封装,对外只提供了用户所明白的单一而简单的接口,用户直接使用这个接口就可以完成操作,而不用去理睬具体的过程,而且子系统的变化不会影响到用户,这样就做到了信息隐蔽。

6.享元模式 Flyweight

享元模式为运用共享技术有效的支持大量细粒度的对象。因为它可以通过共享大幅度地减少单个实例的数目,避免了大量非常相似类的开销。.

享元模式是一个类别的多个对象共享这个类别的一个对象,而不是各自再实例化各自的对象。这样就达到了节省内存的目的。

7.代理模式 Proxy

为其他对象提供一种代理,并由代理对象控制对原对象的引用,以间接控制对原对象的访问。

【答案】 A

你可能感兴趣的:(学习笔记)