Java工程师常见面试题集锦(一)互联网人必看!(附答案及视频教程,持续更新)

大牛也怕面试题,尤其是基础题,在面试中如果出现一两题回答不准确很有可能你就被拒之门外了。CSDN学院年终倾情奉献,海量面试题(带答案)免费分享,帮助大家顺利过关。

面试题将会持续更新,今天先跟大家分享10道Java基础相关的面试题。

如果觉得文字学习较慢,也可以跟着老师一起视频学习:

Java面试题视频学习链接:https://edu.csdn.net/course/detail/10533

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面试题视频学习链接:https://edu.csdn.net/course/detail/10533

 

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面试题视频学习链接:https://edu.csdn.net/course/detail/10533

你可能感兴趣的:(CSDN学院【面试题】,Java工程师常见面试题集锦)