Java高频面试题(二)

1. HashMap的数据结构是怎样的?

A.数组
B.链表
C.数组+链表
D.二叉树

答案:
C

解析:

JDK8以后,HashMap的数据结构是数组+链表+红黑树

2. 在 JAVA 编程中,Java 编译器会将 Java 程序转换为( )?

A.字节码
B.可执行代码
C.机器代码
D.以上都不对

答案:  
A

解析:

  • 编译器将Java源代码编译成字节码class文件

  • 类加载到JVM里面后,执行引擎把字节码转为可执行代码

  • 执行的过程,再把可执行代码转为机器码,由底层的操作系统完成执行。

3.下面有关JVM内存,说法错误的是?

A.程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,是线程隔离的
B.Java方法执行内存模型,用于存储局部变量,操作数栈,动态链接,方法出口等信息,是线程隔离的
C.方法区用于存储JVM加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,是线程隔离的
D.原则上讲,所有的对象都在堆区上分配内存,是线程之间共享的

答案:
C

解析:
运行时数据区包括:虚拟机栈区,堆区,方法区,本地方法栈,程序计数器

  • 虚拟机栈区:也就是我们常说的栈区,线程私有,存放基本类型,对象的引用和 returnAddress ,在编译期间完成分配。

  • 堆区:JAVA 堆,也称 GC 堆,所有线程共享,存放对象的实例和数组, JAVA 堆是垃圾收集器管理的主要区域。
    -方法区:所有线程共享,存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。这个区域的内存回收目标主要是针对常量池的对象的回收和对类型的卸载。

  • 程序计数器:线程私有,每个线程都有自己独立的程序计数器,用来指示下一条指令的地址。

  1. JAVA中,下列语句哪一个正确()

A.class中的constructor不可省略
B.constructor必须与class同名,但方法不能与class同名
C.constructor在一个对象被new时执行
D.一个class只能定义一个constructor

答案:
C

解析:
A 省略构造函数,编译器会自动生成。
D 构造函数可以重载
B 方法是可以和类名同名的,和构造方法唯一的区别就是,构造方法没有返回值。

5.在JAVA中,假设A有构造方法A(int a),则在类A的其他构造方法中调用该构造方法和语句格式应该为()

A.this.A(x)
B.this(x)
C.super(x)
D.A(x)

答案:
B

解析:
this的作用其中一个就是在一个构造方法中调用另一个构造方法,格式为this(参数);
super是调用父类的方法;
A(a)这种形式是在new一个类时使用。

6.下列选项中属于面向对象程序设计语言特征的是()

A.继承性
B.多态性
C.相似性
D.封装性

答案:
A B D

解析:
面对对象三大特征:封装,继承,多态

7.以下哪个正确?

A.abstract类只能用来派生子类,不能用来创建abstract类的对象。
B.final类不但可以用来派生子类,也可以用来创建final类的对象。
C.abstract不能与final同时修饰一个类。
D.abstract类定义中可以没有abstract方法。

答案:
A C D

解析:
1、abstract类不能用来创建abstract类的对象;
2、final类不能用来派生子类,因为用final修饰的类不能被继承;
3、如2所述,final不能与abstract同时修饰一个类,abstract类就是被用来继承的;
4、类中有abstract方法必须用abstract修饰,但abstract类中可以没有抽象方法,接口中也可以有abstract方法。

8. JAVA反射机制主要提供了以下哪些功能?

A.在运行时判断一个对象所属的类
B.在运行时构造一个类的对象
C.在运行时判断一个类所具有的成员变量和方法
D.在运行时调用一个对象的方法

答案:
A B C D

解析:
Java反射机制主要提供了以下功能:在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
因此,答案为:ABCD

9.以下关于Histroy对象的属性或方法描述正确的是()

A.bcak回到浏览器载入历史URL地址列表的当前URL的前一个URL
B.go表示刷新当前页面
C.length保存历史URL地址列表的长度信息
D.forward转到浏览器载入历史URL地址列表的当前URL的下一个URL。

答案:
A D

解析:

选A、D。考察的是浏览器的内置对象管理模型,简称BOM(Browser Object Model)中的Histroy属性和方法。

  • length 返回浏览器历史列表中的URL数量。所以C中表述的长度信息是错误的。

  • back() 加载 history列表中的前一个URL。

  • forward() 加载  history  列表中的下一个URL。

  • go()  加载history列表中的某个具体页面。所以B的表述刷新当前页面是错误的。

10.

public class NameList
{
    private List names = new ArrayList();
    public synchronized void add(String name)
    {
        names.add(name);
    }
    public synchronized void printAll()     {
        for (int i = 0; i < names.size(); i++)
        {
            System.out.print(names.get(i) + ””);
        }
    }

    public static void main(String[]args)
    {
        final NameList sl = new NameList();
        for (int i = 0; i < 2; i++)
        {
            new Thread()
            {
                public void run()
                {
                    sl.add(“A”);
                    sl.add(“B”);
                    sl.add(“C”);
                    sl.printAll();
                }
            } .start();
        }
    }
}

Which two statements are true if this class is compiled and run?

A.An exception may be thrown at runtime.
B.The code may run with no output, without exiting.
C.The code may run with no output, exiting normally(正常地).
D.The code may rum with output “A B A B C C “, then exit.
E.The code may rum with output “A B C A B C A B C “, then exit.
F.The code may ruin with output “A A A B C A B C C “, then exit.
G.The code may ruin with output “A B C A A B C A B C “, then exit.

答案:
E G

解析:

在每个线程中都是顺序执行的,所以sl.printAll();必须在前三句执行之后执行,也就是输出的内容必有(连续或非连续的)ABC。而线程之间是穿插执行的,所以一个线程执行 sl.printAll();之前可能有另一个线程执行了前三句的前几句。
E答案相当于线程1顺序执行完然后线程2顺序执行完。
G答案则是线程1执行完前三句add之后线程2插一脚执行了一句add然后线程1再执行 sl.printAll();输出ABCA。接着线程2顺序执行完输出ABCABC
输出加起来即为ABCAABCABC。

11. 关于容器下面说法正确的是?( )

A.列表(List)和集合(Set)存放的元素都是可重复的。
B.列表(List)和集合(Set)存放的元素都是不可重复的。
C.映射(Map)中key是可以重复的。
D.映射(Map)中value是可以重复的。

答案:
D

解析:
列表(List)的元素是有序、可重复的;
集合(Set)的元素是无序、不可重复的。

12.以下说法错误的是?()

A.数组是一个对象
B.数组不是一种原生类
C.数组的大小可以任意改变
D.在Java中,数组存储在堆中连续内存空间里

答案:
C

解析:
在java中,数组是一个对象,不是一种原生类,对象所以存放在堆中,又因为数组特性,是连续的,只有C不对

13.下列哪个修饰符可以使在一个类中定义的成员变量只能被同一包中的类访问?

A.private
B.无修饰符
C.public
D.protected

答案:
B

解析:

解析

14.关于以下程序代码的说明正确的是?

public class HasStatic {
    private static int x = 100;

    public static void main(String args[]) {
        HasStatic hs1 = new HasStatic();
        hs1.x++;
        HasStatic hs2 = new HasStatic();
        hs2.x++;
        hs1 = new HasStatic();
        ;
        hs1.x++;
        HasStatic.x--;
        System.out.println("x=" + x);
    }
}

A.程序通过编译,输出结果为:x=103
B.10行不能通过编译,因为x是私有静态变量
C.5行不能通过编译,因为引用了私有静态变量
D.程序通过编译,输出结果为:x=102

答案:
D

解析:
此题选择D。
首先要了解static的意思。

static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。
static变量在第一次使用的时候初始化,但只会有一份成员对象。
所以这里不仅可以调用,而且每一次调用都确实修改了x的值,也就是变化情况是这样的:
x=101
x=102
x=103
x=102

15.如何放掉一个指定占据的内存空间?()

A.调用free()方法
B.代用system.gc()方法
C.赋值给该项对象的引用为null
D.程序员无法明确强制垃圾回收器运行

答案:
D

解析:
在《java虚拟机》一书中明确讲了,释放掉占据的内存空间是由gc完成,但是程序员无法明确强制其运行,该空间在不被引用的时候不一定会立即被释放,这取决于GC本身,无法由程序员通过代码控制。

16.一般情况下,以下哪个选项不是关系数据模型与对象模型之间匹配关系?

A.表对应类
B.记录对应对象
C.表的字段对应类的属性
D.表之间的参考关系对应类之间的依赖关系

答案:
D

解析:
一般关系数据模型和对象数据模型之间有以下对应关系:表对应类,记录对应对象,表的字段对应类的属性

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

A.CopyOnWriteArrayList适用于写多读少的并发场景
B.ReadWriteLock适用于读多写少的并发场景
C.ConcurrentHashMap的写操作不需要加锁,读操作需要加锁
D.只要在定义int类型的成员变量i的时候加上volatile关键字,那么多线程并发执行i++这样的操作的时候就是线程安全的了

答案:
B

解析:
A,CopyOnWriteArrayList适用于写少读多的并发场景
B,ReadWriteLock即为读写锁,他要求写与写之间互斥,读与写之间互斥,读与读之间可以并发执行。在读多写少的情况下可以提高效率
C,ConcurrentHashMap是同步的HashMap,读写都加锁
D,volatile只保证多线程操作的可见性,不保证原子性

18.以下代码执行后输出结果为( )

public class Test
{
    public static Test t1 = new Test();
    {
         System.out.println("blockA");
    }
    static
    {
        System.out.println("blockB");
    }
    public static void main(String[] args)
    {
        Test t2 = new Test();
    }
 }

A.blockAblockBblockA
B.blockAblockAblockB
C.blockBblockBblockA
D.blockBblockAblockB

答案:
A

解析:
静态块:用static申明,JVM加载类时执行,仅执行一次
构造块:类中直接用{}定义,每一次创建对象时执行
执行顺序优先级:静态块>main()>构造块>构造方法  静态块按照申明顺序执行,先执行Test t1 = new Test();
所有先输出blockA,然后执行静态块,输出blockB,最后执行main
方法中的Test t2 = new Test();输出blockA。

19.有关hashMap跟hashTable的区别,说法正确的是?

A.HashMap和Hashtable都实现了Map接口
B.HashMap是非synchronized,而Hashtable是synchronized
C.HashTable使用Enumeration,HashMap使用Iterator
D.HashMap允许将 null 作为一个 entry 的 key 或者 value,而 Hashtable 不允许。

答案:
ABCD

解析:

A正确。Map是一个接口,hashtable,hashmap都是它的实现。
B正确。由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。
C正确。HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。
D正确。哈希值的使用不同,HashTable直接使用对象的hashCode,代码是这样的:

      int hash = key.hashCode();
      int index = (hash & 0x7FFFFFFF) % tab.length;

而HashMap重新计算hash值,而且用与代替求模:
int hash = hash(k);
int i = indexFor(hash, table.length);

20.以下可以正确获取结果集的有?

A.Statement sta=con.createStatement();
ResultSet rst=sta.executeQuery(“select * from book”);

B.Statement sta=con.createStatement(“select * from book”); ResultSet rst=sta.executeQuery();

C.PreparedStatement pst=con.prepareStatement();
ResultSet rst=pst.executeQuery(“select * from book”);

D.PreparedStatement pst=con.prepareStatement(“select * from book”);
ResultSet rst=pst.executeQuery();

答案:
A D

解析:
A,D是正确的;创建Statement是不传参的,PreparedStatement是需要传入sql语句
说一下preparedStatement和statement的区别与联系:在JDBC应用中,如果你已经是稍有水平开发者,你就应该始终以PreparedStatement代替Statement.也就是说,在任何时候都不要使用Statement。 
PreparedStatement 接口继承 Statement,PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于Statement对象。Statement为一条Sql语句生成执行计划,如果要执行两条sql语句select colume from table where colume=1;select colume from table where colume=2; 会生成两个执行计划一千个查询就生成一千个执行计划!PreparedStatement用于使用绑定变量重用执行计划 select colume from table where colume=:x; 通过set不同数据只需要生成一次执行计划,可以重用

 

全部评论

相关推荐

挣K存W养DOG:他真的很中意你,为什么不回他
点赞 评论 收藏
分享
评论
点赞
1
分享
牛客网
牛客企业服务