java笔试面试中的坑

1.关于类型初始化

对于类的成员变量,编译系统会自动赋予初值,但必须先定义才能使用,可以不必初始化

类的成员数据类型的默认值是:

boolean:false  byte:0  short:0  char:'\u0000'  int:'0'  float:0.0F  double:0.0  object:null

但局部变量,不但要先定义,而且还必须要初始化,否则会报错。

******************************************************************************************

2.传值与传引用

java中8种基本数据类型,在传入方法时,是将其副本传入方法中,在方法中对其操作,当方法返回时,其值仍保持方法调用前的状态。

其他类型,例如map,list,数组,等对象传入方法是,是将其引用直接传入,在方法中对其操作,当方法返回时,方法中改变的数值仍将保留。

测试代码:

View Code

 ******************************************************************************************

3.Map中的参数类型,必须为对象,不能使基本类型,要重写hashcode和equles两个方法。List也是一样。
******************************************************************************************

4.java:[类型(字节)] byte(1) short(2) int(4) long(8) flout(4) double(8)(可有E表示幂次) char(2) boolean(1bit)

   c: char(1) int(4)  short int(2)  long int(4)  double(8)

******************************************************************************************

5.HashMap与HashTable的区别

(1)HashMap、HashTable均实现了Map接口。HashTable继承与Dictionary类。HashMap中可以有null Key和null Value,但其Key必须唯一。而HashTable中不允许NULL值的出现。

(2)HashMap不是线程安全的,HashTable是线程安全的。HashMap是HashTable的轻量级实现。

******************************************************************************************

6.Collection、List、Set、Map的关系

(1)Collection是List、Set的基接口。List在Collection的基础上增加了有序。Set在Collection的基础上增加了唯一。并且JAVA JDK不提供直接继承Collection的类,只有继承与List和Set的类。有iterator()方法。可以遍历其子项。

(2)Map是与Collection并列的接口。是Key-Value的映射。

 

******************************************************************************************

7.ArrayList与Vector的区别

(1)同步性:Vector是线程安全的。ArrayList是线程不安全的。线程安全的弱点是,实现复杂,效率低。

(2)数据增长:当数据数目超出了数组的长度,则需要拓展数组的长度。ArrayList是延长原长度的50%,Vector是延长原数组的一倍。

******************************************************************************************

8.String、StringBuffer和StringBuilder

(1)本质比较:String是常量字符数组,当其值改变时,必须重新实例;StringBuffer是字符串变量,线程安全;StringBuilder也是字符串变量,非线程安全。

(2)速度比较:在改变长度或内容的条件下,StringBuilder>StringBuffer>String。注意String s = "a"+"b"+"c";在JVM中与String s = "abc";是等价的。

(3)StringBuffer可以理解为是一个String的字符缓冲区,他可以通过append和insert来改变其内容。append是在其尾追加内容,例如z引用当前内容是"start",执行z.append("le")后,其内容变为"startle"。而执行z.insert(4,"le")后,其内容变为"starlet"。StringBuilder是在5.0退出的StringBuffer的轻量级替代类,在无多线程共享变量的情况下,速度快。其中的方法与StringBuffer类似。

******************************************************************************************

9.switch(A){case B:}

其中A部分必须是int型的,或者能隐式转换到int型(byte,short,char,int),或者enum中的项。

B部分必须是单个的byte,short,char,int型,或者是final型,final型必须是编译时的常量。

******************************************************************************************

10.try{return;}finally{}中,return在finally执行之后执行。

******************************************************************************************

11.try{}catch{syso("1")}catch{syso("2")}finally{syso("3")} syso("4")

其中catch不能级联,当第一个catch结束后,将执行finally中的内容。执行完后,将继续顺序执行try..catch块后的内容。

******************************************************************************************

12.JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method)

参考:http://www.blogjava.net/yaoyaojj/archive/2011/07/31/355438.html

         http://java-mzd.iteye.com/blog/848635

******************************************************************************************

13.抽象类不能被实例化

******************************************************************************************

14.这些都是线程安全的

HashTable   Vector   StringBuffer  ConcurrentLinkedQueue    ConcurrentHashMap

******************************************************************************************

15.N各节点能组成多少种二叉树

h(n)= C(n,2n)/n+1

******************************************************************************************

16.Java里面对象的生命周期

在JVM运行空间里面,对象整个声明周期大致分为以下几个阶段:

  创建阶段(Creating)->应用阶段(Using)->不可视阶段(Invisible)->不可达阶段(Unreachable)->可收集阶段(Collected)->终结阶段(Finalized)->释放阶段(Free)

  【1】创建阶段:

  创建过程需要经过其中几步:

  为对象分配内存空间

  开始构造对象

  递归调用超类的构造方法

  进行对象实例初始化和变量初始化

  执行构造方法体

  【2】应用阶段特征:

  系统至少维护着对象的一个强引用(StrongReference)

  所有该对象的引用全部是强引用,除非我们显示声明了软引用、弱引用或者虚引用

  【3】不可是视阶段:

  不可视阶段就是我们在区域代码中不可以再引用它,就是强引用已经消失,一般情况我们把这个时候的对象设置为null,其主要目的是让JVM发现它,并且可以及时回收该对象所占用资源

  【4】不可到达阶段:

  不可达阶段的对象,在虚拟机所管理的对象引用根集合中再也找不到直接或间接的强引用,这些对象通常是指所有线程栈中的临时变量以及相关引用,这种对象都是要预备回收的对象,但是这时候不能被GC直接回收。

  【5】可收集阶段、终结阶段、释放阶段:

  对象生命周期最后一个阶段,这种阶段的对象可能处于三种状态:

  垃圾回收器发现对象已经不可达

  finalize方法已经被执行

     对象已经被重用

******************************************************************************************

17.Hibernate缓存机制

一级缓存就是Session级别的缓存,一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中,如果短时间内这个session(一定要同一个session)又做了同一个操作,那么hibernate直接从一级缓存中拿,而不会再去连数据库,取数据。
二级缓存就是SessionFactory级别的缓存,顾名思义,就是查询的时候会把查询结果缓存到二级缓存中,如果同一个sessionFactory创建的某个session执行了相同的操作,hibernate就会从二级缓存中拿结果,而不会再去连接数据库。
参考:
http://blog.csdn.net/xiashan17/article/details/6049664

******************************************************************************************

18.Hibernate常见面试问题

http://blog.163.com/peripateticism_lxt/blog/static/183211290201139102743814/

******************************************************************************************

19.主键与索引关系

创建一个主键,则同时自动创建了一个同名的唯一索引,与之关联。删除主键,则主键约束和对应的唯一索引都删除了。

存在主键约束,则肯定存在与之对应的唯一索引,而存在唯一索引,不一定对应着有主键约束。

******************************************************************************************

20.将UTF-8字符转码成ISO-8859-1

String name =new String("SOI".getBytes("ISO-8859-1"),"ISO-8859-1");
String nameUtf = new String(name.getBytes("UTF-8"),"UTF-8");
System.out.println(nameUtf);

******************************************************************************************

21.B tree

http://blog.csdn.net/sws9999/article/details/3018519

******************************************************************************************

22.java常见笔试面试题。。有这一个就够了

http://www.blogjava.net/fanyingjie/archive/2007/06/27/126467.aspx

******************************************************************************************

23.java类加载过程,及存在的问题

http://www.dewen.org/q/7140

******************************************************************************************

posted @ 2015-07-01 23:54  eaglepan  阅读(303)  评论(0编辑  收藏  举报