Java工程师常见面试题集锦_java开发工程师应届生面试-程序员宅基地

技术标签: Java面试  java  Java小结  

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

2019年01月02日 14:01:14 阅读数:653

大牛也怕面试题,尤其是基础题,在面试中如果出现一两题回答不准确很有可能你就被拒之门外了。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( )时是整理顺序了的。

 

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工程师常见面试题集锦(一)互联网人必看!

https://blog.csdn.net/CSDNedu/article/details/85602533

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

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

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)懒汉式:延迟创建对象

线程不安全(适用于单线程)

线程安全(适用于多线程)

静态内部类形式(适用于多线程)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/java_2017_csdn/article/details/86544215

智能推荐

容器三把斧之 | cgroup原理与实现_struct list_headtasks;-程序员宅基地

文章浏览阅读1.6k次,点赞5次,收藏12次。前面我们介绍了CGroup的使用与基本概念,接下来将通过分析源码(本文使用的 Linux2.6.25 版本)来介绍CGroup的实现原理。在分析源码前,我们先介绍几个重要的数据结构,因为CGroup就是通过这几个数据结构来控制进程组对各种资源的使用。cgroup结构体前面介绍过,cgroup是用来控制进程组对各种资源的使用,而在内核中,cgroup是通过cgroup结构体来描述的,我们来看看其定义:structcgroup{unsignedlongfla..._struct list_headtasks;

SpringMVC初认识_兔头程序员-程序员宅基地

文章浏览阅读164次。SpringMVCMVC1. 什么是MVC?MVC是一种框架模式,是Model View Controller(模型-视图-控制器)的缩写。Model 模型数据模型,提供要展示的数据,用于封装数据View 视图展示数据Controller 控制器控制模型的数据要在哪一个视图展示2. 作用MVC模式使展示与模型分离,流程控制逻辑、业务逻辑调用与展示分离。最终实现系统的职能分工。3. 优缺点优点耦合性低重用性高生命周期成本低部署快可维护性高有利于软件工程化管理_兔头程序员

Svchost.exe进程详解及Svchost.exe病毒清除方法_svchost.exe -k rpcss-程序员宅基地

文章浏览阅读2.3w次,点赞3次,收藏18次。这几天在宿舍上网的时候其他的舍友反映网络特别的卡。不知道是什么原因。然后我就发现自己的电脑有一个程序,自己走流量而且每秒能达100kb以上对于宿舍8个人共用的一个4M的网线来说已经算是占了好大一部分网速了。在金山流量监控上发现这个程序叫Svchost.exe。这是一个什么程序呢。然后我就尝试禁用。但我发现win7的任务管理器的进程中是找不到这个进程的。然后我通过上网了解了这个进程。 s_svchost.exe -k rpcss

java中修改对象类的数据_Java基础09 类数据与类方法-程序员宅基地

文章浏览阅读728次。我们一直是为了产生对象而定义类(class)的。对象是具有功能的实体,而类是对象的类型分类。这是面向对象的一个基本概念。在继承(inheritance)中,我们将类当做可以拓展的主体,这提高了我们对“类”的认识。类本身还有许多值得讨论的地方。我们将继续深入。static数据成员有一些数据用于表述类的状态。比如Human类,我们可以用“人口”来表示Human类的对象的总数。“人口”直接描述类的状态,..._java中如何用方法来改变一个类的值

hdu 2066:一个人的旅行_输入数据:每组的第一行是三个整数t,s和d,表示有t条路,和去往临近城市高铁站、火车-程序员宅基地

文章浏览阅读448次。草儿决定要在最短的时间去一个自己想去的地方,因为草儿的家在一个小镇上,没有火车经过,所以她只能去邻近的城市坐火车。多组输入数据,每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个,草儿想去的地方有D个;接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time小时;(1=接着的第T+1行有S个数,表示和草儿家相连的城市;接着的第T+2行有D个_输入数据:每组的第一行是三个整数t,s和d,表示有t条路,和去往临近城市高铁站、火车

java统计字符串中每个字符出现的次数_java string 统计某个字符出现的次数-程序员宅基地

文章浏览阅读6.3w次,点赞33次,收藏76次。例如String str = “abcaaaefdabbhg”; 统计该字符串中每个字符出现的次数,输出: a====5 b====3 c====1 d====1 e====1 f====1 g====1 h====1方法一: 采用HashMappublic static void count(String str){ //将字符串转化为字符数组_java string 统计某个字符出现的次数

随便推点

python 数据存储方式_数据存储是什么python-程序员宅基地

文章浏览阅读1.9k次。blog.csdn.net/ffblog/article/details/46558051一.序列1.用于存储一系列的数据2.在内存中,序列就是一块用于存放多个值的连续的内存空间如a=[10,20,30,40]存储示意:3.python中序列结构:str,list,tuple,dict,set..._数据存储是什么python

【语音去噪】IIR+FIR滤波器语音信号去噪(含滤波前后对比图)【含Matlab源码 4062期】-程序员宅基地

文章浏览阅读354次,点赞4次,收藏4次。IIR+FIR滤波器语音信号去噪(含滤波前后对比图)完整的代码,包运行;运行操作视频见CSDN资源!适合小白!

Tensorflow-hub[例子解析1]-程序员宅基地

文章浏览阅读364次。0. 引言Tensorflow于1.7之后推出了tensorflow hub,其是一个适合于迁移学习的部分,主要通过将tensorflow的训练好的模型进行模块划分,并可以再次加以利用。不过介于推出不久,目前只有图像的分类和文本的分类以及少量其他模型这里先通过几个简单的例子,来展示该hub的使用流程。1. 一个超简单例子1.1 创建一个Module#该文件名为half_plus_two..._tensorflow hub、py

Linux利用重定向三步搞定请求百度主页源代码_linux socket 访问百度-程序员宅基地

文章浏览阅读1.4k次。Linux利用重定向三步搞定请求百度主页源代码第一步:新建文件描述符,简历与百度通信的socket通道exec 8<> /dev/tcp/www.baidu.com/80命令解释:8:新建的文件描述符<>:既要发送请求,又要接收响应数据/dev/tcp:这个目录看不到,但内核确实有一旦执行该命令,就会新建一个socket连接删除文件描述符:..._linux socket 访问百度

C primer plus(第六版) 第七章答案_第七章单元测试提交作业6. 单选题(2分)下图中哪个点是最小方差点?( )。a点cb-程序员宅基地

文章浏览阅读7.1k次,点赞21次,收藏19次。C primer plus(第六版) 第七章答案/* 第一题 */#include<stdio.h>#define SPACE ' 'int main(void){ int count_space = 0; int count_line_break = 0; int count_others = 0; int ch; printf("Please pu..._第七章单元测试提交作业6. 单选题(2分)下图中哪个点是最小方差点?( )。a点cb

Ubuntu:显存占用及处理_ubuntu root图形界面占显存-程序员宅基地

文章浏览阅读2.7k次。问题在进行深度学习时,显存是一种非常宝贵的资源。但是即便在Ubuntu下,各种各样的系统配置都会不自觉的占用一些显存,导致深度学习难以为继。在本博客中,主要搬运一些查询显存占用原因及处理方法。翻译来源链接https://unix.stackexchange.com/questions/591393/how-to-shift-process-from-gpu-to-cpu-usagehttps://askubuntu.com/questions/1220144/can-somebody-explai_ubuntu root图形界面占显存

推荐文章

热门文章

相关标签