1、谈谈final, finally, finalize的区别。

  final:修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。
  finally:在异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句会执行,然后控制会进入 finally 块(如果有的话)。

  finalize:方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。

  2、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?

  匿名的内部类是没有名字的内部类。不能继承其它类,但一个内部类可以作为一个接口,由另一个内部类实现。

  3、Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。

  Static nested class(嵌套类)是将内部类声明为static。普通内部类对象隐式地保存了一个引用,指向创建它的外围类对象,不能有static数据和static字段。嵌套类意味着:1> 要创建嵌套类的对象,并不需要其外围类的对象;2>不能从嵌套类的对象中访问非静态的外围类的对象。

  4、&和&&的区别。

  & 是两个数相与,是位运算符

  &&是布尔逻辑运算符,连接两个条件表达式的,两个条件表达式都为真时,整个才为真

  5、HashMap和Hashtable的区别。

  都属于Map接口的类,实现了将惟一键映射到特定的值上。HashMap 类没有分类或者排序。它允许一个 null 键和多个 null 值。Hashtable 类似于 HashMap,但是不允许 null 键和 null 值。它也比 HashMap 慢,因为它是同步的,是线程安全的。

  6、Collection 和 Collections的区别。

  Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。

  Collection是个java.util下的接口,它是各种集合结构的父接口。

  7、List, Set, Map是否继承自Collection接口?

  List,Set是 Map不是

  8、ArrayList和Vector的区别。

  1>同步性:Vector是线程安全的,也是说是同步的,而ArrayList是线程序不安全的,不是同步的 2>数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半

  9、什么时候用assert。

  assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。一般来说,assertion用于保证程序基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion检查通常是关闭的。

  10、GC是什么? 为什么要有GC?

  GC是垃圾收集器。Java 程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:

System.gc() 

Runtime.getRuntime().gc()
 
  11、String s = new String("xyz");创建了几个String Object?

  两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s

  12、.Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

  Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11;因为返回接近参数的 long。通过加上 1/2 将该结果舍入为整数,取结果的基数并将其强制转换为 long 类型。换句话说,结果等于以下表达式的值: (long)Math.floor(a + 0.5d)

  13、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

  short s1 = 1; s1 = s1 + 1;错, short s1 = 1; s1 += 1;对。对于short s1 = 1; s1 = s1 + 1;由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。对于short s1 = 1; s1 += 1;由于 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。