首页 > 编程语言 > 详细

java面试汇总(基础)

时间:2016-02-22 23:22:35      阅读:277      评论:0      收藏:0      [点我收藏+]

1.java程序的初始化顺序:原则:静态优先于非静态,且只初始化一次;父类优先于子类;按照成员定义顺序初始化。
例顺序:父类静态变量,父类静态代码块,子类静态变量,子类静态代码块,父类非静态变量,父类非静态代码块,父类构造函数,子类非静态变量,子类非静态代码块,子类构造函数。

2..java在处理基本数据类型时,都是按照值传递,其他的都是按照引用传递

3.三种获取类的方法:1)class.forName(); 2)类名.class; 3)实例.getClass()。

4.四种创建对象的方法:1)通过new实例化;2)通过反射机制;3)通过clone()创建;4)通过反序列化的方式创建对象。

5.抽象类和接口的异同:1)abstract只能用来修饰类或者方法,不能用来修饰属性。2)抽象类表示的是一个实体,而接口表示的是一个概念。 3)只要包含一个抽象方法的类就必须被声明为抽象类 4)子类为父类中的所有抽象方法提供具体的实现,否则他们也是抽象类。 相同点:1)接口和抽象类都不能被实例化 2)接口的实现类或者抽象类的子类只有实现了他们之中的抽象方法后才能被实例化。

不同点:1)接口只有定义,其方法不能再接口中实现,只有实现接口的类才能实现接口中定义的方法,而抽象类可以有定义与实现,即方法可以在抽象类中被实现 2)接口需要实现implements 但抽象类需要被继承extends,一个类可以实现多个接口,但是一个类智能继承一个抽象类。 3)接口强调特定功能的实现,设计理念为has-a;抽象类强调所属关系,其设计理念为is-a 4)接口中定义的成员变量默认为public static final,只能够有静态的不能被修改的数据成员,而且必须为其赋初值,所有成员方法必须是public和abstract的。 抽象类可以有自己的数据成员,也可以有费抽象的方法,成员默认为default的,也可以被定义为private,protected和public的。 当功能需要被积累时,使用抽象类,不需要积累时,使用接口。 5)接口被用于实现比较常用的功能,便于日后的维护或者添加删除方法,抽象类更倾向于充当公共类的角色。 接口可以继承接口,抽象类可以实现抽象类,抽象类也可以继承具体类,抽象类也可以有静态类的main方法。

6.final,finally,finalize区别:
final:1)final用于声明属性,方法,类,表示不可变属性,方法不可覆盖,类不可被继承。(不可变有两层含义:引用不可变;对象不可变。final指的是引用的不可变)
2)final类,该类不能被继承,所有的方法不能被重写,但是属性可变。一个类不能既被声明为abstract又被声明为final。
finally:作为异常处理的一部分,跟在try/catch后并且附带一个语句块,表示这段语句最终一定会被执行。
finalize:是object类的一个方法,在垃圾回收器执行时会调用被用于回收对象的finalize方法。

7.static关键字:主要作用:为某种特定的数据类型或者对象分配单一的存储空间;实现某个方法或属性与类而不是与对象关联在一起。
1)静态成员变量:静态成员变量属于类不属于某个对象,在内存中指有一个复制,另外,java中不能在成员函数内部定义静态变量。
2)静态成员方法:静态方法属于类不属于某个对象,静态方法中不能使用this和super关键字。static关键字一个很重要的用途就是用来实现单例模式。(单例模式:隐藏构造函数,提供一个静态创建对象的方法)
3)静态代码块:不在任何一个方法体内且只执行一次。

8.不可变类:所有基本类型的包装类都是不可变类(引用不可变)。
创建一个不可变类五个原则:
1)类中所有成员变量被private所修饰。
2)类中没有写或者修改成员变量的方法,只提供构造函数一次生成。
3)确保类中的所有方法不会被子类覆盖(利用final达到目的)。
4)如果一个类成员不是不可变类,那么在成员初始化或者使用get方法获取该成员变量时,需要通过clone方法来确保类的不可变性。
5)如果有必要覆盖Object的equals和hashCode方法。

9.值传递和引用传递:1)在方法调用中,实参会把它的值传递给形参,形参知识用实参的值初始化一个临时的存储单元,形参虽然与实参有相同的值却有着不同的存储单元。
2) 原始数据类型在传递参数时都是按照值传递,而包装类型都是按照引用类型在传递

10.不同数据类型的转换:
自动转化。
1)char类型会转换为高级类型,会专函为其对相应的asc码。
2)byte char short类型参与运算时会自动转换为int类型。但当使用+=时就不会产生类型转换。
3)基本数据类型和boolean类型时不能相互转化的。
当需要高级数据类型转化为低级数据类型时就需要进行强制类型转换。

11.字符串创建与存储机制:当创建一个字符串时,首先会在常量池中查找是否已经有相同的字符串被定义,其判断的依据是String类型equals的返回值,若已经定义,则直接获取对其的引用。
此时不需要创建新的对象,如果没有定义,首先创建这个对象,然后把它加入到字符串池中,再将它的引用返回。(例:new String(”aaa“)可能创建了1个或者2个对象,如果常量池中原来有aaa
那么之创建了一个对象,如果没有aaa,那么就会创建两个对象)

12..==,equals,hashCode的区别:
1) 如果要比较两个基本类型的数据或者两个引用变量是否相等,只能用==运算符。
2)equals是Object类提供的方法之一,Object类中定义的equals是直接用==运算符比较的对象(比较字符串的值是否相等用equals,比较引用是否相等用==)。
3)hashCode方法是从Object方法继承来的,也是用来鉴定两个对象是否相等。Object类中的hashCode方法返回对象在内存地址转换成一个int值,所以如果没有重写hashCode方法,任何对象的hashCode
都是不相等的。

13.String,StringBuffer,StringBuilder,StringTokenizer:
1)String对象一旦被创建,其值就不能被修改(引用不可变)。而StringBuffer则是可以改变类。
2)String在实例化时可以利用构造函数也可以用赋值符号,而StringBuffer只能用构造函数初始化。
3)StringBuilder和StringBuffer一样也是用来修饰字符串,但是StringBuilder不是线程安全的,所以StringBuilder效率更高,当有多个线程访问时使用StringBuffer。
4)StringTokenizer是用来分割字符串的工具。
注意:String s=""和 s=null是不一样的。 s=null 代表s不指向任何一个字符串,而s=""代表s是一个指向空字符串的引用。

14.Java的IO流:可分为两大类:字符流和字节流。
字符流:以字符16bit为单位,根据码表映射字符,一次可以读出多个字节。包含Reader和Writer两抽象类。
字节流:以字节8bit为单位,包含两个抽象类InputStream,OutputStream。
主要区别:字节流在处理输入输出时不会用到缓存,而字符流用到了缓存。

15.Java Socket:Java中socket分为两种类型:面向连接的Socket通信协议(TCP,传输控制协议)和面向无连接的Socket通信协议(UDP,用户数据报协议)。任何一个Socket都是由IP地址和端口号唯一确定的。

16.Java序列化:Java提供了两种对象持久化的方式,分别为序列化和外部序列化(序列化是一种将对象以一连串的字节描述的过程,用于解决在对对象流进行读写操作时引发的问题)。
Java中所有实现序列化的类都必须实现Serializable接口。
序列化特点:
1)如果一个类能被序列化,那么它的子类也能被序列化。
2)由于static代表类的成员,transient代表临时数据,被声明为这两种类型的数据成员是不能够序列化的。
需要被序列化的情况:
1)需要通过网络来发送对象,或对象的状态需要被持久化到数据库或文件中。
2)序列化能实现深复制,即可以复制引用的对象

17.Java的解释执行顺序:代码的装入,代码的检验,代码的执行。
Java字节码 的执行也分为两种方式:即时编译方式,解释执行方式,即时编译方式指的是解释器先将字节码编译成机器码,然后再执行该机器码;
解释执行的方式值得是解释器通过每次解释并执行一小段代码来完成Java字节码程序所有的操作。

18.Java中class文件的加载原理:
类加载的方式分为隐式加载与显式加载。隐式加载指的是程序在使用new等方式创建对象时,会隐式的调用类额加载器,把对应的类加载到JVM中。
显式加载指的是通过直接调用class.forName 的方法来吧所需要的类加载到JVM中。

19.类加载的主要步骤:
1)装载。根据查找路径找到相对应的class文件,然后倒入。
2)链接。检查class文件的正确性。给类中的静态变量分配存储空间。将符号引用换成直接引用。
3)初始化。对静态变量和静态代码块执行初始化工作。

20.Java的内存泄露情况:1)在堆中申请的空间没有被释放;2)对象已经不在被使用,但仍然在内存中保存。
垃圾回收机制的引用可以解决第一种情况。
会引起内存泄露的有以下四个方面:1)静态集合类 2)数据库连接,网络连接,IO连接等。 3)监听器 4)变量不合理的作用域 5)单例模式

21.Java中的堆栈:栈内主要用来存放基本数据类型与引用变量;堆用来存放运行时创建的对象,一般来讲通过new关键字创建的对象都存放在堆内存中。

22.Java Collections框架:包含了大量集合接口以及他们的实现类。如:List,Queue,Set,Stack和Map等。
其中Set,List,Map:
Set特点:集合中国的元素都不能重复,有两个实现类HashSet和TreeSet,其中TreeSet实现了SortedSet接口,是有序的。
List特点:可以保存重复的对象,LinkedList,ArrayList,Vector都实现了List接口。
Map特点:提供了一个从键映射到值的数据接口。它用于保存键值对。值可重复,键唯一。Java中HashMap,TreeMap,LinkedHashMap,WeakHashMap和IdentityHashMap都实现了此接口。

23.Iterator迭代器:三个重要方法
1)容器的iterator()返回一个Iterator然后通过Iterator的next方法返回第一个元素。
2)hasNext判断是否还有元素。
3)remove方法删除迭代器中国的元素。
注意事项:
1)迭代器只能正向遍历集合,适合获取移除元素,ListIterator继承于Iterator专门针对List可以从两个方向遍历List,同时支持元素修改。
2)迭代器具有线程安全问题,在使用迭代器遍历容器时,注意将对容器的操作放到synchronized代码块中。

24.LinkedList,ArrayList,Vector区别:
LinkedList相当于链表的数据结构,适合进行增删操作,ArrayList,Vector相当于数组数据结构,适合进行读取操作。
ArrayList,Vector的最大区别是Vector是线程安全的而ArrayList不是线程安全的,正是因为Vector是线程安全的,其性能上要略逊于ArrayList。

25.HashMap,TreeMap,HashTable,WeakHashMap有什么区别:
1)HashMap是HashTable的轻量级实现(非线程安全的),他们都完成了Map接口,主要区别是HashMap允许空键值,但最多只允许一个为空,HashTable不允许。
2)HashMap把HashTable 的contains方法去掉了,改成了containsValue和containsKey。HashTable 继承自Dictionary而HashMap是Map接口的实现。
3)HashTable 是线程安全的HashMap不是。
4)在Map中进行插入删除和定位元素HashMap是最好的选择。如果需要排序或者自定义顺序遍历键,TreeMap更好。如果要输入的顺序和输出的顺序一样LinkedHashMap更合适。

26.使用自定义类作为HashMap的键值时需要注意:
1)如果想根据对象的相关属性来自定义是否相等,就要重写equals和hashCode方法。
2)当自定义类的多项作为HashMap的key时,最好把这个类设计为不可变类。
3)如果两个对象相等,那么他们就有着相同的hashCode,反之不成立。

27.什么是线程,有什么优点,和进程有什么区别:
线程有四种状态:运行,就绪,挂起,结束。
进程是指一段正在执行的程序,而线程可以被看做是轻量级的进程,他是程序执行的最小单元,一个进程可以拥有多个线程,各个线程之间共享程序的内存空间(代码段,数据段,堆空间)
以及一些进程级的资源,但各个线程拥有自己的栈空间。

28.Java实现多线程三种方法:
1)继承Thread重写run方法。
2)实现Runnable接口,并实现run方法。
3)实现Callable接口,重写call方法。

29.run方法与start方法有什么区别:start方法启动一个线程,通过run方法完成实际的操作,如果直接调用线程类的run方法,就会被当成一个普通函数来调用,程序仍然一个线程

30.sleep方法和wait方法哟什么区别:
sleep方法是使线程暂停执行一段时间的方法,wait是使线程暂停执行的方法。
1)原理不同:sleep是Thread类的静态方法,是线程用来控制自身流程的,而wait方法是Object类的方法,用于线程间的通信,这个方法会使对象锁进程等待,知道其他线程调用notify方法
2)对锁的处理机制不同:wait方法会使线程放掉他锁占用的锁。
3)使用区域不同:wait方法必须放在同步控制方法或者同步语句块中使用。sleep必须捕获异常。

31.JDBC访问数据库一般的步骤:
1)加载JDBC驱动器。
2)加载JDBC驱动。
3)建立数据库连接,获取Connection对象。
4)建立Statement对象或者PreparedStatement对象。
5)执行SQL语句。
6)访问结果集Result对象。
7)依次关闭对象,释放资源。

32.PreparedStatement对象的优点:
1)效率更高(命令会被数据库进行编译和解析,放到命令缓冲区,下次会直接解析缓冲区中的命令,不会再编译一遍)。
2)代码的可读性和维护性更好。
3)安全性更好。

java面试汇总(基础)

原文:http://www.cnblogs.com/jblog/p/5208338.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!