您的位置:首页 > 职场人生

java面试宝典

2015-10-24 12:47 281 查看
AOP的实现原理?

面向切面编程,把散落在程序中的公共部分提取出来,做成切面类,这样的好处在于,代码的可重用,一旦涉及到该功能的需求发生变化,只要修改该代码就行,否则,你要到处修改,如果只要修改1、2处那还可以接受,万一有1000处呢。
AOP底层的东西就是JDK动态代理和CGLIB代理,说白了就是增强类的功能。
最常用的AOP应用在数据库连接以及事务处理上。

数组和链表?

从逻辑结构上看:

1、数组必须是事先固定的长度,不能适应数据动态增删的情况。

2、链表动态地进行存储分配,可以适应数据动态增减的情况,且可以方便地插入、删除数据项

从内存存储上看:

1、静态数组从栈中分配空间,对于程序员方便快速,但是自由度小。

2、链表从堆中分配空间,自由度大但是申请管理比较麻烦

所以在应用上来说,如果需要快速访问数据并且很少或者不插入和删除元素,就选择使用数组; 否则,相反的情况就选择链表实现。

多线程的实现方式,以及区别?

两种方式:继承Thread类  和实现Runnable接口

  区别:

区别来说是考虑java的单继承多实现机制。

对于实现Runnable接口来说,他适合于多个相同程序代码的线程去处理同一资源

可以避免单继承带来的局限

同时它有利于程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。

java的内存机制?

java吧内存划分为两种:一种是栈,一种是堆。

函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈中分配。

堆:它用来存放由new创建的对象和数组。

(在堆中产生了一个数组或者对象之后,还可以在栈中定义一个特殊的变量,让栈中的这个变量取值等于数组或者对象在堆中的首地址,栈中的这个变量就成了数组或者对象的引用变量,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或者对象,引用变量就相当于是为数组或者对象起的一个名称。)

java中常用的内存区域:

1、栈内存:保存所有的对象名称(更准确地说是保存了引用的堆内存空间的地址)

2、堆内存:保存每个对象的具体属性内容。

3、全局数据区:保存static类型的属性。

4、全局代码区:保存所有的方法定义。

jdk,jre,jvm的区别?

它们都是Java编程语言的核心概念。区别在于:JDK是用于开发的而JRE是用来运行Java程序的。

JDK和JRE都包含JVM,从而使我们可以运行Java程序。JVM是Java编程语言的核心并且具有平台独立性。

JDK是Java开发工具包是Java环境的核心组件,并提供编译、调试和运行一个Java程序所需的所有工具。

JVM是Java编程语言的核心。他是Java程序可以一次编写多处执行的根本,它是平台特定的,主要是负责将字节码转换为机器代码。它的虚拟之处在于它提供了一个不依赖底层操作系统和机器硬件的接口。

JRE是JVM的实施实现,它提供运行Java程序的平台。如果你只是想要执行Java程序,你只需安装JRE即可,没有必要安装JDK。

什么是即时编译器(JIT)?

JIT是JVM的一部分,他可以在同一时间编译类似的字节码来优化将字节码转换为机器特定语言的过程相似的字节码,从而将优化字节码转换为机器特定语言的过程,也就减少转换过程所有需要花费的时间。

Java中Overriding和Overloading是什么意思?

Overriding是方法覆盖,也就是子类重新定义父类的方法(必须有相同的方法名,参数列表和返回类型)。

Overloading是重载,是发生在同一个类里面两个或者多个方法的方法名相同但是参数不同(参数的个数、顺序、类型不相同,满足其一即可)的情况。

重载和多态无关,覆盖和多态有关。

构造器Constructor是否可被Override?

不可以被Override(重写),可以被Overload(重载)。

Java支持多继承吗?

不支持多继承,每个类只能继承一个类,但是可以实现多个接口。

接口和抽象类的区别是什么?

区别在于:接口中所有的方法都隐含是抽象的,而抽象类中方法可是抽象的,也可以包含非抽象的方法。

类可以实现多个接口,但是只能继承一个抽象类。

类如果实现一个接口,那就必须实现接口中的所有方法。而继承一个抽象类,可以不用实现里面所有方法(抽象和非抽象),当其中的抽象方法没有全部被实现,那么继承这个抽象类的类必须声明成抽象的。

抽象类Implement接口时,可以不实现其中的方法。

接口中声明的变量默认都是final,而抽象类可以包含非fianl的变量。

接口中成员函数默认都是public,而抽象类成员函数可以使private,protected或者是public。

最后最大的区别在于,接口是绝对抽象的,不可以被实例化,抽象类也不可以被实例化,但是如果抽象类包含了main方法他可以被调用。

(接口中final和abstract不能同时出现,默认的是public abstract)

子类和父类构造函数调用的顺序?

先调用父类的构造函数,后调用子类的构造函数。

显示调用:super(),调用父类的无参构造,super(参数),调用父类的有参构造。

默认调用父类无参构造。

继承中有静态方法时,子类和父类调用的顺序?

先初始化父类静态成员,再初始子类静态成员,然后是父类构造,子类构造。

IOC和DI的区别?

IOC(控制反转)控制指的就是程序相关类之间的依赖关系,传统观念设计中,通常由调用者创建被调用者的实例,然后再Spring中,创建被调用者的工作不再是由调用者完成了,而是由Spring容器完成,依赖关系被反转 了,成为控制反转,目的就是为了获得更好的扩展性和良好的可维护性。

DI(依赖注入)创建被调用者的工作由Spring容器完成,然后注入到调用者,所以被称为依赖注入。控制反转和依赖注入是同一个概念。

Java中final关键字有哪些用法?

修饰类:表示该类不能被继承;

修饰方法:表示方法不能被重写;

修饰变量:表示变量只能一次赋值以后值不能被修改。

14. String, StringBuffer StringBuilder的区别。
答:

String 的长度是不可变的;

StringBuffer的长度是可变的,如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用 String

Buffer,如果最后需要 String,那么使用 StringBuffer的 toString()方法;线程安全;

StringBuilder 是从 JDK 5开始,为StringBuffer该类补充了一个单个线程使用的等价类;通常应该优先使用St

ringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。

 

什么是Java序列化,如何实现Java序列化?

序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的的问题。

序列化的实现:将需要被序列化的类实现Serializable接口,这个接口没有需要实现的方法,Implement Serializable只是为了标注该对象可被序列化,然后使用一个输出流(如FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object object)方法就可以将参数为object的对象写出,要恢复的话则用输入流。

8. Java 中的 HashMap的工作原理是什么?
Java 中的 HashMap是以键值对(key-value)的形式存储元素的。HashMap需要一个hash函数,它使用
has

hCode()和 equals()方法来向集合/从集合添加和检索元素。当调用 put()方法的时候,HashMap会计算
key 的

hash 值,然后把键值对存储在集合中合适的索引上。如果 key已经存在了,value会被更新成新值。HashMap的一些重要的特性是它的容量(capacity),负载因子(load
factor)和扩容极限(threshold resizing)。

 

10、HashMap和HashTable的区别?

相同点就是HashMap和HashTable都是继承自Map接口,所以很多特性都相似。

不同点就是,HashMap允许键和值为null,而HashTable不允许键或值为null。

再就是HashMap是不同步的,是一个单线程环境,而HashTable是同步的,是一个多线程环境

HashMap提供了可供应用迭代的键的集合,HashTable提供了对键的列举。

 

Array和ArrayList的区别。

Array可以包含基本类型和对象类型,ArrayList只能包含对象类型

Array的大小是固定的,ArrayList的大小是动态变化的。

另外ArrayList中提供了更多的方法和特性,比如addAll(),removeAll(),iterator()等等,对于基本类型,集合是自动装箱减少编码工作量,处理固定大小的基本类型时,应该使用Array

 

ArrayList和LinkedList的区别?

ArrayList和LinkedList都是继承List接口,不同点在于,ArrayList是基于索引的数据接口,底层是数组,他可以以O(1)的时间复杂度对元素随机访问。LinkedList是基于元素列表的方式存储他的数据,每一个元素都和他前一个元素和后一个元素链接在一起,所以查找某个元素的  时间复杂度是O(n);

但是相对于增删改操作来说,LinkedList的速度更快,因为添加一个元素的时候,LinkedList不会重新计算大小或者是更新索引。但是LinkedList更占内存,因为他为每一个节点存储了两个引用,一个指向前一个元素一个指向下一个元素。

 

Aop:面向切面编程,是目前软件开发的一个热点,也是spring框架的容器。利用aop可以对业务逻辑各个部分进行隔离,从而使各个业务逻辑之间的耦合度降低,提高程序可重用性,同时提高了开发的效率,主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理。

 

 错误和异常的区别?

error表示系统级的错误和程序不必处理的异常,是恢复不是不可能但是很困难的情况下的一种严重问题:比如内存溢出,不可能指望程序能处理这样的情况;

exception表示需要捕获或者需要程序进行处理的异常,是一种设计或实现问题,也就是说,他表示如果程序运行正常,从不会发生的情况。

java.lang.Error:Throwable的子类,用于标记严重错误。合理的应用程序不应该去try/catch这种错误。绝大多数的错误都是非正常的,就根本不该出现。

java.lang.Exception:Throwable的子类,用于指示一种合理的程序想去catch的条件。即它仅仅是一种程序运行条件,而非严重错误,并且鼓励用户程序去catch它。

Error和RuntimeException及其子类都是未检查的异常,而所有其他的Exception类都是检查的异常。

checked exception:通常是从一个可以恢复的程序中抛出来的,并且最好能够从这种异常中使用程序恢复。比如FileNotFoundException,ParseException等。检查了的异常发生在编译阶段,必须要使用try/catch (throws)否则编译不通过。

  unchecked exception:通常是如果一切正常的话本不该发生的异常,但是的确发生了。发生在运行期,具有不确定性,主要是由于程序的逻辑问题所引起的。比如ArrayIndexOutOfBoundException,ClassCastException等。从语言本身的角度讲,程序不该去catch这类异常,虽然能够从诸如RuntimeException这样的异常中catch

并回复,但是并不鼓励终端程序员这么做,因为完全没有必要。这类错误本身就是bug,应该被修复,出现此类错误时程序就应该立即停止执行。因此,面对Errors和unchecked exception应该让程序自动终止执行,程序员不该做诸如try/catch这样的事情,而是应该查明原因,修改代码逻辑。

RuntimeException:RuntimeException体系包括错误的类型转换、数组越界访问和试图访问空指针等等。处理RuntimeException的原则是:如果出现RuntimeException,那么一定是程序员的错误。例如,可以通过检查数组下标和数组边界来避免数组越界访问异常。其他(IOException等等)checked异常一般是外部错误,例如试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环境中出现的外部错误。

throw和throws的区别?

throw是语句抛出一个异常。
语法:throw (异常对象);

         throw e;

throws是方法可能抛出异常的声明。(用在声明方法时,表示该方法可能要抛出异常)

语法:[(修饰符)](返回值类型)(方法名)([参数列表])[throws(异常类)]{......}

            public void doA(int a) throws Exception1,Exception3{......}

运行时异常与受检异常有何异同?

异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误,只要程序设计得没有问题通常就不会发生。受检异常跟程序运行上下文环境有关,即使程序设计无误,仍然可能因使用的问题引发,Java编译器要求方法必须声明抛出可能发生的受检异常,但是并不要求必须声明抛出未被捕获的运行时异常,异常和继承一样,是面对对象程序设计中经常被滥用的东西。

常见的RuntimeException?

NullPointException:当操作一个空引用会出现此错误。

NumberFormatException:数据格式转换出现问题时出现此异常。

ClassCastException:强制类型转换类型不匹配时出现此异常。

ArrayIndexOutOfBoundException:数组下标越界,当使用一个不存在的数组下标时出现此异常。

ArithmeticException:数学运行错误时出现此异常。

 后续:面试时注意事项

面试时尽量说自己的优点,擅长技能,例如我熟悉设计模式,使用过ssh,熟悉算法和数据结构。

自我介绍时,先说在哪里上学,专业,说出自己的兴趣,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息