搜狐 2021 JAVA工程师面试题

小编:管理员 1122阅读 2021.09.27

第1题:

一、单选题

1、以下程序运行的结果为()

public class Example extends Thread{

     @Override

     public void run(){

        try{

             Thread.sleep(1000);

             }catch (InterruptedException e){

             e.printStackTrace();

             }

             System.out.print("run");

     }

     public static void main(String[] args){

             Example example=new Example();

             example.run();

             System.out.print("main");

     }

}

            

A、run main

B、main run

C、main

D、run

E、不能确定



1、A

这个类虽然继承了Thread类,但是并没有真正创建一个线程。

创建一个线程需要覆盖Thread类的run方法,然后调用Thread类的start()方法启动

这里直接调用run()方法并没有创建线程,跟普通方法调用一样,是顺序执行的



第2题:

 2、Java中用正则表达式截取字符串中第一个出现的英文左括号之前的字符串。比如:北京市(海淀区)(朝阳区)( 西城区),截取结果为:北京市。正则表达式为()      

A、*.*?(?=\\()*

B、*.*?(?=\()*

C、*.*(?=\\()*

D、*.*(?=\()*



 2、A

        String str = "北京市(海淀区)(朝阳区)(西城区)";

 

        String patStr = ".*?(?=\\()";

         

        Pattern pattern = Pattern.compile(patStr);

         

        Matcher matcher = pattern.matcher(str);

         

        if(matcher.find())

        {

            System.out.println(matcher.group(0));

        }

        else

        {

            System.out.println(matcher.group(0));

        }



第3题:

 3、下列关于Java并发的说法中正确的是()  

A、CopyOnWriteArrayList适用于写多读少的并发场景

B、ReadWriteLock适用于读多写少的并发场景

C、ConcurrentHashMap的写操作不需要加锁,读操作需要加锁

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



 3、B

A,CopyOnWriteArrayList适用于写少读多的并发场景

B,ReadWriteLock即为读写锁,他要求写与写之间互斥,读与写之间互斥,

   读与读之间可以并发执行。在读多写少的情况下可以提高效率

C,ConcurrentHashMap是同步的HashMap,读写都加锁

D,volatile只保证多线程操作的可见性,不保证原子性



第4题:

 4、以下JAVA程序的输出是什么()

public class HelloSogou{

     public static synchronized void main(String[] a){

         Thread t=new Thread(){

             public void run(){Sogou();}

     };

     t.run();

     System.out.print("Hello");

     }

     static synchronized void Sogou(){

     System.out.print("Sogou");

    }

}       

A、HelloSogou

B、SogouHello

C、Hello

D、结果不确定



 4、B

这里调用 t.run();

并没有启动一个新的线程,启动一个新线程要用t.start();

所以执行顺序是先执行run(),再执行 System.out.print("HELLO");



第5题:

 5、下面哪段程序能够正确的实现了GBK编码字节流到UTF-8编码字节流的转换:

byte[] src,dst;

A、dst=String.fromBytes(src,"GBK").getBytes("UTF-8")

B、dst=new String(src,"GBK").getBytes("UTF-8")

C、dst=new String("GBK",src).getBytes()

D、dst=String.encode(String.decode(src,"GBK")),"UTF-8" )



 5、B

操作步骤就是先解码再编码

用new String(src,"GBK")解码得到字符串

用getBytes("UTF-8")得到UTF8编码字节数组



第6题:

 6、如下代码,执行test()函数后,屏幕打印结果为()

public class Test2

{

    public void add(Byte b)

    {

        b = b++;

    }

    public void test()

    {

        Byte a = 127;

        Byte b = 127;

        add(++a);

        System.out.print(a + " ");

        add(b);

        System.out.print(b + "");

    }

}     

A、127 127

B、128 127

C、129 128

D、以上都不对



  6、D
public void add(Byte b){ b=b++; } 这里涉及java的自动装包/自动拆包(AutoBoxing/UnBoxing) Byte的首字母为大写,是类,看似是引用传递,但是在add函数内实现++操作,会自动拆包成byte值传递类型,所以add函数还是不能实现自增功能。也就是说add函数只是个摆设,没有任何作用。 Byte类型值大小为-128~127之间。  add(++a);这里++a会越界,a的值变为-128 add(b); 前面说了,add不起任何作用,b还是127



第7题:

 7、

static String str0="0123456789";

static String str1="0123456789";

String str2=str1.substring(5);

String str3=new String(str2);

String str4=new String(str3.toCharArray());

str0=null;

假定str0,...,str4后序代码都是只读引用。
Java 7中,以上述代码为基础,在发生过一次FullGC后,上述代码在Heap空间(不包括PermGen)保留的字符数为()         

A、5

B、10

C、15

D、20



 7、C

substring实际是new,5字符

str3和4也都是new,每个5字符

分别都会创建新的对象

常量池是PermGen的

因此应该是一共15字符



第8题:

 8、对于JVM内存配置参数:

-Xmx1024m -Xms10240m -Xmn5120m -XXSurvivorRatio=3

,其最小内存值和Survivor区总大小分别是()            

A、5120m,1024m

B、5120m,2048m

C、10240m,1024m

D、10240m,2048m



 8、D

-Xmx:最大堆大小

-Xms:初始堆大小

-Xmn:年轻代大小

-XXSurvivorRatio:年轻代中Eden区与Survivor区的大小比值

年轻代5120m, Eden:Survivor=3,Survivor区大小=1024m(Survivor区有两个,即将年轻代分为5份,每个Survivor区占一份),总大小为2048m。

-Xms初始堆大小即最小内存值为10240m



第9题:

二、多选题

 9、以下哪些类是线程安全的()       

A、Vector

B、HashMap

C、ArrayList

D、StringBuffer

E、Properties



 9、ADE

A,Vector相当于一个线程安全的List

B,HashMap是非线程安全的,其对应的线程安全类是HashTable

C,Arraylist是非线程安全的,其对应的线程安全类是Vector

D,StringBuffer是线程安全的,相当于一个线程安全的StringBuilder

E,Properties实现了Map接口,是线程安全的



第10题:

 10、实现或继承了collection接口的是()     

A、map

B、List

C、vector

D、Iterator

E、Set



 10、BCE

在java.util包中提供了一些集合类,常用的有List、Set和Map类,其中List类和Set类继承了Collection接口。这些集合类又称为容器,长度是可变的,数组用来存放基本数据类型的数据,集合用来存放类对象的引用。 

List接口、Set接口、Map接口以及Collection接口的主要特征如下: 

Collection接口是List接口和Set接口的父接口,通常情况下不被直接使用。

List接口继承了Collection接口,List接口允许存放重复的对象,排序方式为按照对象的插入顺序。 

Set接口继承了Collection接口,Set接口不允许存放重复的对象,排序方式为按照自身内部的排序规则。 

Map接口以键值对(key—value)的形式存放对象,其中键(key)对象不可以重复,值(value)对象可以重复,排序方式为按照自身内部的规则。

C:Vector实现了List接口,即间接实现Collection接口
D:Iterator是Java迭代器最简单的实现,没有实现Collection接口


关联标签: