Java⼯程师常见⾯试题集锦
Java⼯程师常见⾯试题集锦(⼀)互联⽹⼈必看!(附答案及视频教程,持续更新)2019年01⽉02⽇ 14:01:14 阅读数:653
⼤⽜也怕⾯试题,尤其是基础题,在⾯试中如果出现⼀两题回答不准确很有可能你就被拒之门外了。CSDN学院年终倾情奉献,海量⾯试题(带答案)免费分享,帮助⼤家顺利过关。
⾯试题将会持续更新,今天先跟⼤家分享10道Java基础相关的⾯试题。
如果觉得⽂字学习较慢,也可以跟着⽼师⼀起视频学习:
Java⾯试题视频学习链接:
1、⾯向对象的特征有哪些⽅⾯?
⾯向对象的特征主要有以下⼏个⽅⾯:
1)抽象:抽象就是忽略⼀个主题中与当前⽬标⽆关的那些⽅⾯,以便更充分地 注意与当前⽬标有关的⽅⾯。抽象并不打算了解全部问题,⽽只是选择其中的⼀ 部分,暂时不⽤部分细节。
抽象包括两个⽅⾯:⼀是过程抽象,⼆是数据抽象。
2)继承:继承是⼀种联结类的层次模型,并且允许和⿎励类的重⽤,它提供了⼀种明确表述共性的⽅法。对象的⼀个新类可以从现有的类中派⽣,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派⽣类(⼦类),⽽原始类称为新类的基类(⽗类)。派⽣类可以从它的基类那⾥继承⽅法和实例变量 ,并且类可以修改或增加新的⽅法使之更适合特殊的需要。
3)封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界⾯ 。 ⾯向对象计算始于这个基本概念,即现实世界可以被描绘成⼀系列完全⾃治封装的对象,这些对象通过⼀个受保护的接⼝访问其他对象。
4)多态性:多态性是指允许不同类的对象对同⼀消息作出响应。多态性包括参数化多态性和包含多态性。多态性语⾔具有灵活、抽象、⾏为共享、代码共享的 优势,很好的解决了应⽤程序函数同名问题。
2、Java多态的具体体现
⾯向对象编程有四个特征:抽象,封装,继承,多态。多态有四种体现形式:
1)接⼝和接⼝的继承;
2) 类和类的继承;
3)重载;
4) 重写。
其中重载和重写为核⼼。
重载:重载发⽣在同⼀个类中,在该类中如果存在多个同名⽅法,但是⽅法的参数类型和个数不⼀样,那么说明该⽅法被重载了;
重写:重写发⽣在⼦类继承⽗类的关系中,⽗类中的⽅法被⼦类继承,⽅法名、返回值类型、参数完全⼀样,但是⽅法体不⼀样,那么说明⽗类中的该⽅法被⼦类重写了。
3、什么时候⽤ assert?
答:assertion(断⾔)在软件开发中是⼀种常⽤的调试⽅式,很多开发语⾔中都⽀持这种机制。
⼀般来说,assertion ⽤于保证程序最基本、关键的正确性。 assertion 检查通常在开发和测试时开启。为了提⾼性能,在软件发布
后,assertion 检查通常是关闭的。在实现中,断⾔是⼀个包含布尔表达式的语句, 在执⾏这个语句时假定该表达式为 true;如果表达式计算为 false,那么系统 会报告⼀个 Assertionerror。 断⾔⽤于调试⽬的: assert(a > 0); // throws an Assertionerror if a <= 0 断⾔可以有两种形式: assert Expression1 ;assert Expression1 : Expression2 , Expression1 应该总是产⽣⼀个布尔值,Expression2 可以是得出⼀个值的任意表达式;这个值⽤于⽣成显⽰更多调试信息的 String 消息。
断⾔在默认情况下是禁⽤的,要在编译时启⽤断⾔,需使⽤ source 1.4 标记 : javac -source 1.4 Test.java 。要在运⾏时启⽤断⾔,可使⽤ -enableassertions 或者 -ea 标记。 要在运⾏时选择禁⽤断⾔,可使⽤ -da 或者 -disableassertions 标记。 要在系统类中启⽤断⾔,可使⽤ -esa 或者 -dsa 标记。还可以在包的基础上启⽤或者禁⽤断⾔。可以在预计正常情况下不会到达的任何位置上放置断⾔。断⾔可以⽤于验证传递给私有⽅法的参数。
不过,断⾔不应该⽤于验证传递给公有⽅法的参数,因为不管是否启⽤了断⾔,公有⽅法都必须检查其参数。不过,既可以在公有⽅法中,也可以在⾮公有⽅法中利⽤断⾔测试后置条件。另外,断⾔不应该以任何⽅式改变程序的状态。
4、String、StringBuffer 、StringBuilder 的区别:
String:字符串常量,不可变,使⽤字符串拼接时是不同的两个空间;
StringBuffer:字符串变量,可变,线程安全,字符串拼接直接在字符串后追加;
StringBuilder:字符串变量,可变,⾮线程安全,字符串拼接直接在字符串后追加;
1)StringBuilder执⾏效率⾼于StringBuffer⾼于String;
2)String是⼀个常量,是不可变的,所以对于每⼀次+=赋值都会创建⼀个新的对象,StringBuffer和StringBuilder都是可变的,当进⾏字符串拼接时采⽤append⽅法,在原来的基础上进⾏追加,所以性能⽐String要⾼,⼜因为StringBuffer是线程安全的⽽StringBuilder是线程⾮安全的,所以StringBuilder的效率⾼于StringBuffer;
3)对于⼤数据量的字符串的拼接,采⽤StringBuffer,StringBuilder。
5、数组有没有length()⽅法?String 有没有length()⽅法?
答:数组没有length()⽅法,有length的属性。String有length()⽅法。JavaScript中,获得字符串的长度是通过length属性得到的,这⼀点容易和Java混淆。
题库及视频陆续更新,如有需要,请继续关注~
Java⾯试题视频学习链接:
6、char 型变量中能不能存储⼀个中⽂汉字?为什么?
答:char类型可以存储⼀个中⽂汉字,因为Java中使⽤的编码是Unicode(不选择任何特定的编码,直接使⽤字符在字符集中的编号,这是统⼀的唯⼀⽅法),⼀个char类型占2个字节(16bit),所以放⼀个中⽂是没问题的。
7、Java中如何实现序列化,有什么意义?
序列化就是⼀种⽤来处理对象流的机制,所谓对象流也就是将对象的内容进⾏流化,可以对流化后的对象进⾏读写操作,也可将流化后的对象传输于⽹络之间。序列化是为了解决对象流读写操作时可能引发的问题(如果不进⾏序列化可能会存在数据乱序的问题)。
要实现序列化,需要让⼀个类实现Serializable接⼝,该接⼝是⼀个标识性接⼝,标注该类对象是可被序列化的,然后使⽤⼀个输出流来构造⼀个对象输出流并通过writeObject(Object obj)⽅法就可以将实现对象写出(即保存其状态);如果需要反序列化则可以⽤⼀个输⼊流建⽴对象输⼊流,然后通过readObject⽅法从流中读取对象。
8、Vector与ArrayList
1)Vector是线程同步的,所以它也是线程安全的,⽽Arraylist是线程异步的,是不安全的。如果不考
虑到线程的安全因素,⼀般⽤Arraylist效率⽐较⾼。
2)如果集合中的元素的数⽬⼤于⽬前集合数组的长度时,Vector增长率为⽬前数组长度的100%,⽽Arraylist增长率为⽬前数组长度的50%。如果在集合中使⽤数据量⽐较⼤的数据,⽤Vector有⼀定的优势。
3)如果查⼀个指定位置的数据,Vector和Arraylist使⽤的时间是相同的,如果频繁的访问数据,这个时候使⽤Vector和Arraylist都可以。⽽如果移动⼀个指定位置会导致后⾯的元素都发⽣移动,这个时候就应该考虑到使⽤linklist,因为它移动⼀个指定位置的数据时其它元素不移动。
ArrayList 和Vector是采⽤数组⽅式存储数据,此数组元素数⼤于实际存储的数据以便增加和插⼊元素,都允许直接序号索引元素,但是插⼊数据要涉及到数组元素移动等内存操作,所以索引数据快,插⼊数据慢,Vector由于使⽤了synchronized⽅法(线程安全)所以性能上⽐ArrayList要差,LinkedList使⽤双向链表实现存储,按序号索引数据需要进⾏向前或向后遍历,但是插⼊数据时只需要记录本项的前后项即可,所以插⼊数度较快。
9、Arraylist和Linkedlist
1)ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2)对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3)对于新增和删除操作add和remove,LinedList⽐较占优势,因为ArrayList要移动数据。 这⼀点要看实际情况的,若只对单条数据插⼊或删除,ArrayList的速度反⽽优于LinkedList。但若是批量随机的插⼊删除数据,LinkedList的速度⼤⼤优于ArrayList. 因为ArrayList每插⼊⼀条数据,要移动插⼊点及之后的所有数据。
10、HashMap与TreeMap
1)HashMap通过hashcode对其内容进⾏快速查,⽽TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到⼀个有序的结果你就应该使⽤TreeMap(HashMap中元素的排列顺序是不固定的)。
2)在Map中插⼊、删除和定位元素,HashMap是最好的选择。但如果您要按⾃然顺序或⾃定义顺序遍历键,那么TreeMap会更好。使⽤HashMap要求添加的键类明确定义了hashCode()和 equals()的实现。
两个map中的元素⼀样,但顺序不⼀样,导致hashCode()不⼀样。
同样做测试:
在HashMap中,同样的值的map,顺序不同,equals时,false;
⽽在treeMap中,同样的值的map,顺序不同,equals时,true;
说明,treeMap在equals( )时是整理顺序了的。java面向对象的特征有哪些方面
11.HashTable与HashMap的区别
1)同步性:Hashtable是线程安全的,也就是说是同步的,⽽HashMap是线程序不安全的,不是同步的。
2)HashMap允许存在⼀个为null的key,多个为null的value 。
3)hashtable的key和value都不允许为null。
12.如何解决HashMap的线程不安全问题
1)替换成Hashtable,Hashtable通过对整个表上锁实现线程安全,因此效率⽐较低
2)使⽤Collections类的synchronizedMap⽅法包装⼀下。⽅法如下:
public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) 返回由指定映射⽀持的同步(线程安全的)映射
3)使⽤ConcurrentHashMap,它使⽤分段锁来保证线程安全
通过前两种⽅式获得的线程安全的HashMap在读写数据的时候会对整个容器上锁,⽽ConcurrentHashMap并不需要对整个容器上锁,它只需要锁住要修改的部分就⾏了
13.Collection 和 Collections 的区别
Collection 是 java.util 下的接⼝,它是各种集合的⽗接⼝,继承于它的 接⼝主要有 Set 和 List;Collections 是个 java.util 下的类,是针对集合的 帮助类,提供⼀系列静态⽅法实现对各种集合的搜索、排序、线程安全化等操作 。
Java⼯程师常见⾯试题集锦(⼀)互联⽹⼈必看!
如果觉得⽂字学习较慢,也可以跟着⽼师⼀起视频学习:
Java⾯试题视频学习链接:
14. List、Map、Set 三个接⼝,存取元素时,各有什么特点
List 以特定次序来持有元素,可有重复元素。
Set ⽆法拥有重复元素,内部 排序。
Map 保存 key-value 值,value 可多值。
15.Set ⾥的元素是不能重复的,那么⽤什么⽅法来区分重复与否呢? 是⽤==还 是 equals()? 它们有何区别?
Set ⾥的元素是不能重复的,⽤ equals ()⽅法来区分重复与否。
覆盖 equals()⽅法⽤来判断对象的内容是否相同,⽽”==”判断地址是否相等,⽤来 决定引⽤值是否指向同⼀对象。
16.TreeMap和TreeSet在排序时如何⽐较元素?Collections⼯具类中的sort()⽅法如何⽐较元素
TreeSet要求存放的对象所属的类必须实现Comparable接⼝,该接⼝提供了⽐较元素的compareTo()⽅法,当插⼊元素时会回调该⽅法⽐较元素的⼤⼩。 TreeMap要求存放的键值对映射的键必须实现Comparable接⼝从⽽根据键对元素进⾏排序。 Collections⼯具类的sort⽅法有两种重载的
形式,第⼀种要求传⼊的待排序容器中存放的对象⽐较实现Comparable接⼝以实现元素的⽐较;第⼆种不强制性的要求容器中的元素必须可⽐较,但是要求传⼊第⼆个参数,参数是Comparator接⼝的⼦类型(需要重写compare⽅法实现元素的⽐较),相当于⼀个临时定义的排序规则,其实就是是通过接⼝注⼊⽐较元素⼤⼩的算法,也是对回调模式的应⽤。
17.Map集合
实现类:HashMap、Hashtable、LinkedHashMap和TreeMap
HashMap是最常⽤的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。因为键对象不可以重复,所以HashMap最多只允许⼀条记录的键为Null,允许多条记录的值为Null,是⾮同步的。
Hashtable与HashMap类似,是HashMap的线程安全版,它⽀持线程的同步,即任⼀时刻只有⼀个线程能写Hashtable,因此也导致了Hashtale在写⼊时会⽐较慢,它继承⾃Dictionary类,不同的是它不允许记录的键或者值为null,同时效率较低。
ConcurrentHashMap,线程安全,并且锁分离。ConcurrentHashMap内部使⽤段(Segment)来表⽰这些不同的部分,每个段其实就是⼀个⼩的hash table,它们有⾃⼰的锁。只要多个修改操作发⽣在不同的段上,它们就可以并发进⾏。
LinkedHashMap保存了记录的插⼊顺序,在⽤Iteraor遍历LinkedHashMap时,先得到的记录肯定是先插⼊的,在遍历的时候会⽐HashMap慢,有HashMap的全部特性。
TreeMap实现SortMap接⼝,能够把它保存的记录根据键排序,默认是按键值的升序排序(⾃然顺序),也可以指定排序的⽐较器,当⽤Iterator遍历TreeMap时,得到的记录是排过序的。不允许key值为空,⾮同步的。
18.ArrayList扩容机制【必考】
1)发⽣扩容的条件:
根据传⼊的最⼩需要容量minCapacity来和数组的容量长度对⽐,若minCapactity⼤于或等于数组容量,则需要进⾏扩容。(如果实际存储数组是空数组,则最⼩需要容量就是默认容量)
2)实现扩容:
jdk7中采⽤>>位运算,右移动⼀位。 容量相当于扩⼤了1.5倍;
3)举例说明:添加20个元素到ArrayList中
当第⼀次插⼊元素时才分配10(默认)个对象空间。之后扩容会按照1.5倍增长。
也就是当添加第11个数据的时候,Arraylist继续扩容变为10*1.5=15;
当添加第16个数据时,继续扩容变为15 * 1.5 =22个
19.Java 中的异常处理机制的简单原理和应⽤
当 JAVA 程序违反了 JAVA 的语义规则时,JAVA 虚拟机就会将发⽣的错误表 ⽰为⼀个异常。违反语义规则包括 2 种情况。⼀种是JAVA 类库内置的语义检查。 例如数组下标越界,会引发 IndexOutOfBoundsException;访问 null 的对象时会 引发NullPointerException。另⼀种情况就是 JAVA 允许程序员扩展这种语义检 查,程序员可以创建⾃⼰的异常,并⾃由选择在何时⽤ throw 关键字引发异常。 所有的异常都是 java.lang.Thowable 的⼦类。
20.编程题:写⼀个Singleton⽰例
Singleton:在Java中即指单例设计模式,它是软件开发中最常⽤的设计模式之⼀。
单:唯⼀;例:实例,单例设计模式,即某个类在整个系统中只能有⼀个实例对象可被获取和使⽤的代码模式。
例如:代表JVM运⾏环境的Runtime类
要点:⼀是某个类只能有⼀个实例:u构造器私有化;
⼆是它必须⾃⾏创建这个实例:u含有⼀个该类的静态变量来保存这个唯⼀的实例;
三是它必须⾃⾏向整个系统提供这个实例:u对外提供获取该实例对象的⽅式:(1)直接暴露(2)⽤静态变量的get⽅法获取
⼏种常见形式:
1)饿汉式:直接创建对象,不存在线程安全问题
直接实例化饿汉式(简洁直观)
枚举式(最简洁)
静态代码块饿汉式(适合复杂实例化)
2)懒汉式:延迟创建对象
线程不安全(适⽤于单线程)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论