[聚合文章] IT程序员重点收藏的java面试知识(二)

程序员 2017-06-03 18 阅读

本人从事IT行业10余年,以下是本人在招java开发岗位时,会经常问到的一些知识点,希望给正在找工作或者准备跳槽的同学一点指导,希望看到此文章的同学都能找到一份理想的工作:

1、反射获取字节码对象方式、创建对象的两种方式

获取字节码方式三种:

(1)类名.class,例如:System.class

(2)对象.getClass(),例如:new Date().getClass();

(3)Class.forName("类名"),例如:Class.forName("java.util.Date");

创建对象的两种方式:

(1)直接用字节码创建对象,只能调用默认的构造方法:字节码.newInstance();

(2)获取构造方法Constructor,然后调用构造方法创建,可以通过参数不同调用不同的构造方式

2、对匿名内部类的理解

匿名内部类其实是内部类的简写形式。

内部类是定义在类中的类,就好比我们人类,我们人类都有心脏,而心脏又有自己独特组成,可以把心脏也抽象成一个类。

这个心脏类就是人类的内部类。如果要研究某一种心脏疾病,需要一个实例时,我们不需要知道这个患病的心脏到底是谁的,那找到的这个就是匿名的。

匿名内部类必须要继承一个类或实现一个接口,在使用时直接父类或接口的名称创建了一个子类对象并实现其中的方法,匿名内部类其实是一个匿名的子类对象。

3、什么是暴力反射

我们知道java的特性之一就是封装,将对象的属性和具体实现隐藏起来,只对外提供公共方法访问,private修饰的内部属性和方法对我们是不可见的。

我们通过正常的方法是无法获取以及修改的,可是通过反射却可以强制获取并做一些修改,这就破坏了封装性,这就是所谓的暴力反射

4、IO体系

字节流InputStream/OutputStream

|--FileInputStream/FileOutputStream:文件字节流,用于文件的读写操作

|--BufferedInputStream/BufferedOutputStream:加缓冲区的字节流,用于提高效率

字符流Reader/Writer

|--FileReader/FileWriter:文件字符流,用于文本文件的读写操作

|--BufferedReader/BufferedWrite:加缓冲区的字符流,用于提高效率

转换流InputStreamReader/OutputStreamWriter:是字节流和字符流之间的桥梁

配置文件Properties

5、怎么理解反射,反射的应用

反射就是把Java类中的各种成分映射成相应的Java类。

一般情况下我们要解决某个问题,先找到相关的类,创建该类的对象,然后通过该对象调用对应的方法来解决问题。

反射是一个正好相反的过程,开始可能并没有类可以解决这个问题,而我们却先用一个当时可能并不存在的方法解决了这个问题,后来才有的这个类。

这其实就是框架的原理,现有的框架再有的解决问题的类。框架描述了整体,制订了功能方法的规范,具体的实现之后按照这个规范编写。这些都需要靠反射来完成。

使用框架有良好的扩展性,某部分功能的优化不需要涉及程序整体,只需要修改特定的部分就好了,然后通过配置文件,获取对应的类名,就可以了。

6、集合体系

|--Collection

|--List:元素是有序的,元素允许重复,因为该集合体系都具有索引

|--ArrayList:底层数据结构是数组,查询速度快,增删操作较慢,线程不同步

|--LinkedList:底层数据结构是链表,查询效率较低,增删操作快,线程不同步

|--Vector:功能同ArrayList类似,底层也是数组,不同是线程是同步的,效率较低

|--Set:元素是无序的,元素不允许重复,底层用到了Map

|--HashSet:底层hash表,存储的对象最好复写hashCode和equals方法,保证元素不会重复

|--TreeSet:底层二叉树,存储的对象具备比较性,有两种方法

|--Map:数据是以键值对的形式存储的,有的元素存在映射关系就可以使用该集合,元素不允许重复

|--HashMap:允许有null键或值,线程不同步

|--TreeMap

|--HashTable:类似HashMap,不允许有null键或值,线程同步

7、局部变量和成员变量区别

成员变量:作用于整个类中,随对象存储在堆内存中,生命周期跟对象一样

局部变量:作用于方法或语句中,方法或语句结束则生命周期结束,存放在栈内存中。

8、线程的创建方式,进程线程的理解

两种:继承Thread或实现Runnable

进程是一个执行中的程序,每一个程序都至少有一个执行顺序,该顺序是一个路径,或者叫一个控制单元。

线程是进程中的一个独立的控制单元,线程在控制着进程的执行。

9、数组和集合的区别

数组可以存储基本数据类型和对象,它是一个线性的序列,可以快速的访问其中的元素。数组创建之后,容量就固定了,而且在其生命周期里是不能改变的

集合只用于存储对象,集合的长度是可变的,集合可以存储不同类型的对象。集合的长度并不是固定的,可以便捷的添加删除。能够更加便捷的操作元素,功能更加强大

10、同步函数与同步代码块的区别

它们的作用都是封装多条操作共享数据的语句,只能让一个线程都执行完,在执行过程中,其他线程不可参与进来。

同步代码块:位置比较灵活,封装了操作共享数据的语句,多个线程中只有持有锁的才可以操作共享数据,需要指定一个对象作为锁

同步方法:声明方法时加synchronized关键字修饰,同步函数使用的锁是this,持有锁的线程调用这个方法时其他线程无法调用。

Java学习交流群282711949:

一个程序员学习平台分享给你们,让你在实践中积累经验掌握原理。主要方向是JAVA工程师。如果你想拿高薪,想突破瓶颈,想跟别人竞争能取得优势的,想进BAT但是有担心面试不过的,可以加我的Java学习交流群:282711949

注:加群要求

1、大学学习的是Java相关专业,毕业后面试受挫,找不到对口工作可以

2、在公司待久了,现在过得很安逸,但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的

3、参加过线下培训后,知识点掌握不够深刻,就业困难,想继续深造

4、已经在Java相关部门上班的在职人员,对自身职业规划不清晰,混日子的

5、有一定的C语言基础,接触过java开发,想转行的

小号勿扰,不喜勿加

以下是针对0-3年从事java开发的同学的一个学习线路图,有兴趣的请自己保存,高清图群文件可以下载:


注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。