java面试环节是在找工作中必经的一个环节,通过这个环节让公司对你本人素质以及的技术的掌握程度做一个初步的了解,来评定是是否适合这个职位,也然面试者对公司能够有一个初步的了解,总之就是一个互相了解的一个简单的互相了解的一个过程。
在面试中面试虽然有很多因素是不可预估的,就比如说面试笔试题,虽然无法预估但是我们可以对常用的java面试进行掌握牢记,在面试过程中是有非常大的几率遇到的。
今天呢出于这样的想法,把以往所遇到的面试题回忆了一下,总结了一下一些面试题,题目与答案是分开的,在看答案之前不妨先自己把题目做一遍,在看后边的答案及为什么会是这个答案。
一、选择题
1.访问修饰符作用范围由大到小是( )。
A.private-protected-default-public
B.public-protected-default-private
C.private-default-protected-public
D.public-default-protected-private
2.在 Java 语言中,下面接口以键-值对的方式存储对象的是( )。
A.java.util.List
B.java.util.Map
C.java.util.Collection
D.java.util.Set
3.以下不是 Object 类的方法的是( )。
A.hashCode()
B.finalize()
C.notify()
D.hasNext()
4.有如下代码:
public class Test { public void change(String str, char ch[]) { str = "test ok"; ch[0] = 'g'; } public static void main(String args[]) { String str = new String("good"); char[] ch = { 'a', 'b', 'c' }; Test ex = new Test(); ex.change(str, ch); System.out.print(str + "and "); System.out.print(ch); } } 上面程序的运行结果是( )。
A.good and abc
B.good and gbc
C.test ok and abc
D.test ok and gbc
二、填空题
1.Math.round(12.5)的返回值等于( ),Math.round(-12.5)的返回值等于( )。
2.有如下程序: String str1="hello world"; String str2="hello"+newString("world"); System.out.println (str1==str2); 那么程序的运行结果是( )。
3.在 Java 语言中,基本数据类型包括( )、字符类型( )、布尔类型 boolean 和数值类型( )。
4.字符串分为两大类:一类是字符串常量( );另一类是字符串变量( )。
一:选择题答案:
1.答案:B。
分析:本题考察的是 Java 语言中访问修饰符作用范围的知识。在 Java 语言中,类的权限访问修饰符有以下几种:private、default(package)、protected 和 public。下面具体对这几个权限访问修饰符进行介绍。
(1)私有权限(private) private 可以修饰数据成员、构造方法及方法成员,不可以修饰类(此处指外部类,不考虑内部类)。被 private 修饰的成员,只能在定义它们的类中使用,在其他类中不能调用。
(2)默认权限(default)类、数据成员、构造方法和方法成员等都能够使用默认权限,即不被 private、protected 和 public 修饰。默认权限即同包权限,同包权限的元素只能在定义它们的类中以及同包的类中被调用。(3)受保护权限(protected) protected 可以修饰数据成员、构造方法和方法成员,不可以修饰类(此处指外部类,不考虑内部类)。被 protected 修饰的成员,能在定义它们的类中以及同包的类中被调用。如果有不同包的类想调用它们,那么这个类必须是它的子类。
(4)公共权限(public) public 可以修饰类、数据成员、构造方法及方法成员。被 public 修饰的成员,可以在任何一个类中被调用,不管同包或不同包,是权限最大的一个修饰符。
2.答案:B。
分析:本题考察的是 Java 语言中基本数据结构的知识。对于选项 A,List 中保存了相同类型的多个元素,元素是按照存入的顺序存储的,元素可以重复。所以,选项 A 错误。
对于选项 B,Map 是以键-值对的方式来存储对象的,并且键不允许重复。所以,选项 B 正确。
对于选项 C,java.util.Collection 是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法。而 Set 与 List 是它的两个具体的接口,由于 Set 与 List 都不是以键-值对的方式来存储对象的,因此,Collection 接口也不是。所以,选项 C 错误。
对于选项 D,Set 中也保存了相同类型的多个元素,元素是不能重复的。所以,选项 D 错误。
3.答案:D。分析:本题考察的是 Object 类的知识。 Object 类是类层次结构的根,在 Java 语言中,所有的类从根本上而言都继承自这个类。而且,Object 类是 Java 语言中唯一没有父类的类,而其他所有的类,包括标准容器类,例如数组,都继承了 Object 类。。
Object 类的方法方 法 名返 回类 型方 法 描 述 clone() Object 创建并返回此对象的一个副本 equals(Object obj) boolean 判断 obj 对象是否与此对象相等 finalize() void 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法 getClass() Class 返回此 Object 的运行时类 hashCode() int 返回该对象的哈希码值 notify() void 唤醒在此对象监视器上等待的单个线程 notifyAll() void 唤醒在此对象监视器上等待的所有线程 toString() String 返回该对象的字符串表示 wait() void 在其他线程调用此对象的 notify() 方法或 notifyAll()方法前,使当前线程等待 wait(long timeout) void 在其他线程调用此对象的 notify() 方法或 notifyAll()方法,或者超过指定的时间量前,使当前线程等待 wait(long timeout, int nanos) void 在其他线程调用此对象的 notify() 方法或 notifyAll()方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量前,使当前线程等待由此可见,Object 类没有 hasNext()方法。所以,选项 D 正确。所以,本题的答案为 D。
4.答案:B。
分析:本题考察的是 Java 语言中传参方式以及不可变类的知识。不可变类(Immutable class)是指当创建了这个类的实例后,就不允许修改它的值了,也就是说,一个对象一旦被创建出来,在其整个生命周期中,它的成员变量就不能被修改了。
它有点类似于常量(const),即只允许其他程序进行读操作,而不允许其他程序进行修改操作。在 Java 类库中,所有基本类型的包装类都是不可变类,例如 Integer、Float 等。
此外, String 也是不可变类。可能有人会有疑问,既然 String 是不可变类,为什么还可以写出如下代码来修改 String 类型的值呢? public class Test { public static void main(String[] args) { String s="Hello"; s+=" world"; System.out.println(s); } } 程序的运行结果为 Hello world 表面上看,s+="world"的作用好像是修改 String 类型对象 s 的值,其实不是,String s="Hello"语句声明了一个可以指向 String 类型对象的引用,这个引用的名字为 s,它指向了一个字符串常量"Hello"。s+="world"并没有改变 s 所指向的字符串的值(由于"Hello"是 String 类型的对象,而 String 又是不可变量),在这行代码运行后,s 指向了另外一个 String 类型的对象,该对象的内容为"Hello world"。原来的那个字符串常量"Hello"还存在于内存中,并没有被改变。
在 Java 语言中,除了 8 种原始的数据类型(分别为 byte、short、int、long、float、double、 char 和 boolean)外,其他的类型都是对象,在方法调用的时候,传递的都是引用。引用从本质上来讲也是按值传递,只不过传递的这个值是对象的引用而已,因此,在方法调用的时候,对形参引用所指对象属性值的修改对实参可见。
但是对引用值本身的修改对实参是不可见的。回到本题中来,在调用 change 方法的时候,change 方法的形参 str 实际上是实参 str(main 方法中的 str)的一个副本,由于 String 是不可变量,因此,无法通过 str 来修改这个字符串的内容,执行语句 str="test ok"的结果是使形参的 str 指向了另外一个常量字符串(可以理解为修改了形参的值,而不是修改了形参所指向对象的值),但是这个修改对实参是不可见的,调用 change 方法结束后对象的 main 方法中 str 的值还是"good",而 change 方法的形参 ch 也是实参 ch(main 方法中的 ch 值)的一个副本,但是在这个方法中通过形参 ch 修改了实参 ch 所指向对象的值,即数组元素的值,形参 ch 与实参 ch 指向的是同一个对象,因此,通过形参对这个对象值的修改对实参是可见的,所以,当调用 ex.change 方法后,main 方法中 ch 指向的数组的值变为{‘g’,‘b’,‘c’},因为该方法只是改变了 ch[0]的值而已,所以,程序最终输出为字符串"good and gbc"。所以,选项 B 正确。所以,本题的答案为 B。
二、填空题答案
1.答案:13,-12。
分析:本题考察的是 Math 类中 round 方法的使用。 Math 类主要提供了下面 5 个与取整相关的方法:
1)static double ceil(double a):返回大于等于 a 的最小整数。
2)static double floor(double a):返回小于等于 a 的最大整数。
3)static double rint(double a):四舍五入方法,返回与 a 的值最相近的整数,为 double 类型。
4)static long round(double a):四舍五入方法,返回与 a 的值最相近的长整型数。
5)static int round(float a):四舍五入方法,返回与 a 的值最相近的整型数。对于本题而言,round 是一个四舍五入的方法,12.5 的小数部分为 0.5,当对其执行 Math.round()操作时,结果需要四舍五入,所以,结果为 13;-12.5 的小数部分也为 0.5,当对其执行 Math.round()操作时,结果也需要四舍五入,由于-12>-13,因此,结果为-12。
2.答案:false。
分析:本题考察的是字符串知识。在 Java 语言中,除了 8 种基本的数据类型外,其他的类型都为引用类型,因此,语句 str1==str2 的功能是比较 str1 与 str2 这两个字符串的地址是否相同,显然,str1 存储在常量区,而 str2 中的“world”是在堆空间上申请的另外一块存储空间,因此,二者必然有不同的存储地址。
因此,程序的运行结果为 false。
3.答案:浮点型 float、double,char,byte、short、int、long。
分析:本题考察的是 Java 数据类型的知识。 Java 语言中只有 8 种基本数据类型,分别为 byte、short、int、long、float、double、char 和 boolean。
在方法调用传参时,这 8 种基本数据类型都是按值传递的,除此之外,所有的数据类型都是按引用传递的。由以上分析可知,本题的答案为:浮点型 float、double,字符类型 char,布尔类型 boolean,数值类型 byte、short、int、long。
4.答案:String,StringBuffer。
分析:本题考察的是对 Java 字符串的理解。在 Java 语言中,String 是不可变类,也就是说,String 对象一旦被创建,其值将不能被改变,而 StringBuffer 是可变类,当对象被创建后,仍然可以对其值进行修改。
由于 String 是不可变类,因此,适合在需要被共享的场合中使用,而当一个字符串经常需要被修改时,最好使用 StringBuffer 来实现。
如果使用 String 来保存一个经常被修改的字符串,在字符串被修改的时候会比 StringBuffer 多了很多附加的操作,同时会生成很多无用的对象,由于这些无用的对象会被垃圾回收器回收,所以,会影响程序的性能。在规模小的项目中这种影响很小,但是在一个规模大的项目中,这会给程序的运行效率带来很大的负面影响。
Java热点新闻