您的位置:首页 > 职场人生

java面试资料-基础知识

2017-07-26 21:56 351 查看
(1)String类为什么是final?

主要是为了“效率” 和 “安全性” 的缘故。

若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所以String被定义成final。

为了程序的安全性,因为String类共享,所以要控制不能被修改。

(2)关于HashMap

JDK1.8中,HashMap采用位桶+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。先根据hash值计算属于哪个桶,然后插在链表末尾。

(3)Class.forName和classloader区别

两个都可以用来进行类的加载,区别是:

Class.forName加载到jvm中之外,还会对类进行解释,执行类中的static块;

classloader不会执行static中的内容,只有在newInstance才会去执行static块

(4)Array.sort()和Collection.sort()以及Collections.sort

首先看Collection和Collections
Collection是一个集合接口,Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作

Collection是一个接口,Colletion.sort()会调用相应的实现的ArrayList对象的sort方法,最后在底层还是调用的是Array.sort()方法,使用的是一个经过调优的快速排序

Colletion.sort()使用的是TimSort算法(类似于归并排序),就是找到已经排好序数据的子序列,然后对剩余部分排序,然后合并起来。

(5)关于foreach

java5新增,在遍历数组、集合的时候,foreach拥有不错的性能,foreach的循环对象一般是一个集合,List、ArrayList、LinkedList、Vector、数组等。无法在遍历中修改源数据。

for循环效率比较高,因为foreach有新对象的生成

(6)Math.ceil()向上取整,Math.floor()向下取整,Math.round()四舍五入。

(7)应该使用"abc".equals(username)的形式,防止username为空产生的异常行为。

(8)构造函数不能被继承,子类必须写自己的构造函数然后使用super调用父类构造函数;所以构造函数也是不能重写的。

(9)抽象类可以继承实体类(object就是实体类),抽象类中也可以有静态main方法,抽象类与普通类的唯一区别就是不能创建实例对象和允许有abstract方法。

(10)内部类可以访问包含该类的外部类成员,但是静态内部类只能访问外部类的静态成员。

(11)String与StringBuffer,StringBuilder(jdk1.5)的区别
简单地说,就是一个变量和常量的关系。StringBuffer,Stringbuilder对象的内容可以修改;而String对象一旦产生后就不可以被修改,重新赋值其实是两个对象。
StringBuffer的内部实现方式和String不同,StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类。所以在实际使用时,如果经常需要对一个字符串进行修改,例如插入、删除等操作,使用StringBuffer要更加适合一些。 

StringBuffer同步,StringBuilder异步。

一般还是选择String,主要是在需要频繁修改的地方用其他两种。

(12)Arraylist和Vector区别

vector是老版本的,同步处理,效率低。Arraylist异步,但不是线程安全。

hashMap和hashtable区别

hashMap是异步,效率高,线程不安全,hashtable相反。hashtable不允许记录值为空。

LinkedHashMap 是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比 LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。

TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。
(13)Java对于eqauls方法和hashCode方法是这样规定的:(1)如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;(2)如果两个对象的hashCode相同,它们并不一定相同。

(14)会。java导致内存泄露的原因很明确:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中内存泄露的发生场景。

(15)&&和||是短路与,短路或,当左边的表达式能判断当前结果,则不判断右边的表达式。而&
和|则将两边的表达式都运算完毕后,再算结果

(16)switch可以接char,int,byte,short和枚举类型,java7中加上了String;

(17)class类实例化的三种形式:

①class<?>
cls = 对象.getclass();

②class<?>
cls = 类.class;

③class<?>
clas = Class.forname(“类名");

(18)java深拷贝,浅拷贝以及Cloneable接口

Cloneable接口是一个空接口,仅用于标记对象,Cloneable接口里面是没有clone()方法,clone()方法是Object类里面的方法,如果对象implement
Cloneable接口的话,需要覆盖clone方法

Object类里的clone()方法仅仅用于浅拷贝(拷贝基本成员属性,对于引用类型仅返回指向改地址的引用)

深拷贝需要重新覆盖Clone方法

(19)hashcode()和equals

1、如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。 

2、如果两个对象不equals,他们的hashcode有可能相等。 

3、如果两个对象hashcode相等,他们不一定equals。 

4、如果两个对象hashcode不相等,他们一定不equals。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: