java面试题整理(-)

来源:互联网 发布:加油站经营软件 编辑:程序博客网 时间:2024/04/30 09:06

最近可以能要开始准备实习了,现在我要把java的基本概念梳理一下,这里主要是按照网上的一些demo然后根据他们给出的题目给出自己认为合理的回答

每份文件中会给出参考博客的链接


参考了http://blog.csdn.net/sgx425021234/article/details/8786017

1、 面向对象的特征有哪些方面

抽象 封装  继承  多态等

抽象:是对复杂对象的特征基于所需进行提取、E.G   类是对现实对象的一个抽象,一个员工在现实生活中应该有很多属性与操作,但是如果我们在程序中的员工类可能只保留了账号密码,员工职位等所需要的必要属性以及必要操作。


封装:封装是面向对象的一个主要特征,定义是把数据与数据相关的行为结合起来。最为普通的例子是直接把类属性和对应的getter和setter方法包装在一起。在这个方面有一个迪米特法则,主要内容是最小认知,比如A中包含B类,B中包含C类,那么A中不能使用B.C来直接使用C,而必须通过B.method()来对C进行操作。封装提高了数据的内聚性,德米特法则则是减少了程序间的耦合性,保证了修改的最小破坏。


继承:继承是实现代码复用的一个主要手段之一,继承中存在着基类,父类,子类等概念。基类指的是一个继承树的根,父类指的是被继承的类,子类是执行继承的类。子类拥有父类所有的可被继承的数据和操作(protected 关键字标注的操作不可被继承),之前也提到过这点可以做到代码复用,另外子类可以修改方法或者增加属性行为来扩展父类的实现,修改的方法要求父类的方法不能被final关键字修饰。继承也是维护了对象类型现实关系的方法,比如猫属于动物这种ISA关系。


多态:多态是通过继承和实现接口实现的,含义是使用同一个对象指针指向不同对象。E.G. 猫有无毛猫,断尾猫 波斯猫等不同种类,但是他们都是属于猫,我们可以通过指向猫的指针来指向猫的子类,对于该指针的操作将会调用子类中对应的代码。多态也是降低耦合度,提高代码复用的一个主要手段。



2、 int  Integer 有什么区别

int是基本数据类型,Integer是对int的一个包装,是对象类型。int的默认值为0,Integer默认值为null。对于基本数据类型而言,他们都相当于只在内存中存储了一个数值,而对于Integer这种包装类型,内存中存储着属性与操作。


3、 运行时异常与一般异常有何异同?

运行时异常是虚拟机在运行是会自动捕获处理的异常类型,在编码和汇编阶段,IDE或者JDK不会检查,如果系统出现了运行时异常,比如nullPointer等,如果异常没有被特殊捕获,异常会丢到程序根,导致程序停止运行,如果是线程就是导致线程终止。

一般异常,在编码阶段JDK会强制要求进行异常捕获处理。


4、 说出ArrayList,Vector, LinkedList的存储性能和特性

ArrayList   是一个可以动态扩展大小的List,但是动态扩展的过程是使用新开一个2倍大的数组,然后通过复制操作,效率很低,所以虽然ArrayList 的动态扩展很实用,但是最好在使用的时候预期一个普通情况下能达到的一个最大的容量,初始化数组,减少 数据复制来提高效率,最后trimtoSize 也能减少内存使用。List提供了使用索引插入和删除,但是这样的操作都会带来数据移动,实际的效率很低,但是支持index索引,搜索的效率很高。


Vector   和ArrayList很像,但是是线程安全的。但是由于对线程安全的考虑,vector的存储性能要比ArrayList要差。


LiskedList 内部实现是一个双向链表,索引增和删的效率很高,但是在索引查找的时候需要采用遍历操作,效率很低。(由于是双向链表,对于index 半序以上的查找是通过反向查找实现的,比起单向链表的效率要高一点,但是存储空间占用要多很多)


5、 &&&的区别

&是位与操作,&&是关系操作中的与操作。

&位与操作是直接调用系统的底层组件实现的,效率比+-*/这些操作要高很多,在对性能很苛刻要求的程序中应当考虑位操作,比如线性二叉树需要经常查找父节点那么只需要index/2  ,但数值运算效率很低,我们可以直接index>>1,右移一位来实现效率提高


&&关系操作,这样的关系操作都有一个性质,保证最小检查,如果已检查条件能满足,那么剩余的条件不会检查。这个经常会被利用来避免异常,比如if( A==null || A,method())等


6、 final, finally, finalize的区别

final   声明属性   表明属性在只能在初始的时候被复制,不接受其他赋值

          声明方法   表明方法不可被子类继承

         声明类        类不可被继承

finally  用来与try 搭配使用,这段代码不管try捕获没捕获到异常必定会执行,如果捕获了异常,catch中没返回上层,那么正常顺序处理,如果catch中返回上层了,finally在返回  之前执行,这个通常是用来与资源搭配操作,比如说connect 连接关闭,避免出现异常 线程还占用connect


finalize Object类的方法 相当于c++里面的析构函数


7、 heapstack有什么区别。

heap    堆,使用先进先出的机制。普通的就直接线性添加,线性出堆,二叉堆属于进一步的产物,堆里面维护二叉树,由此产生了堆排序,出堆的时候存在着数据迁移

stack    栈,后进先出的机制。这样的结构是递归的实质。很实用,但是需要用这种结构的程序 我目前遇到的不多。


8、 String是最基本的数据类型吗?

基本数据类型包括byteintcharlongfloatdoublebooleanshort

String  是java提供的一个final数据类型,这个内部我没有探究过实现,感觉应该和C++一样存储的就是一个charArray。

另外说一句String的直接拼接效率很低,如果需要频繁字符串拼接请使用StringBuilder或者StringBuffer


9、 什么时候用assert
断言机制,在写C/C++的时候我使用过一些。在java中,由于Eclipse和MyEclipse的debug功能的强大,我基本没在正常程序中用过,是在在JUNIT的时候拿来判断程序是否正常运行。assert是用来判定程序绝对不可能出现的情况,来避免程序崩溃或运行异常,比如等级成绩的时候,你不可能允许一个负数成绩的。


10GC是什么为什么要有GC?

GC全程是垃圾回收器,用来是实现内存的回收,在C++中GC会在对象引用消失之后直接调用析构函数,最大可能保证内存的小占用性,减少超内存的可能,所以在ACM之类的网站上同一道题AC的C++类的程序要比Java的程序少很多很多。java中GC采用一种推迟的策略,只有在程序完全退出,或者内存不够的时候再去进行垃圾回收,这个策略在一定程度上减少了垃圾回收的时间,但是增加了内存负担。另外在JVM中有强引用,弱引用和虚引用的概念,之前看到过没细究,之后再讲吧,另外说一句java是可以提示JVM进行垃圾回收,虽然GC不一定会真的运行。


11启动一个线程是用run()还是start()?

当然是start()      run()方法中是需要执行的代码


12应用服务器有那些?
BEA WebLogic ServerIBM WebSphere Application ServerOracle9i Application ServerjBoss(现在新版本改名叫做wildfly),

Tomcat


13List, Set, Map是否继承自Collection接口?

List: 普通的数据集合形式

Set:元素不可重复的数据集合形式,可以覆盖元素的equals方法,外加Set实现元素去重

Map:采用键值对的形式存储元素,内部存储的是key-value的映射,做统计分析或者key检索的时候比较合适

另外Set 和Map  都存在多种组织形式,其中比较常用的就是 hashset hashmap  与treeset  treemap,hash存储的元素遍历出来是无序的,tree会按照存储的顺序保存次序,map可以使用put(key,value)来实现元素值更新

List,set继承了,map不是

14构造器Constructor是否可被override? 构造器是构造函数
构造器函数不可被重载,在继承的时候原类的构造器是会被保护的,子类在构造器中通过super关键字访问。

15try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
会执行,在return前执行。之前finally已经提过


16当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 

我认为准确说是引用传递,  当我创建一个类的时候比如  A  example = new A();    此时我们做了两件事  1在栈中创建了一个实例对象,2在程序空间中创建一个指针指向这个对象类型,当我们进行对象传递的时候 我们传过去的就是对象的地址(PS  注意String 的值是不可变的  源码中数据也是final修的   所以传过去String  对String操作 会新生成String 对象)


17垃圾回收的优点和原理。并考虑2种回收机制。

主要参考下面的链接吧,之前没有研究过这类的问题所以就不误导人了。

http://www.cnblogs.com/laoyangHJ/articles/java_gc.html


18char型变量中能不能存贮一个中文汉字?为什么

能  java中的char为了通用性的考虑 是16位的,也就是2个字节,相当于1个字,下面给出一个demo

import java.io.UnsupportedEncodingException;public class Test {public static void main(String[] args) {String str = "中";char x = '中';byte[] bytes = null;byte[] bytes1 = null;try {bytes = str.getBytes("utf-8");bytes1 = charToByte(x);} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("bytes 大小:" + bytes.length);System.out.println("bytes1大小:" + bytes1.length);System.out.println(bytes1[0] + "--" + bytes1[1]);System.out.println(byteToChar(bytes1) + "||");}public static byte[] charToByte(char c) {byte[] b = new byte[2];b[0] = (byte) ((c & 0xFF00) >> 8);b[1] = (byte) (c & 0xFF);return b;}public static char byteToChar(byte[] b) {int a =(b[0] << 8) + b[1];return (char)a;}}
19JSP的内置对象及方法。

request表示HttpServletRequest对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie, header, session数据的有用的方法。 
    response表示HttpServletResponse对象,并提供了几个用于设置送回 浏览器的响应的方法(如cookies,头信息等) 
    out对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。 
    pageContext表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相关功能的方法。 
    session表示一个请求的javax.servlet.http.HttpSession对象。Session可以存贮用户的状态信息 
    applicaton 表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息 
    config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。 
    page表示从该页面产生的一个servlet实例
(表示最近在用struts的时候 还是直接用request  是不是太low了。。。。)


20JSPServlet有哪些相同点和不同点,他们之间的联系是什么? 

- - JSP最后还是要转化成Servlet,JSP专注于页面表现,去除掉了在Servlet中编写页面的冗余,开发效率很高

0 0