1.Java基础
1.1 final,finally,finalize 三者区别
Final是一个修饰符: 当final修饰一个变量的时候,变量变成一个常量,它不能被二次赋值 当final修饰的变量为静态变量(即由static修饰)时,必须在声明这个变 量的时候给它赋值 当final修饰方法时,该方法不能被重写 当final修饰类时,该类不能被继承 Final不能修饰抽象类,因为抽象类中会有需要子类实现的抽 象方法,(抽 象类中可以有抽象方法,也可以有普通方法,当一个抽象类中没有抽象方 法时,这个抽象类也就没有了它存在的必要) Final不能修饰接口,因为接口中有需要其实现类来实现的方法 Finally: Finally只能与try/catch语句结合使用,finally语句块中的语句一定会执行, 并且会在return,continue,break关键字之前执行 finalize: Finalize是一个方法,属于java.lang.Object类,finalize()方法是GC (garbage collector垃圾回收)运行机制的一部分,finalize()方法是在 GC清理它所从 属的对象时被调用的
1.2 "=="和equals方法究竟有什么区别
区别主要存在在引用数据类型上 ==为比较两侧的对象是否同一对象,是用内存地址来比较的 equals是对象的方法,默认是用内存地址比较,重写后,主要是用来比较两侧的对象的值是否相同,和equals方法中的实现有关 ==是运算符,可以两侧都为null,但equals左侧的引用指向的对象不能空,不然有NullPointerException 除非需要比较两个引用指向的对象是同一对象,一般都使用equals方法进行比较。尤其是String之类的值对象,另外,常量尽量放在比较的左侧
1.3 静态变量和实例变量的区别
在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。 在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。 总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
1.4 Integer与int的区别
int是java提供的8种原始数据类型之一,占用4个字节,直接存值; Integer是引用数据类型,是int的封装类。 1. 默认值:int的默认值为0,Integer的默认值为null。例如考试成绩为0,表示参加了考试,但成绩为0分,但null意味未参加考试。 2. JSP开发中,Integer的默认值为null, 在EL表达式时,文本框显示的值为空白;如果使用int默认值为0,文本框显示的值是0。int不适合在展示层使用。 3. 在Hibernate中,如果将自增ID字段设置成Integer类型,如果值为null,则表示临时对象,保存时,会自动升成ID值。而使用int类型,则需要在hbm映射文件中,设置unsaved-value属性的值为0。 4. Integer提供了许多跟整数运算相关的操作方法,例如与字符串的转换,还定了一些整数的最大值和最小值的转换。
1.5 Overload和Override的区别
Overload是重载的意思,Override是覆盖的意思,也就是重写。Overload和Override有共同之处,两个方法的方法名都必须相同。 1. Override必须发生在父子类之间,Overload可以不在父子类之间 2. Override的特点: a) 参数列表完全相同:个数相同、类型相同、顺序相同 b) 子类的返回值不能比父类的返回值范围大 c) 子类方法抛出的异常不能比父类方法抛出的异常范围大 d) 修饰符只能为public、protected、friendly,不能为private e) 父子类方法不能使用static修饰 3. 重载发生在同一个类或父子类之间,重载中参数列表至少满足个数不同、类型不同、顺序不同中的一个条件,不包含父子类之间的static方法
1.6 abstract class和interface有什么区别
使用abstract修饰符的class为抽象类,abstract类不能创建的实例对象。 接口(interface)是一种特殊的类,使用interface关键字进行修饰。 下面比较一下两者的语法区别: 1. 抽象类可以有构造方法,接口中不能有构造方法; 2. 抽象类中可以有普通成员属性,接口中没有普通成员属性; 3. 抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法; 4. 抽象类中的抽象方法的访问类型可以是public,protected和默认类型,但接口中的抽象方法只能是public类型的 5. 抽象类中可以包含静态方法,接口中不能包含静态方法; 6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型; 7. 一个类可以实现多个接口,但只能继承一个抽象类; 8. 在应用上也有区别,接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约;而抽象类在代码实现方面发挥作用,可以实现代码的重用。
1.7 StringBuffer和StringBuilder的区别
相同之处,这两类都是可变长的字符串存储类,都实现了CharSequence接口 1. 类型不同,因为不是一个类,也没有继承关系,做参数时不能共用 2. StringBuffer为线程安全类,StringBuilder为线程非安全类 3. StringBuffer性能低,StringBuilder性能高,如果在局部优先使用StringBuilder 4. JDK在1.5之前,字符串相加使用StringBuffer对象,在1.5之后使用StringBuilder对象
1.8 error和exception有什么区别
error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出,不可能指望程序能处理这样的情况。exception表示一种设计或实现问题,也就是说,它表示如果程序运行正常,正常情况下从不会发生的情况。
1.9 多线程中的sleep()和 wait()有什么区别
1. sleep是在Thread类定义的,wait是在Object类定义的 2. sleep有两个重载方法,wait有三个重载方法 3. sleep能自动唤醒,wait有参数的方法能自动唤醒,但无参数的重载方法不能自动唤醒,需要使用notify/notifyAll进行手动唤醒 4. sleep挂起时,不释放锁资源,wait挂起时,会释放锁资源 5. sleep调用时,不需要放在synchronized内,wait需要放在synchronized内 6. sleep一般不会产生死锁,但是wait可能会产生死锁
1.10 同步和异步有何异同
同步是