一,谈谈final, finally, finalize的区别。
final—修饰符(关键字) 修饰类,则该类不能被继承;修饰方法,不能被重写;修饰成员变量,不能被二次赋值(所以说必须 给定初始值);不能和abstract同时使用;
finally—专门用于在try-catch块之后,一般用于关闭某些流之类的。
finalize—方法名。专门用在垃圾回收机制的时候;每一个对象都有一个finalize()方法;
当回收对象的时候,在进行可达性分析后发现没有与GC Roots相连接的引用链,会被第一次标记且进行一次筛选,筛 选的条件就是是否有必要执行该方法,当对象没有覆盖该方法或者已经被调用过,就不会再执行该方法了;该方法是对 象逃脱死亡的唯一办法
二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接 口)?
匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以作为一个接口,由另一个内部类实现。
三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。
Nested Class (一般是C++的说法),Inner Class (一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否 有指向外部的引用上。
静态内部类(Inner Class)意味着创建一个static内部类的对象,不需要一个外部类对象;不能从一个static内部类的一个对 象访问一个外部类对象
Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许
还有就是,HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让 人引起误解。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在
多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap
就必须为之提供外同步。
&是位运算符;不管前面对与错,后面都参与运算。
&&是布尔(逻辑)运算符;只要前面第一个为false,则后面的就不进行运算。
五,HashMap和Hashtable的区别。
1、HashMap和Hashtable都是Map接口的实现类
2、Hashtable是线程安全的,而HashMap是线程不安全的;
3、HashMap允许key-value作为null值,但是Hashtable不允许
4、HashMap是采用的快速安全失败机制来进行访问的
六,Collection 和 Collections的区别。
都是java.util包下面的
--- Collections是类,它包含有各种有关集合操作的静态方法。
--- Collection是接口,它是各种集合的父接口.
七,什么时候用assert。
断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为 true。如果表达式计算为 false,那么系统会报告一个 AssertionError。它用于调试目的:
assert(a > 0); // throws an AssertionError if a <= 0
断言可以有两种形式:
assert Expression1 ;
assert Expression1 : Expression2 ;
Expression1 应该总是产生一个布尔值。
Expression2 可以是得出一个值的任意表达式。这个值用于生成显示更多调试信息的 String 消息。
断言在默认情况下是禁用的。要在编译时启用断言,需要使用 source 1.4 标记:
javac -source 1.4 Test.java
要在运行时启用断言,可使用 -enableassertions 或者 -ea 标记。
要在运行时选择禁用断言,可使用 -da 或者 -disableassertions 标记。
要系统类中启用断言,可使用 -esa 或者 -dsa 标记。还可以在包的基础上启用或者禁用断言。
可以在预计正常情况下不会到达的任何位置上放置断言。断言可以用于验证传递给私有方法的参数。不过,断言不应该用于验证传递给公有方法的参数,因为不管是否启用了断言,公有方法都必须检查其参数。不过,既可以在公有方法中,也可以在非公有方法中利用断言测试后置条件。另外,断言不应该以任何方式改变程序的状态。
八,GC是什么? 为什么要有GC?
GC是垃圾收集器。Java 程序员不需要担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方 法之一:
System.gc()
Runtime.getRuntime().gc()
九,String s = new String("xyz");创建了几个String Object?
两个对象,一个是“xyx”;一个是指向“xyx”的引用对象s。
十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11
十一,short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
short s1 = 1; s1 = s1 + 1;有错,s1是short型,s1+1是int型,不能显式转化为short型。可修改为s1 =(short)(s1 + 1) 。 short s1 = 1; s1 += 1正确。
十二,sleep() 和 wait() 有什么区别?
wait();不一定需要指定等待时间;释放执行权的时候释放锁
sleep():必须指定等待时间;释放执行权,但是不会释放锁;从运行状态变为临时阻塞状态
十三,Java有没有goto?
有,作为java的保留字存在
十四,数组有没有length()这个方法? String有没有length()这个方法?
数组没有length()这个方法,有length的属性。
String有length()这个方法。
十五,Overload(重载、过载)和Override(重写、覆盖)的区别。Overloaded的方法是否可以改变返回值的类型?
重写是父类与子类之间多态性的一种表现,重载是同一个类中多态性的一种表现。
override(重写)是覆盖了一个方法并且对其重写,以求达到不同的作用。
overload(重载)它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后再调用时, JVM就会根据不同的参数样式,来选择合适的方法执行。
Overload(重载)的方法是可以改变返回值的类型。
十六,Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
Set里的元素是不能重复的,用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。
equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。
十七,给我一个你最常见到的runtime exception。
ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException,CannotUndoException,ClassCastException,CMMException,ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException
十八,error和exception有什么区别?
error 表示统错误或低层资源的错误,总是不可被控制的。比如说内存溢出。
exception 表示一种设计或实现问题。 程序员导致的错误,比如算数异常等。
十九,List, Set, Map是否继承自Collection接口?
List,Set是
Map不是
二十,abstract class和interface有什么区别?
接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
类可以实现很多个接口,但是只能继承一个抽象类
类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声明的所有方法,当然,在这种情况下, 类也必须得声明成是抽象的。
抽象类可以在不提供接口方法实现的情况下实现接口。
Java 接口中声明的变量默认都是 final 的。抽象类可以包含非 final 的变量。
Java 接口中的成员函数默认是 public 的。抽象类的成员函数可以是 private,protected 或者是 public。
接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含 main 方法的话是可以被调用的。
二十一,abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
都不能
二十二,接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。
二十三,启动一个线程是用run()还是start()?
启动线程使用start()方法。当用start()开始一个线程后,线程就进入就绪状态,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。当cpu分配给它时间时,才开始执行run()方法(如果有的话)。START()是方法,它调用RUN()方法.而RUN()方法是你必须重写的. run()方法中包含的是线程的主体
二十四,构造器Constructor是否可被override(重写)?
重写是发生在父类与子类之间的事情,然而构造器Constructor不能被继承,因此不能重写,但可以被重载
二十五,是否可以继承String类?
String类是final类故不可以继承。
public final class String extends Object implements Serializable, Comparable< String>, CharSequence
二十六,当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
不能,一个对象的一个synchronized方法只能由一个线程访问。
二十七,try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return 前还是后?
会执行,在return前执行。
二十八,编程题: 用最有效率的方法算出2乘以8等於几?
2 << 3
二十九,两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
不对,有相同的hashcode。
三十,当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是 值传递还是引用传递?
是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。
三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
switch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。
三十二,编程题: 写一个Singleton出来。
//恶汉式
class singeleton{
//1.私有化构造器,让在这个类的外部类不能调用这个构造器
private singeleton(){
}
//2、创建这个类的对象,因为构造器被私有化,外部类是不能再 对这个类创建对象,所以只能本类自己创建对象
//因为这个对象是放在属性的位置,所以可以进行私有化,提供对外的方法,让外部类通过方法来调用这个对象
private static singeleton instence=new singeleton();
//3.私有化此instance对象,通过公共的方法来调用
//4.此公共的方法,只能通过类来调用,因为设置为static的,同时类的的实例也必须为static
public static singeleton getSingeleton(){//返回类型是singeleton***********调用对象的只能是方法或者类,因为这个类中
//的对象被私有化,只能 是通过类来进行访问,那么就要对这个类进行静态化static修饰
//这个方法的作用就是返回对象instence
return instence;
}
}
***************************************
//懒汉式
class singeleton2{
private singeleton2(){
}
private static singeleton2 instence2=null;
public static singeleton2 getSingeleton(){
if(instence2!=null){
instence2=new singeleton2();
}
return instence2;
}
}