日期:2014-05-20  浏览次数:20796 次

Java面试基础(一)
1、面向对象的特征有哪些方面:

A:抽象

B:继承

C:封装

D:多态

2、Java基本的数据类型:

    Java基本数据类型包括:byte、short、int、long、float、double、boolean、char
    String不是基本的数据类型,是对象。
    java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类。

3、Java基本类型与引用类型的区别:

Java 提供两种不同的类型:引用类型原始类型(或内置类型)。另外,Java 还为每个原始类型提供了封装类(Wrapper)。下面是java里面的原始类型和对应的封装类:
   A: boolean-----Boolean 
   B: char--------Character 
   C: byte--------Byte 
   D: short-------Short 
   E: int---------Integer 
   F: long--------Long 
   G: float-------Float 
   H: double------Double
引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关

4、String 和StringBuffer的区别:

JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串可以修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffer来动态构造字符数据。
--------------------------------------------
String   s;每次对s进行赋值操作是都将生成一个新的String实例;
StingBuffer sb;sb则不然,它始终是同一个实例;
所以在经常动态的改变字符串的值时用StingBuffer效率比较高,java生成一个实例的代价较大。

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

1)ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢;
2)Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差;
3)LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

6、Collection 和 Collections的区别。

Collection是集合类的上级接口,继承与他的接口主要有Set 和List.
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

7、HashMap和Hashtable的区别。

1).HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。

2).HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。

3).HashTable有一个contains(Object value),功能和containsValue(Object value)功能一样。

4).HashTable使用Enumeration,HashMap使用Iterator。

5).HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。

6).哈希值的使用不同,HashTable直接使用对象的hashCode,代码是这样的:
     int hash = key.hashCode();
     int index = (hash & 0x7FFFFFFF) % tab.length;

而HashMap重新计算hash值,而且用与代替求模:
int hash = hash(k);
int i = indexFor(hash, table.length);
static int hash(Object x) {
  int h = x.hashCode();

  h += ~(h << 9);
  h ^= (h >>> 14);
  h += (h << 4);
  h ^= (h >>> 10);
  return h;
}
static int indexFor(int h, int length) {
  return h & (length-1);
}

8、final, finally, finalize的区别:

1)final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
2)finally是异常处理语句结构的一部分,表示总是执行。
3)finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

9、String, StringBuffer StringBuilder 的区别。

1)String 的长度是不可变的;
2)StringBuffer 的长度是可变的,如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer 的toString()方法;线程安全;
3)StringBuilder是从JDK 5 开始,为StringBuffer 该类补充了一个单个线程使用的等价类;通常应该优先使用StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。

10、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。