Java面试题

第一题:当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

答:分几种情况:
     1.其他方法前是否加了synchronized关键字,如果没加,则能。
     2.如果这个方法内部调用了wait,则可以进入其他synchronized方法。
     3.如果其他个方法都加了synchronized关键字,并且内部没有调用wait,则不能。
     4.如果其他方法是static,它用的同步锁是当前类的字节码,与非静态的方法不能同步,因为非静态的方法用的是this。

第二题:try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?

答:会执行,只有代码中有system.exit() 这一种情况才不会执行finally,因为终止了虚拟机进程。return前。

第三题:两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?

答:对。

值相同使用equals方法来判断,equals方法重写后不一定是判断对象是否是同一个对象,所以hashcode不同是很正常的。就好比我定义个类,有名字和编号,我重写equals方法,让名字相同就返回相等,那么我虽然有hashcode不同的两个对象(他们的编号都可以不同,或者两个对象的所有属性值都一样),但他们的hashcode当然不同,因为根本就不是一个对象嘛。

public boolean equals(Object obj)指示某个其他对象是否与此对象“相等”。 
equals 方法在非空对象引用上实现相等关系: 

自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。 
对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。 
传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。 
一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。 
对于任何非空引用值 x,x.equals(null) 都应返回 false。 
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。 

注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

1. 在同一应用中,一个对象的hashCode函数在equals函数没有更改的情况下,无论调用多少次,它都必须返回同一个整数。 
2. 两个对象如果调用equals函数是相等的话,那么调用hashCode函数一定会返回相同的整数。 
3. 两个对象如果调用equals函数是不相等的话,那么调用hashCode函数不要求一定返回不同的整数

第四题:当一个对象被当做参数传递到一个方法后,此方法可改变这个对象的属性并可返回变化后的结果,那么这里到底是值传递还是引用传递

答:是值传递。

  Java 编程语言只由值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。

Java参数,不管是原始类型还是引用类型,传递的都是副本(有另外一种说法是传值,但是说传副本更好理解吧,传值通常是相对传址而言)。

  如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的值不会改变原始的值.
  如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是改变了地址中的 值,那么在函数内的改变会影响到传入的参数。如果在函数中改变了副本的地址,如new一个,那么副本就指向了一个新的地址,此时传入的参数还是指向原来的 地址,所以不会改变参数的值。
基本类型参数传递:不改变值       
引用类型参数传递:改变值

第五题:switch语句能否作用在byte上,能否作用在long上,能否作用在String上

答: * switch可作用于char byte short int
   * switch可作用于char byte short int对应的包装类,即Character、Byte、Short、Integer
   * switch不可作用于long double float boolean,包括他们的包装类
   * switch中可以是字符串类型,String(jdk1.7之后才可以作用在string上)
   * switch中可以是枚举类型

第六题:Constructor(构造器)是否可被override(重写)?

答: Constructor(构造器)不能被继承,所以不能被override(重写),但是可以被overloading(重载)。

第七题:接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体?

答:1、接口是否可继承接口?
  答:不可以。接口是要被实现而不是被继承的,加入你用词不当,问接口是否可实现接口,答案仍然是不能,因为接口里面的方法必须全部是抽象方法,接口A实现了接口B,那么A就要重写B的抽象方法,重写了之后,A的性质也就不是接口A了,变成了抽象类A。
  2、抽象类是否可实现接口?
  答:可以。正如第一题所说。
  3、抽象类是否可继承实体类?
  答:可以。

第八题:Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

答:12,-11.取绝对值最近的。Math.round(11.2)=11,Math.round(-11.2)=-11,Math.round(11.6)=12,Math.round(-11.6)=-12

第九题:abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized

答:都不可以,因为abstract申明的方法是要求子类去实现的,abstract只是告诉你有这样一个接口,你要去实现,至于你的具体实现可以是native和synchronized,也可以不是,抽象方法是不关心这些事的,所以写这两个是没有意义的。然后,static方法是不会被覆盖的,而abstract方法正是要子类去覆盖它,所以也是没有意义的。所以,总的来说,就是java语法不允许你这样做,事实上,也没有意义这样做。

第十题:&和&&的区别

答:&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。
  &&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,例如,对于if(str != null && !str.equals(“”))表达式,当str为null时,后面的表达式不会执行,所以不会出现NullPointerException如果将&&改为&,则会抛出NullPointerException异常。If(x==33 & ++y>0) y会增长,If(x==33 && ++y>0)不会增长
  &还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0x31 & 0x0f的结果为0x01。

第十一题:谈谈final, finally, finalize区别。

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

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

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

第十二题:Anonymous Inner Class (匿名内部类) 是否可以继承其它类,是否可以实现接口

答:不能。

Inner Class(内部类)定义在类中的类。

Nested Class(嵌套类)是静态(static)内部类。1. 要创建嵌套类的对象,并不需要其外围类的对象。 2. 不能从嵌套类的对象中访问非静态的外围类对象。

Anonymous Inner Class (匿名内部类)匿名的内部类是没有名字的内部类。

匿名的内部类不能extends(继承)其它类,但一个内部类可以作为一个接口,由另一个内部类实现。

嵌套类可以作为接口的内部类。正常情况下,你不能在接口内部放置任何代码,但嵌套类可以作为接口的一部分,因为它是static 的。只是将嵌套类置于接口的命名空间内,这并不违反接口的规则。

内部类被继承,由于内部类有一个指向外围类对象的秘密引用,所以在继承内部类的时候,该秘密引用必须被初始化。

第十三题:java中Collection与Collections的区别

答:1、java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。

 Collection  
├List  
│├LinkedList  
│├ArrayList  
│└Vector  
│ └Stack  
└Set

  2、java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。

posted @ 2017-03-07 09:57  esther-qing  阅读(179)  评论(0编辑  收藏  举报