下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Java初级面试题及答案1、Java中的重载与重写有什么区别重载(Overload)是让类以统一的方式处理不同类型数据的一种手段,实质表现 就是多个具有不同的参数个数或者类型的同名函数(返回值类型可随意,不能以返回 类型作为重载函数的区分标准)同时存在于同一个类中,是一个类中多态性的一种表 现(调用方法时通过传递不同参数个数和参数类型来决定具体使用哪个方法的多态 性)。重写(Override)是父类与子类之间的多态性,实质是对父类的函数进行重新定 义,如果在子类中定义某方法与其父类有相同的名称和参数则该方法被重写,不过子 类函数的访问修饰权限不能小于父类的;若子类中的方法与父类中的某一方法具有
2、相 同的方法名、 返回类型和参数表,则新方法将覆盖原有的方法,如需父类中原有的方 法则可使用super关键字。重载:必须具有不同的参数列表;可以有不同的返回类型;可以有不同的访问修饰符;可以抛出不同的异常。重写:参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载;返回类 型必须一直与被重写的方法相同,否则不能称其为重写而是重载;访问修饰符的限制 一定要大于等于被重写方法的访问修饰符;重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异 常。重载与重写是Java多态性的不同表现,重写是父类与子类之间多态性的表 现, 在运行时起作用(动态多态性,譬如实现动态绑定),而
3、重载是一个类中多态性的表现,在编译时起作用(静态多态性,譬如实现静态绑定)。2、Java中 finals finally、finalize 的区别final是一个修饰符,如果一个类被声明为final则其不能再派生出新的子 类,所 以一个类不能既被声明为abstract又被声明为final的;将变量或方法声明为final 可以保证它们在使用中不被改变(对于对象变量来说其引用不可变,即不能再指向其 他的对象,但是对象的值可变),被声明为final的变量必须在声明时给定初值,而 在以后的引用中只能读取不可修改,被声明为final的方法也同样只能使用不能重 载。使用final关键字如果编译器能够在编译
4、阶段确定某变量的值则编译器就会把该 变量当做编译期常量来使用,如果需要在运行时确定(譬如方法调用)则编译器就不 会优化相关代码;将类、方法' 变量声明为final能够提高性能,这样JVM就有机会 进行估计并进行优化;接口中的变量都是public static万nal的。Maliy用来在异常处理时提供块来执行任何清除操作,如果抛出一个异常,则相 匹配的catch子句就会执行,然后控制就会进入finally块。万nalize是一个方法名,Java允许使用finalize ()方法在垃圾收集器将对象从内 存中清除出去之前做必要的清理工作,这个方法是由垃圾收集器在确定这个对象没有 被引用时对这
5、个对象调用的,它是在Object类中定义的,因此所有的类都继承了 它,子类覆盖fin alize ()方法以整理系统资源或者执行其他清理工作,fin alize () 方法在垃圾收集器删除对象之前对这个对象调用的。3、Java 中 hashCode (的作用hashCode (的作用是为了提高在散列结构存储中查找的效率,在线性表中没有 作用;只有每个对象的hash码尽可能不同才能保证散列的存取性能,事实上Object类 提供的默认实现确实保证每个对象的hash码不同(在对象的内存地址基础上经过特定算法返回一个hash码)。在Java有些集合类(HashSe)中要想保证元素不重复可以在每增加一个
6、元素就 通过对象的equals方法比较一次,那么当元素很多时后添加到集合中的元素比较的 次数就非常多了,会大大降低效率。于是Java采用了哈希表的原理,这样当集合要添加新的元素时会先调用这 个元素的hashCode方法就一下子能定位到它应该放置的物理位置上(实际可能并不是),如果这个位置上没有元素则它就可以直接存储在这个位置上而不用再进行任何比较了,如果这个位置上已经有元素了则就调用它的equals方法与13/11新元素进行比较,相同的话就不存,不相同就散列其它的地址,这样一来实际调用hashCode的值对equals方法的次数就大大降低了,几乎只需要一两次,而于每个对象实例来说是一个定值。4
7、、抽象类(abstract class)和接口(i nteface)有什么区别含有abstract修饰符的class为抽象类,abstract类不能创建实例对象,含有 abstract方法的类必须定义为abstract class abstract class类中的方法不必是抽 象 的。abstract class类中定义的抽象方法必须在具体的子类中实现,所以不能有抽 象 构造方法或抽象静态方法,如果子类没有实现抽象父类中的所有抽象方法则子类也必 须定义为abstract类型。对于接口可以说是抽象类的一种特例,接口中的所有方法都必须是抽象的(接口 中的方法定义默认为public abstrac
8、t类型,接口中的成员变量类型默认为publicstatic final) o具体的区别如下:抽象类可以有构造方法;接口中不能有构造方法。抽象类中可以有普通成员变量或者常量或者静态变量;接口中没有普通成员变量 和静态变量,只能是常量(默认修饰符为publci static final) 0抽象类中可以包含非抽象的普通方法和抽象方法及静态方法;接口中的所有方法 必须都是抽象的,不能有非抽象的普通方法和静态方法(默认修饰符为 publicabstract)。抽象类中的抽象方法访问类型可以是publics protected的;接口中的抽象 方法只能是public的(默认修饰符为public abst
9、ract)。一个子类可以实现多个 接口, 但只能继承一个抽象类。5、为什么ArrayList的增加或删除操作相对来说效率比较低ArrayList在小于扩容容量的情况下其实增加操作效率是非常高的,在涉及 扩容的 情况下添加操作效率确实低,删除操作需要移位拷贝,效率是低点。因为ArrayList中增加(扩容)或者是删除元素要调用System.arrayCopy这种效率很低的方法进行处理,所以如果遇到了数据量略大且需要频繁插入或删除的操 作效率就比较低了,具体可查看ArrayList的add和remove方法实现,但是ArrayList频繁访问元素的效率是非常高的,因此遇到类似场景我们应该尽可能使
10、用LinkedList进行替代效率会高一些。6、LinkedList工作原理和实现LinkedList是以双向链表实现,链表无容量限制(但是双向链表本身需要消 耗额 外的链表指针空间来操作),其内部主要成员为 first和last两个Node节 点,在每次修改列表时用来指引当前双向链表的首尾部位。所以UnkedList不仅仅实现了 List接口,还实现了 Deque双端队列接口(该 接 口是Queue队列的子接口),故LinkedList自动具备双端队列的特性,当我们 使用下 标方式调用列表的get(index)v set(index, e)方法时需要遍历链表将指针移 动到位进行 访问(会判断
11、index是否大于链表长度的一半决定是首部遍历还是尾 部遍历,访问的 复杂度为0(N/2),无法像ArrayList那样进行随机访问。(如果i数组大小的一半,会从末尾移起),只有在链表两头的操作(譬如add。、addFirst()x removeLast()或用在 iterator。上的 remove。操俏才不需要进 行遍历寻找定位。具体感兴趣可以去看下Li nkedList 的源码。7、介绍HashMap的底层原理所以HashMap的数据结构是数组和链表的结合,此外HashMap中key和value 都允许为null, key为null的键值对永远都放在以table。为头结点的链表 中。之所
12、以HashMap这么设计的实质是由于数组存储区间是连续的,占用内存严重,故空间复杂度大,但二分查找时间复杂度小(0(1),所以寻址容易而插入和删除困难;而链表存储区间离散,占用内存比较宽松,故空间复杂度小,但时间 复杂度大(0(N),所以寻址困难而插入和删除容易;所以就产生了一种新的数据结构叫做哈希表,哈希表既满足数据的查找方便,同时 不占用太多的内容空间,使用也十分方便,哈希表有多种不同的实现方法,HashMap 采用的是链表的数组实现方式。对于JDK1.8开始HashMap实现原理变成了数组+链表+红黑树的结构,数组链表部分基本不变,红黑树是为了解决哈希碰撞后链表索引效率的问题,所以在JD
13、K1.8中当链表的节点大于8个时就会将链表变为红黑树。区别是JDK1.8以前碰撞节点会在链表头部插入,而JDK1.8开始碰撞节点会在 链表尾部插入,对于扩容操作后的节点转移JDK 1.8以前转移前后链表顺序 会倒置,而 JDK1.8中依然保持原序。8、Hashtable 与 HashMap 的区别Hashtable算是一个过时的集合类,因为JDK1.5中提供的ConcurrentHashMap是HashTable的替代品,其扩展性比HashTable更好。由于HashMap和Hashtable者B实现了 Map接口,所以其主要的区别如下:HashMap 是非 synchronized 而 Ha
14、shtable 是 synchronized 的。HashMap可以接受null的键和值,而Hashtable的key与value均不能为null 值。HashMap 的迭代器 Iterator 是 fail-fast 机制的,而 Hashtable 的 Enumerator 迭代器不是fail-fast机制的(历史原因)。单线程情况下使用HashMap性能要比Hashtable好,因为HashMap是没有同 步操作的。Hashtable继承自Dictionary类且实现了 Map接口,而HashMap继承自 AbstractMap 类且实现了 Map 接口。HashTable的默认容量为11
15、,而HashMap为16 (安卓中为4)。Hashtable不要求底层数组的容量一定是2的整数次幕,而HashMap则要求一 定为2的整数次幕。Hashtable扩容时将容量变为原来的2倍加1,而HashMap扩容时将容量变 为原 来的2倍。Hashtable W contains 方法,而 HashMap 有 containsKey 禾口 containsValue 方法。9、java类加载器的理解及加载机制class文件路径就是通过java命令运行java程序的步骤就是指定包含main方法的完整类名以及一个classpath类路径,类路径可以有多个,对于直接的class文件的根目录,对于j
16、ar包文件路径是jar包的完整路径,包含jar包名 字;java运行时会根据类的完全限定名寻找并加载,寻找的方式基本就是在系统类和指定的路径中寻找,如果是class文件的根目录则直接查看是否有对应的子目录及文 件,如果是jar包则首先在内存中解压文件,然后再查看是否有对应的类;负责类加 载的类就是ClassLoade类加载器,它的输入是完全限定的类名,输出是Class对 象,java虚拟机中可以安装多个类加载器,系统默认主要有三个类加载器,每个类负 责加载特定位置的类,也可以自定义类加载器,自定 义的加载器必须继承ClassLoade, r 如下:启动类加载器(BootstrapCIassLo
17、ader:)此加载器为虚拟机实现的一部分,不是java语言上层实现的,一般为C+实现,主要负责加载java基础类(譬如<JAVA_HOME>/lib/rtJar,常用的String、List等都位于此包下),启动类加载器 无 法被java程序直接引用。扩展类加载器(ExtensionClassLoader:)此加载器实现类为sun.misc.Launcher$ExtClassLoader 负责力口载 java 的一些扩展类(一般为vJAVA_HOME>/lib/ext目录下的 同包),开发者可直接使用。应用程序类加载器(Applied寸onClassLoader:)此加载器实
18、现类为 sun.misc.Launcher$AppClassLoade, r负责加载应用程序的类,包括自己写的和引 用的第三方类库,即classpath类路径中指定的类,开发者可直接使用,一个程序运 行时会创建一个这个加载器,程序中用到加载器的地方如果没有特殊指定一般都是这 个加载器,所以也被称为System系统类加载器。这三个加载器具备父子委派关系(非继承父子关系),在java中每个类都是由 某个类加载器的实体来载入的,所以在Class类的实体中都会有字段记录载入它的类加载器的实体(当为null时,其指Bootstrap ClassLoade) r ,在java类 加载器中除了引导类加载器(
19、既Bootstrap ClassLoade) r o所有的类加载器都有一个父类加载器(因为他们本身自己就是java类),子 ClassLoade 有一变量 pare nt 指向父 ClassLoade,在子 ClassLoade 加载类 时一般 会先通过父ClassLoadei加载,所以在加载一个class文件时首先会判断是 否已经加 加载一次)。载过了,加载过则直接返回Class 对象(一个类只会被一ClassLoader没加载过则先让父ClassLoader去加载,如果加载成功返回得到的Class对 象,父没有加载成功则尝试自己加载,自己加载不成功则抛出 ClassNotFoundExce
20、ption整个加载流程就是双亲委派模型,即优先让父ClassLoade 加载;双亲委派可以从优先级的策略上避免Java类库被覆盖的问题。例如类java.Iong.Object存放在rt.jar中,无论哪个类加载器要加载这个类最终都 会委派给启动类加载器进行加载,因此 Object类在程序的各种类加载器环 境中都是同一个类,相反如果我们自己写了一个类名为java。ng.Object且放在了程序的classpath中,那系统中将会出现多个不同的 Object类,java类型体系 中最基础的行为也无法保证,所以一般遵循双亲委派的加载器就不会存在这个问题。类加载机制中的双亲委派模型只是一般情况下的机制
21、,有些时候我们可以自定义 加载顺序(不建议)就不用遵守双亲委派模型了,同时以java开头的类也不能被自定义类加载器加载,这是java安全机制保证的;ClassLoadeL般是系统提供的,不需要自己实现,不过通过自定义ClassLoade 可以实现一些灵活强大的功能,譬如热部署(不重启Java程序的情况下动态替换类实现)' 应用的模块化和隔离化(不同ClassLoadei可以加载相同的类,但是互相隔离互不影响,tomcat就是利用这个特性管理多web应用的)、 灵活加载等,通过自定义类加载器我们可以加载其它位置的类或jar,自定义类加载器主要步骤为继承java.lang.ClassLoa
22、de然后重写父类的findClass方之所以一般只重写这一个方法是因为JDK已经在loadClass方法中帮我们实 现 了 ClassLoade搜索类的算法,当在loadClass方法中搜索不到类时loadClass方法会 主动调用findClass方法来搜索类,所以我们只需重写该方法即可,如没有特殊的要 求,一般不建议重写loadClass搜索类的算法。JVM在判定两个Class是否相同时不仅会判断两个类名是否相同而且会判断是 否由同一个类加载器实例加载的,只有两者同时满足的情况下JVM才认为这两个Class是相同的,就算两个Class是同一份class字节码文件,如果被两个不同 的Clas
23、sLoadei实例所加载JVM也会认为它们是两个不同Class而对于JVM来说它们是两个不同的实例对象,但它们确实是同一份字节码文 件,当试图将这个Class实例生成具体的对象进行转换时就会抛运行时异常java.la ng.ClassCaseExcepti。提示这是两个不同的类型。此外一ClassLoade创 建时如果没有指定pare nt贝ij pare nt默认就是AppClassLoadeo10、Java中sleep。与wait()方法的区别sleep。方法使当前线程进入停滞状态(阻塞当前线程),让出CUP的使用,目的 是不让当前线程独自霸占该进程所获的CPU资源。该方法是Thread类
24、的静态方法,当在一个synchronized块中调用sleep。方法时,线程虽然休眠了,但 是其占用的锁并没有被释放;当sleep。休眠时间期满后,该线程不一定会立即执行,因为其它线程可能正在运行而且没有被调度为放弃执行,除非此线程具 有更高的优先级。wait()方法是Object类的,当一个线程执行到wait()方法时就进入到一个和 该对 象相关的等待池中,同时释放对象的锁(对于waWlong timeout)方法来说是暂时释放 锁,因为超时时间到后还需要返还对象锁),其他线程可以访问。wait()使用noMfy()或 no惮yAII()或者指定睡眠时间来唤醒当前等待池中的线程。wait。必
25、须放在 synchronized块中使用,否则会在运行时抛出lllegalMonitorStateException异常。由此可以看出它们之间的区别如下:sleep。不释放同步锁,wait()释放同步锁。sleep(milliseco nds)可以用时间指定来使他自动醒过来,如果时间没到则只能调用inteireput()方法来强行打断(不建议,会抛出InterruptedException ),而wait。可以用not1y()直接唤起。sleep。是Thread的静态方法,而wait()是Object的方法。wait。、notify。、notifyAII()方法只能在同步控制方法或者同步控制块
26、里面使用, 而sleep。方法可以在任何地方使用。11、对 ClassLoaderl 的理解ClassLoaderl的作用是根据一个指定的类名称找到或者生成其对应的字节代码, 然后把字节码转换成一个Java类(即java.Iang.Class实例),除此之外还负 责加载 Java应用所需的资源' Native lib库等。Java的类加载器大致可以分成系统类加载器和应用开发自定义类加载器。系统 类加载器主要有如下几个:引导类加载器(bootstrap class loader):用来加载Java核心库,是虚拟机中用原 生代码实现的,没有继承自ClassLoadeo扩展类加载器(extensions class loader :用来加载Java的扩展库,虚拟机 的实 现会提供一个默认的扩展库目录,该类加载器在此目录里面查找并加载Java类。系统类力口载器(systemclassloade):用来加载应用类路径(CLASSPATH下的class,一般来说Java应用的类都是由它来完成加载的,可 以通 过 ClassLoader.getSystemClassLoade 来获取它。除了引导类加载器之外,所有的其他类加载器都有一个父类加载器(可以通过 ClassLoade的getParent ()方法得到)。系统类加载器的父类加载器是扩展类加载 器,而扩展类加载器的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学语文中国美食教案设计
- 小鸟、小鸟(教学设计)花城版音乐五年级下册
- 2026中国食品加工机械研发行业市场深度调研及投资前景分析
- 高中体育 运动中腹痛教案
- 2026圣文森特和格林纳丁斯商业服务平台竞争分析与发展评估
- 2026青少年运动保护装备市场细分与产品开发趋势预测
- 2026中国智慧餐饮业市场深度调研及发展趋势与投资前景预测研究报告
- 2026中国时尚设计行业潮流趋势现状及文化衍生品发展
- 2026汽车后市场服务模式研究及车联网技术应用推广方案
- 2026年青海省注册国际投资分析师(CIIA)考试(试卷一)综合训练题库
- 2025-2026学年北京市朝阳区高一(下)期末考试物化学卷(含答案)
- 江安县年产5000吨碳纳米管和3.6万吨CNT导电浆料项目报告表
- 2025年江苏省直机关公开遴选公务员笔试题及答案解析
- 静脉输液护理技术操作规范
- 护理沟通:有效沟通技巧培训
- 2026年建信金科测试题及答案
- 初中语文学考合一知识清单·兰州专版
- 热电站锅炉水循环计算书
- 基层党务干部培训班测试题及答案
- 2025年杨浦卫健委事业单位考试及答案
- 翡翠鉴定培训课件
评论
0/150
提交评论