1.hashcode()和equals()方法的重要性体现在什么地方?
java中的hashmap使用hashcode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash值,因此,可能会被集合认为是相等的。而且,这两个方法也用来发现重复元素。所以这两个方法的实现对hashmap的精确性和正确性是至关重要的。
2.hashmap和hashtable有什么区别?
hashmap和hashtable都实现了map接口,因此很多特性非常相似。但是,他们有以下不同点:
hashmap允许键和值是null,而hashtable不允许键或者值是null。
hashtable是同步的,而hashmap不是。因此,hashmap更适合于单线程环境,而hashtable适合于多线程环境。
hashmap提供了可供应用迭代的键的集合,因此,hashmap是快速失败的。另一方面,hashtable提供了对键的列举(enumeration)。
一般认为hashtable是一个遗留的类。
3.数组(array)和列表(arraylist)有什么区别?什么时候应该使用array而不是arraylist?
下面列出了array和arraylist的不同点:
array可以包含基本类型和对象类型,arraylist只能包含对象类型。
array大小是固定的,arraylist的大小是动态变化的。
arraylist提供了更多的方法和特性,比如:addall(),removeall(),iterator()等等。
对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。
4.arraylist和linkedlist有什么区别?
arraylist和linkedlist都实现了list接口,他们有以下的不同点:
arraylist是基于索引的数据接口,它的底层是数组。它可以以o(1)时间复杂度对元素进行随机访问。与此对应,linkedlist是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是o(n)。
相对于arraylist,linkedlist的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。
linkedlist比arraylist更占内存,因为linkedlist为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。
也可以参考arraylist vs. linkedlist。
5.comparable和comparator接口是干什么的?列出它们的区别。
java提供了只包含一个compareto()方法的comparable接口。这个方法可以个给两个对象排序。具体来说,它返回负数,0,正数来表明输入对象小于,等于,大于已经存在的对象。
java提供了包含compare()和equals()两个方法的comparator接口。compare()方法用来给两个输入参数排序,返回负数,0,正数表明*一个参数是小于,等于,大于第二个参数。equals()方法需要一个对象作为参数,它用来决定输入参数是否和comparator相等。只有当输入参数也是一个comparator并且输入参数和当前comparator的排序结果是相同的时候,这个方法才返回true。
6.什么是java优先级队列(priority queue)?
priorityqueue是一个基于优先级堆的无界队列,它的元素是按照自然顺序(natural order)排序的。在创建的时候,我们可以给它提供一个负责给元素排序的比较器。priorityqueue不允许null值,因为他们没有自然顺序,或者说他们没有任何的相关联的比较器。最后,priorityqueue不是线程安全的,入队和出队的时间复杂度是o(log(n))。
7.你了解大o符号(big-o notation)么?你能给出不同数据结构的例子么?
大o符号描述了当数据结构里面的元素增加的时候,算法的规模或者是性能在最坏的场景下有多么好。
大o符号也可用来描述其他的行为,比如:内存消耗。因为集合类实际上是数据结构,我们一般使用大o符号基于时间,内存和性能来选择最好的实现。大o符号可以对大量数据的性能给出一个很好的说明。
31.如何权衡是使用无序的数组还是有序的数组?
有序数组最大的好处在于查找的时间复杂度是o(log n),而无序数组是o(n)。有序数组的缺点是插入操作的时间复杂度是o(n),因为值大的元素需要往后移动来给新元素腾位置。相反,无序数组的插入时间复杂度是常量o(1)。
32.java集合类框架的最佳实践有哪些?
根据应用的需要正确选择要使用的集合的类型对性能非常重要,比如:假如元素的大小是固定的,而且能事先知道,我们就应该用array而不是arraylist。
有些集合类允许指定初始容量。因此,如果我们能估计出存储的元素的数目,我们可以设置初始容量来避免重新计算hash值或者是扩容。
为了类型安全,可读性和健壮性的原因总是要使用泛型。同时,使用泛型还可以避免运行时的classcastexception。
使用jdk提供的不变类(immutableclass)作为map的键可以避免为我们自己的类实现hashcode()和equals()方法。
编程的时候接口优于实现。
底层的集合实际上是空的情况下,返回长度是0的集合或者是数组,不要返回null。
33.enumeration接口和iterator接口的区别有哪些?
enumeration速度是iterator的2倍,同时占用更少的内存。但是,iterator远远比enumeration安全,因为其他线程不能够修改正在被iterator遍历的集合里面的对象。同时,iterator允许调用者删除底层集合里面的元素,这对enumeration来说是不可能的。
34.hashset和treeset有什么区别?
hashset是由一个hash表来实现的,因此,它的元素是无序的。add(),remove(),contains()方法的时间复杂度是o(1)。
另一方面,treeset是由一个树形的结构来实现的,它里面的元素是有序的。因此,add(),remove(),contains()方法的时间复杂度是o(logn)。
垃圾收集器(garbage collectors)
35.java中垃圾回收有什么目的?什么时候进行垃圾回收?
垃圾回收的目的是识别并且丢弃应用不再使用的对象来释放和重用资源。
36.system.gc()和runtime.gc()会做什么事情?
这两个方法用来提示jvm要进行垃圾回收。但是,立即开始还是延迟进行垃圾回收是取决于jvm的。
37.finalize()方法什么时候被调用?析构函数(finalization)的目的是什么?
在释放对象占用的内存之前,垃圾收集器会调用对象的finalize()方法。一般建议在该方法中释放对象持有的资源。
38.如果对象的引用被置为null,垃圾收集器是否会立即释放对象占用的内存?
不会,在下一个垃圾回收周期中,这个对象将是可被回收的。
疯狂软件java培训始终坚持跟随国际前沿的java技术的发展脚步,2014年刚出的java 8新特征,java课程已经在详细的讲解java 8新特征,java课程保障学员学到的知识都是最新的、最先进的,不会落后于时代发展。对于真正有志于java的人来说,比起费用,更重要的还是能够真正学到技术。只要选对好的培训机构,脚踏实地勤奋学习,就可以有所收获,java培训期待为您的腾飞助一臂之力。
广州为学教育科技有限公司
020 28309358
