Java面试资料简单整理(不完全版)

静态变量和实例变量的区别?

  1. 在语法定义上的区别:静态变量前要加 static 关键字,而实例变量前则不加。

  2. 在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。

例如,对于下面的程序,无论创建多少个实例对象,永远都只分配了一个 staticVar 变量,并且每创建一个实例对象,这个 staticVar 就会加 1 ;但是,每创建一个实例对象,就会分配一个 instanceVar ,即可能分配多个 instanceVar ,并且每个instanceVar 的值都只自加了 1 次。

public class VariantTest{   
public static int staticVar = 0;    
public int instanceVar = 0;    
public VariantTest(){    
    staticVar++;    
    instanceVar++;    
    System.out.println(“staticVar=” + staticVar + ”,instanceVar=” + instanceVar);   
    } 
}    

Java 创建对象的几种方式(重要):

  1. 用 new 语句创建对象,这是最常见的创建对象的方法;
  2. 运用反射手段,调用java.lang.Class 或者 java.lang.reflect.Constructor类的 newInstance() 实例方法;
  3. 调用对象的 clone() 方法;
  4. 运用反序列化手段,调用java.io.ObjectInputStream 对象的 readObject() 方法。

(1)和(2)都会明确的显式的调用构造函数 ;(3)是在内存上对已有对象的影印,所以不会调用构造函数 ;(4)是从文件中还原类的对象,也不会调用构造函数。

列出自己常用的 jdk 包.

答:JDK 常用的 package

  • java.lang:这个是系统的基础类,比如 String 等都是这里面的,这个 package 是唯一一个可以不用 import 就可以使用的 Package
  • java.io: 这里面是所有输入输出有关的类,比如文件操作等
  • java.net: 这里面是与网络有关的类,比如 URL,URLConnection 等。
  • java.util: 这个是系统辅助类,特别是集合类 Collection,List,Map 等。
  • java.sql: 这个是数据库操作的类,Connection, Statememt,ResultSet 等

用最有效率的方法算出 2 乘以 8 等於几?

2 << 3,因为将一个数左移 n 位,就相当于乘以了 2 的 n 次方,那么,一个数乘以 8 只要将其左移 3 位即可,而位运算 cpu 直接支持的,效率最高,所以,2 乘以 8 等於几的最效率的方法是 2 << 3 。

存在使 i + 1 < i的数吗?

答案:存在

解析:如果 i 为 int 型,那么当 i 为 int 能表示的最大整数时,i+1 就溢出变成负数了,此时不就

扩展:存在使 i > j || i <= j 不成立的数吗?

答案:存在

解析:比如 Double.NaN 或 Float.NaN 。

下面程序的运行结果是()
String str1 = "hello";
String str2 = "he" + new String("llo");
System.err.println(str1 == str2);  

答案:false

解析:因为 str2 中的 llo 是新申请的内存块,而 == 判断的是对象的地址而非值,所以不一样。如果是String str2 = str1,那么就是 true 了。

Java 中的基本数据类型只有 8 个:byte、short、int、long、float、double、char、boolean;除了基本类型(primitive type)和枚举类型(enumeration type),剩下的都是引用类型(reference type)。

Java集合类框架的基本接口有哪些?

Java 集合类提供了一套设计良好的支持对一组对象进行操作的接口和类。Java集合类里面最基本的接口有:

  • Collection:代表一组对象,每一个对象都是它的子元素。
  • Set:不包含重复元素的 Collection。
  • List:有顺序的 collection,并且可以包含重复元素。
  • Map:可以把键(key)映射到值(value)的对象,键不能重复。

Iterator和ListIterator的区别是什么?

下面列出了他们的区别:

  • Iterator 可用来遍历 Set 和 List 集合,但是 ListIterator 只能用来遍历 List 。
  • Iterator 对集合只能是前向遍历,ListIterator 既可以前向也可以后向。
  • ListIterator 实现了 Iterator 接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。

数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用 Array 而不是 ArrayList?

下面列出了 Array 和 ArrayList 的不同点:

  • Array 可以包含基本类型和对象类型,ArrayList 只能包含对象类型。
  • Array 大小是固定的,ArrayList 的大小是动态变化的。
  • ArrayList 提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。 对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。

解释内存中的栈(stack)、堆(heap)和静态存储区的用法。

答:通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间;而通过new关键字和构造器创建的对象放在堆空间;程序中的字面量(literal)如直接书写的100、“hello”和常量都是放在静态存储区中。栈空间操作最快但是也很小,通常大量的对象都是放在堆空间,整个内存包括硬盘上的虚拟内存都可以被当成堆空间来使用。

String str = new String(“hello”);

上面的语句中 str 放在栈上,用 new 创建出来的字符串对象放在堆上,而“hello”这个字面量放在静态存储区。

你可能感兴趣的:(Java面试资料简单整理(不完全版))