您的位置:首页 > 职场人生

面试题(JAVA)(一)

2017-04-05 18:02 162 查看
一、单项选择题

1.以下程序运⾏的结果为(A)

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.runmain
B.mainrun
C.main
D.run
E.不能确定




2.Java中⽤正则表达式截取字符串中第⼀个出现的英⽂左括号之前的字符串。⽐如:北京市(海淀区)(朝阳区)(⻄城区),截取结果为:北京市。正则表达式为(B)

A.".*?(?=\\()"
B.".*?(?=\()"
C.".*(?=\\()"
D.".*(?=\()"




3.以下JAVA程序的输出是什么(B)

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.结果不确定

解释:
run()方法中是线程代码,但是该线程对象并没有启动线程(thread.start()),所以这里的run()方法只是一个普通的方法,顺序执行。如果加入了t.start()方法,那么多线程就会启动,输出的结果将不确定。




4.下⾯哪段程序能够正确的实现了GBK编码字节流到UTF-8编码字节流的转换:(C)

A.byte[]src,dst;
B.dst=String.fromBytes(src,"GBK").getBytes("UTF-8")
C.dst=newString(src,"GBK").getBytes("UTF-8")dst=newString("GBK",src).getBytes()
D.dst=String.encode(String.decode(src,"GBK")),"UTF-8")
解释:
先解码,然后再编码!
思路是先解码还原,然后再编码没错。但是String根本就没有,fromBytes、encode这两个静态方法。


5.下面代码假定str0,…,str4后序代码都是只读引⽤。

Java7中,以上述代码为基础,在发⽣过⼀次FullGC后,上述代码在Heap空间(不包括PermGen)保留的字符数为(C)

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;

A.5
B.10
C.15
D.20

解析:
垃圾回收主要针对的是堆区的回收,因为栈区的内存是随着线程而释放的。

堆区分为三个区:年轻代(Young Generation)、年老代(Old Generation)、永久代(Permanent Generation,也就是方法区)。

年轻代:对象被创建时(new)的对象通常被放在Young(除了一些占据内存比较大的对象),经过一定的Minor GC(针对年轻代的内存回收)还活着的对象会被移动到年老代(一些具体的移动细节省略)。

年老代:就是上述年轻代移动过来的和一些比较大的对象。Minor GC(FullGC)是针对年老代的回收。

永久代:存储的是final常量,static变量,常量池。
str3,str4都是直接new的对象,而substring的源代码其实也是new一个string对象返回。

经过fullgc之后,年老区的内存回收,则年轻区的占了15个,不算PermGen。


6.对于JVM内存配置参数:-Xmx10240m-Xms10240m-Xmn5120m-XXSurvivorRatio=3,其最⼩内存值和Survivor区总⼤⼩分别是(D)

A.5120m,1024m
B.5120m,2048m
C.10240m,1024m
D.10240m,2048m
解释:
-Xms10240m 初始堆大小即最小内存值

-Xmx10240m:代表最大堆
-Xms10240m:代表最小堆
-Xmn5120m:代表新生代
-XXSurvivorRatio=3:代表Eden:Survivor= 3

根据Generation-Collection算法(目前大部分JVM采用的算法),一般根据对象的生存周期将堆内存分为若干不同的区域,一般情况将新生代分为Eden,两块Survivor;计算Survivor大小, Eden:Survivor =3,总大小为5120,3x+x+x=5120  x=1024

新生代大部分要回收,采用Copying算法,快!
老年代大部分不需要回收,采用Mark-Compact算法


7.如下代码,执⾏test()函数后,屏幕打印结果为(B)

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+""); //128 溢出 -128
add(b);
System.out.print(b+""); //127
}
public static void main(String arg[]){
Test2 k = new Test2();
k.test();
}
}
A.127127
B.-128127
C.129128
D.以上都不对

知识点:
byte是八位,最高位为符号位,数据范围为-128~127,当127++是数值溢出,变为-128,在Java中使用补码表示负数,补码就是将正数的所有二进制取反,最后加1


8.下列关于Java并发的说法中正确的是(B)

A.CopyOnWriteArrayList适⽤于写多读少的并发场景

B.ReadWriteLock适⽤于读多写少的并发场景

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

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

解释:

A:CopyOnWrite适用于读多写少的并发场景。

B:正确

C:ConcurrentHashMap,读操作不需要加锁,写操作需要加锁 >D:对于volatile修饰的变量,jvm虚拟机只是保证从主内存加载到线程工作内存的值是最新的

二、多选题

9.实现或继承了collection接⼝的是(B、C、E)

A.Map
B.List
C.vector
D.Iterator
E.Set


10.以下哪些类是线程安全的(A、D、E)

A.Vector
B.HashMap
C.ArrayList
D.StringBuffer
E.Properties

解释:
Properties是HashTable的子类,不过Properties添加了两个方法,load()和store()可以直接导入或者将映射写入文件。另外Properties是<String,String>的映射。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  面试题 java