一、谈谈final、finally、finaliza的区别。
final---修饰符(关键字)
当一个变量被声明为final时,表示变量不可变,且必须在声明时给定初始值。
当一个方法被声明为final时,表示方法在子类中不可被重写。
当一个类被声明为final时,表示类不可被继承,因此一个类不能既被声明为abstract的,又被声明为final的。
finally---异常处理语句块的一部分,表示总是执行
finaliza---object类的一个方法,当一个对象被GC前会调用这个方法。可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。
二、静态内部类和内部类的不同。
1.静态内部类可以有静态成员(方法,属性),而非静态内部类则不能有静态成员(方法,属性)。
2.静态内部类只能够访问外部类的静态成员,而非静态内部类则可以访问外部类的所有成员(方法,属性)。
3.实例化一个非静态的内部类的方法:
a.先生成一个外部类对象实例
b.通过外部类的对象实例生成内部类对象
4.实例化一个静态内部类的方法:
a.不依赖于外部类的实例,直接实例化内部类对象
b.调用内部静态类的方法或静态变量,通过类名直接调用
三、HashMap和Hashtable的区别
HashMap是Hashtable的轻量级实现(非线程安全的实现),它们都实现了Map接口,将唯一键映射到特定的值上。
HashMap允许空(null)键值(key),Hashtable则不允许空的键值。
由于HashMap是非同步的所以效率上高于Hashtable。当多个线程访问同一个hashMap时,需要自己实现外同步。
四、说出ArrayList,Vector,LinkedList的存储性能和特性
ArrayList和Vector都是采用数组方式存储数据,此数组元素数大于实际存储的数据,以便增加和插入元素,都允许通过下标直接索引元素,但是插入数据要涉及到数组元素移动等内存操作,所以索引数据快、插入数据慢。
Vector由于使用了同步,所以速度上比ArraryList要慢。
LinkedList使用双向链表实现存储,按序号索引元素需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数据比较快。
五、Collection和Collections的区别
Collection是集合类的上级接口,实现它的接口主要有Set和List。
Collections是针对集合的一个帮助类,它提供了一系列的静态方法实现对集合的操作,比如:搜索、排序、线程安全化等。
六、什么是GC,为什么要GC?
GC是垃圾收集器。内存处理是程序员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,java提供的GC功能可以自动监测对象是否不在有引用,从而达到自动回收内存的目的,java语言没有提供释放已分配内存的显式操作方法。
七、sleep()和wait() 有什么区别?
1、sleep类是Thread的静态方法,wait是Object的方法。
2、sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3、wait只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用。
4、sleep必须捕获异常,而wait则不需要捕获异常。
八、java有没有goto?
没有。
九、Overload和Override的区别。overload的方法是否可以改变返回值的类型?
重写和重载是java多态性的不同表现。
重写是子类与父类之间多态性的一种表现,重载是一个类中多态性的表现。如果在子类中定义某方法与其父类有相同的名称和参数,则改方法重写了父类的方法,子类的对象使用这个方法时将调用子类中的方法。如果一个类中定义了多个同名的方法,它们或有不同的参数个数或不同的参数类型,则称为重载。
Overload的方法是可以改变返回值的类型
十、抽象类和接口的区别
1、abstract class和interface所反映出的设计理念不同。abstract class表示的是“is a”关系,interface表示的是“like a”关系。
2、abstract class在java语言中表示的是一种继承关系,一个类只能有一个父类。但一个类可以实现多个interface。
3、在abstract class中可以有非abstract的成员变量和方法,而在interface中,只能够有static final的成员变量,和abstract的方法
4、抽象类中可以有非抽象的方法,接口中不能有实现的方法,接口中的方法默认都是public,abstract类型的。
十一、面向对象的特征有哪些方面
面向对象的三个基本特征是:封装、继承、多态。
1、封装:封装是把数据和过程隐藏起来,对数据的访问只能通过已定义的界面。它隐藏了细节,使得代码模块化,使得数据的访问更加安全。
2、继承:继承是指这样一种能力,它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。增加了代码的重用性。新类继承了原始类的特征。新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。
3、多态:它是通过重写和重载实现的。多态性语言具有灵活、抽象、行为共享的优势,也很好的解决了同名函数问题。
十二、String是基本数据类型吗?
java的基本数据类型包括:byte、char、short、int、long、double、float、boolean。
String不是基本类型,它final类型的类,因此不可以继承和修改这个类。
十三、String和StringBuffer的区别
它们都可以存储和操作字符串,既包含多个字符的字符数据。
String类提供了数值不可改变的字符串,StringBuffer类提供的字符串是可以修改的,如果程序要对字符串进行频繁修改的话,使用StringBuffer会提高效率,如果要得到String的话,可通过StringBuffer的toString()方法
十四、同步和异步有何区别,分别在什么情况下使用。
同步:如果数据在线程间共享。例如正在写的数据以后可能被另外一个线程读到,或者正在读的数据可能已经被另外一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。
异步:当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。
十五、启动一个线程使用run()还是start()?
start()
十六、数组有没有length()这个方法?String有没有length()这个方法?
数组只有length属性。String有length()这个方法
十七、说出你知道的线程同步的方法
wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
notify():唤醒一个处于等待的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
allnotify():唤醒所有初入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
synchronized:修饰语句块和方法。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
十八、描述一下JVM加载class文件的原理机制
JVM中类的装载时由ClassLoader和它的子类实现的,Java ClassLoader 是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。