Java初级面试题及答案
1、Java中的重载与重写有什么区别
重载(Overload)是让类以统一的方式处理不同类型数据的一种手段,实质
表现就是多个具有不同的参数个数或者类型的同名函数(返回值类型可随意,不能以返回类型作为重载函数的区分标准)同时存在于同一个类中,是一个类中多态性的一种表现(调用方法时通过传递不同参数个数和参数类型来决定具体使用哪个方法的多态性)。
重写(Override)是父类与子类之间的多态性,实质是对父类的函数进行重
新定义,如果在子类中定义某方法与其父类有相同的名称和参数则该方法被重
写,不过子类函数的访问修饰权限不能小于父类的;若子类中的方法与父类中
的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方
法,如需父类中原有的方法则可使用super关键字。
重载:
java重写和重载的区别必须具有不同的参数列表;
可以有不同的返回类型;
可以有不同的访问修饰符;
可以抛出不同的异常。
重写:
参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载;
返回类型必须一直与被重写的方法相同,否则不能称其为重写而是重载;访问
修饰符的限制一定要大于等于被重写方法的访问修饰符;
重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。
重载与重写是Java多态性的不同表现,重写是父类与子类之间多态性的表
现,在运行时起作用(动态多态性,譬如实现动态绑定),而重载是一个类中
1/ 11
多态性的表现,在编译时起作用(静态多态性,譬如实现静态绑定)。2、Java
的区别
中final、finally、finalize的区别
final是一个修饰符,如果一个类被声明为final则其不能再派生出新的子类,所以一个类不能既被声明为abstract又被声明为final的;将变量或方法声明为final可以保证它们在使用中不被改变(对于对象变量来说其引用不可变,即不能再指向其他的对象,但是对象的值可变),被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取不可修改,被声明为final的方法也同样只能使用不能重载。
也同样只能使用不能重载。
使用final关键字如果编译器能够在编译阶段确定某变量的值则编译器就会把该变量当做编译期常量来使用,如果需要在运行时确定(譬如方法调用)则
编译器就不会优化相关代码;将类、方法、变量声明为final能够提高性能,这
的。 样JVM就有机会进行估计并进行优化;接口中的变量都是public sta c final的。
的。
finally用来在异常处理时提供块来执行任何清除操作,如果抛出一个异常,则相匹配的catch子句就会执行,然后控制就会进入finally块。
块。
finalize是一个方法名,Java允许使用finalize()方法在垃圾收集器将对象从
内存中清除出去之前做必要的清理工作,这个方法是由垃圾收集器在确定这个
对象没有被引用时对这个对象调用的,它是在Object类中定义的,因此所有的类都继承了它,子类覆盖finalize()方法以整理系统资源或者执行其他清理工作,finalize()方法在垃圾收集器删除对象之前对这个对象调用的。
方法在垃圾收集器删除对象之前对这个对象调用的。
3、Java中hashCode()的作用
的作用
hashCode()的作用是为了提高在散列结构存储中查的效率,在线性表中没有作用;
有作用;
只有每个对象的hash码尽可能不同才能保证散列的存取性能,事实上Object类提供的默认实现确实保证每个对象的hash码不同(在对象的内存地址
码)。
基础上经过特定算法返回一个hash码)。
在Java有些集合类(HashSet)中要想保证元素不重复可以在每增加一个元素就通过对象的equals方法比较一次,那么当元素很多时后添加到集合中的元素比较的次数就非常多了,会大大降低效率。
素比较的次数就非常多了,会大大降低效率。
于是Java采用了哈希表的原理,这样当集合要添加新的元素时会先调用这个元素的hashCode方法就一下子能定位到它应该放置的物理位置上(实际可能并不是),如果这个位置上没有元素则它就可以直
接存储在这个位置上而不用再进行任何比较了,如果这个位置上已经有元素了则就调用它的equals方法与新元素进行比较,相同的话就不存,不相同就散列其它的地址,这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次,而hashCode的值对于每个对象实例来说是一个固定值。4、抽象类(abstract class)和接口)有什么区别
(interface)有什么区别
含有abstract修饰符的class为抽象类,abstract类不能创建实例对象,含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。
象的。
abstract class类中定义的抽象方法必须在具体的子类中实现,所以不能有抽象构造方法或抽象静态方法,如果子类没有实现抽象父类中的所有抽象方法则子类也必须定义为abstract类型。
类型。
对于接口可以说是抽象类的一种特例,接口中的所有方法都必须是抽象的(接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为publicsta c final)。
)。
)。
具体的区别如下:
具体的区别如下:
抽象类可以有构造方法;接口中不能有构造方法。
抽象类可以有构造方法;接口中不能有构造方法。
抽象类中可以有普通成员变量或者常量或者静态变量;接口中没有普通成
)。
员变量和静态变量,只能是常量(默认修饰符为publci sta c final)。
抽象类中可以包含非抽象的普通方法和抽象方法及静态方法;接口中的所有方法必须都是抽象的,不能有非抽象的普通方法和静态方法(默认修饰符为publicabstract)。
)。
抽象类中的抽象方法访问类型可以是public、protected的;接口中的抽象方法只能是public的(默认修饰符为public abstract)。一个子类可以实现多个接口,但只能继承一个抽象类。
接口,但只能继承一个抽象类。
5、为什么ArrayList的增加或删除操作相对来说效率比较低
的增加或删除操作相对来说效率比较低 ArrayList在小于扩容容量的情况下其实增加操作效率是非常高的,在涉及扩容的情况下添加操作效率确实低,删除操作需要移位拷贝,效率是低点。
因为ArrayList中增加(扩容)或者是删除元素要调用System.arrayCopy这种效率很低的方法进行处理,所以如果遇到了数据量略大且需要频繁插入或删除的操作效率就比较低了,具体可查看ArrayList的add和remove方法实现,但是ArrayList频繁访问元素的效率是非常高的,因此遇到类似场景我们应该尽可进行替代效率会高一些。
能使用LinkedList进行替代效率会高一些。
6、LinkedList工作原理和实现
工作原理和实现
LinkedList是以双向链表实现,链表无容量限制(但是双向链表本身需要消耗额外的链表指针空间来操作),其内部主要成员为first和last两个Node节点,在每次修改列表时用来指引当前双向链表的首尾部位。
点,在每次修改列表时用来指引当前双向链表的首尾部位。
所以LinkedList不仅仅实现了List接口,还实现了Deque双端队列接口(该接口是Queue队列的子接口),故LinkedList自动具备双端队列的特性,当我们
方法时需要遍历链表将指针移使用下标方式调用列表的get(index)、set(index, e)方法时需要遍历链表将指针移动到位进行访问(会判断index是否大于链表长度的一半决定是首部遍历还是尾
那样进行随机访问。
部遍历,访问的复杂度为O(N/2)),无法像ArrayList那样进行随机访问。
(如果i>数组大小的一半,会从末尾移起),只有在链表两头的操作(譬如add()、addFirst()、removeLast()或用在iterator()上的remove()操作)才不需要进行遍历寻定位。具体感兴趣可以去看下LinkedList的源码。
的源码。
7、介绍HashMap的底层原理
的底层原理
所以HashMap的数据结构是数组和链表的结合,此外HashMap中key和value都允许为null,key为null的键值对永远都放在以table[0]为头结点的链表中。
中。
之所以HashMap这么设计的实质是由于数组存储区间是连续的,占用内存严重,故空间复杂度大,但二分查时间复杂度小(O(1)),所以寻址容易而插入和删除困难;而链表存储区间离散,占用内存比较宽松,故空间复杂度小,
),所以寻址困难而插入和删除容易;
但时间复杂度大(O(N)),所以寻址困难而插入和删除容易;
所以就产生了一种新的数据结构叫做哈希表,哈希表既满足数据的查方便,同时不占用太多的内容空间,使用也十分方便,哈希表有多种不同的实现采用的是链表的数组实现方式。
方法,HashMap采用的是链表的数组实现方式。
对于JDK 1.8开始HashMap实现原理变成了数组+链表+红黑树的结构,数组链表部分基本不变,红黑树是为了解决哈希碰撞后链表索引效率的问题,所
个时就会将链表变为红黑树。
以在JDK 1.8中当链表的节点大于8个时就会将链表变为红黑树。
区别是JDK 1.8以前碰撞节点会在链表头部插入,而JDK 1.8开始碰撞节点会在链表尾部插入,对于扩容操作后的节点转移JDK 1.8以前转移前后链表顺序会倒置,而JDK 1.8中依然保持原序。
中依然保持原序。
8、Hashtable与HashMap的区别
的区别
Hashtable算是一个过时的集合类,因为JDK1.5中提供的ConcurrentHashMap是HashTable的替代品,其扩展性比HashTable更好。由于HashMap和Hashtable都实现了Map接口,所以其主要的区别如下:
接口,所以其主要的区别如下: HashMap是非synchronized的,而Hashtable是synchronized的。
的。
HashMap可以接受null的键和值,而Hashtable的key与value均不能为null值。
值。
HashMap的迭代器Iterator是fail-fast机制的,而Hashtable的Enumerator
机制的(历史原因)。
迭代器不是fail-fast机制的(历史原因)。
单线程情况下使用HashMap性能要比Hashtable好,因为HashMap是没有同步操作的。
同步操作的。
Hashtable继承自Dic onary类且实现了Map接口,而HashMap继承自AbstractMap类且实现了Map接口。
接口。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论