牛客网-java一般版专项练习

牛客网-java一般版专项练习

1:求cnt

public class Test{
    static int cnt = 6;
    static{
        cnt += 9;
    }
public static void main(String[] args){
    System.out.println(“cnt =” + cnt);
}
static{
    cnt /=3;
    };
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

答:cnt=5 
解析: 
在JVM调用mian方法之前先用进行静态内容的初始化。顺序为:父类的静态变量, 父类的静态代码块 ,子类的静态变量,子类的静态代码块。 
初始化顺序: 
1.先父类,后子类 
2.先属性,后构造函数 
3.先静态,后非静态 
4.先静态属性,后静态代码块 
5.同一类型(非数据类型,指以上),按代码先后顺序

2: 下面所示的java代码,运行时,会产生()类型的异常

int Arry_a[] = new int[10];
System.out.println(Arry_a[10]);
  • 1
  • 2

ArithmeticException(算术异常): 
NullPointException(零点异常): 
IOException(输出异常): 
ArrayIndexOutOfBoundsException(数组下标越界异常):T 
解析: 
定义的数组长度为10,角标即为0-9 
访问数组角标10会出现数组角标越界异常

3:在类设计中,类的成员变量要求仅仅能够被同一package下的类访问,请问应该使用下列哪个修饰词()

protected: 
public: 
private: 
不需要任何修饰词:T 
解析: 
牛客网-java一般版专项练习_第1张图片

4:final、finally和finalize的区别中,下述说法正确的有?

final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。:T

finally是异常处理语句结构的一部分,表示总是执行。:

finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源的回收,例如关闭文件等。:T

引用变量被final修饰之后,不能再指向其他对象,它指向的对象的内容也是不可变的。:T 
解析: 
深入理解java虚拟机中说到: 
当对象不可达后,仍需要两次标记才会被回收,首先垃圾收集器会先执行对象的finalize方法,但不保证会执行完毕(死循环或执行很缓慢的情况会被强行终止),此为第一次标记。第二次检查时,如果对象仍然不可达,才会执行回收。

最好不要以任何方式使用finalize方法。

使用 final 关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。

5:Java中的集合类包括ArrayList、LinkedList、HashMap等类,下列关于集合类描述错误的是 
A: ArrayList和LinkedList均实现了List接口

B: ArrayList的访问速度比LinkedList快

C: 添加和删除元素时,ArrayList的表现更佳

D: HashMap实现Map接口,它允许任何类型的键和值对象,并允许将null用作键或值

解析:

A正确,因为ArrayList和LinkedList都实现List接口。 
B正确,ArrayList底层是数组,所以查询快,增删慢;而LinkedList底层是链表,查询慢,增删快。 
C错误,见B解析。 
D正确,描述正确,有一个Hashtable类,是不允许null作键和值的。 
6:下面有关java的一些细节问题,描述错误的是?

A: 构造方法不需要同步化

B: 一个子类不可以覆盖掉父类的同步方法

C: 定义在接口中的方法默认是public的

D: 容器保存的是对象的引用 :F

解析: 
构造方法每次都是构造出新的对象,不存在多个线程同时读写同一对象中的属性的问题,所以不需要同步 。 
如果父类中的某个方法使用了 synchronized关键字,而子类中也覆盖了这个方法,默认情况下子类中的这个方法并不是同步的,必须显示的在子类的这个方法中加上 synchronized关键字才可。当然,也可以在子类中调用父类中相应的方法,这样虽然子类中的方法并不是同步的,但子类调用了父类中的同步方法,也就相当子类方法也同步了。详见:http://blog.csdn.net/welcome000yy/article/details/8941644

7:假设有以下代码String s = “hello”:String t = “hello”;char c [ ] = {‘h’,’e’,’l’,’l’,’o’};下列选项中返回false的语句是?

s.equals (t); 
t.equals (c);F 
s==t; 
t.equals (new String (“hello”));

解析: 
首先==与equals是有明显区别的。 
==强调栈中的比较,可以理解为地址比较 
equals强调对象的内容比较 
String s=“hello”;会在栈中生成hello字符串,并存入字符串常量池中。 
String t=“hello” ;创建时,会在字符串常量池中寻找,当找到需要的hello时,不进行字符串的创建,引用已有的。 所以,s==t返回true,s.equals(t)也是true。 
char c[]={‘h’,’e’,’l’,’l’,’o’}; c==s这个是不存在的,==两边类型不同 
t.equals(c)这个语句在anObject instanceof String这步判断不会通过,也就是cha[] 压根不能与String相比较,类型不是相同的。返回false

备注知识点: 
1.静态代码块 2.构造代码块3.构造方法的执行顺序是1>2>3;明白他们是干嘛的就理解了。 
1.静态代码块:是在类的加载过程的第三步初始化的时候进行的,主要目的是给类变量赋予初始值。 
2.构造代码块:是独立的,必须依附载体才能运行,Java会把构造代码块放到每种构造方法的前面,用于实例化一些共有的实例变量,减少代码量。 
3.构造方法:用于实例化变量。 
1是类级别的,2、3是实例级别的,自然1要优先23. 
在就明白一点:对子类得主动使用会导致对其父类得主动使用,所以尽管实例化的是子类,但也会导致父类的初始化和实例化,且优于子类执行。 
8:以下声明合法的是 
default String s 
public final static native int w( ):T 
abstract double d 
**abstract fina**l double hyperbolicCosine( )

解析: 
A:变量不能被defalut修饰 
B:native修饰方法,native修饰的方法简单来说就是:一个Java方法调用了一个非Java代码的接口。 
定义navtive方法时,并不提供实现体,因为其实现体是用非Java语言在外面实现的。native可以和任何修饰符连用,abstract除外。因为native暗示这个方法时有实现体的,而abstract却显式指明了这个方法没有实现体。 
C:abstract修饰方法和类 
D:final修饰的方法不能被重写。而abstract定义的方法没有实现,必须被子类重写,明显不能一起使用。 
注意一点变量的定义一般遵循》访问修饰符+ 修饰符 +数据类型 +变量名=初始值.

9:JSP分页代码中,哪个步骤次序是正确的? 
先取总记录数,得到总页数,再取所有的记录,最后显示本页的数据。T 
先取所有的记录,得到总页数,再取总记录数,最后显示本页的数据。 
先取总页数,得到总记录数,再取所有的记录,最后显示本页的数据。 
先取本页的数据,得到总页数,再取总记录数,最后显示所有的记录。

解析:

1count(*)得到总记录数
2、计算总页数
3、获取所有记录(个人感觉这一步不需要,可以直接获取指定页数数据)
4、过滤显示本页数据
  • 1
  • 2
  • 3
  • 4

10:以下java程序代码,执行后的结果是()

java.util.HashMap map=new java.util.HashMap(); 
map.put(“name”,null); 
map.put(“name”,”Jack”);C 
System.out.println(map.size());

解析: 
HashMap可以插入null的key或value,插入的时候,检查是否已经存在相同的key,如果不存在,则直接插入,如果存在,则用新的value替换旧的value,在本题中,第一条put语句,会将key/value对插入HashMap,而第二条put,因为已经存在一个key为name的项,所以会用新的value替换旧的vaue,因此,两条put之后,HashMap中只有一个key/value键值对。那就是(name,jack)。所以,size为1.


你可能感兴趣的:(面试题)