Java常见面试题一

  收集整理一些项目里面常用的,面试也会被经常问到的Java面试题。

  一、 基础:  

   1.   static 关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static方法?是否可以在 static 环境中访问非 static 变量?

      1、static 关键字表明一个成员变量或者是成员方法可以在没有所属类的的实例变量的情况下被访问。

      2、Java中的static方法不能被覆盖。为什么呢?因为方法覆盖是基于运行时动态绑定的,而static方法是在编译时静态绑定的。

        static方法跟类的任何实例都不相关,所以概念上不适用。

      3、static 变量在 Java 中是属于类的,它在所有的实例中的值是一样的。当类被 Java 虚拟机载入的时候,会对 static 变量进行初始化。

        如果你的代码尝试不用实例来访问非 static 的变量, 编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。 

  2. 接口和抽象类的相同点和区别分别是什么?

      相同点: 

      1、都不能被实例      

      2、都能包含抽象的方法,这些抽象的方法用于描述类具备的功能,但是不能提供具体的实现      

      区别如下:

      1、接口中只能有抽象的方法,在抽象类中可以写非抽象的方法,从而避免在子类中重复书写他们,这样可以提高代码的复用性。
      2、一个类只能继承一个直接父类,这个父类可以是具体的类也可是抽象类;但是一个类可以实现多个接口。
      3、Java 接口中声明的变量默认都是 final 的。抽象类可以包含非 final 的变量。
      4、Java 接口中的成员函数默认是 public 的。抽象类的成员函数可以是 private,protected 或者 是 public
      5、当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。
 
   3. 什么是值传递和引用传递?

    1、对象被值传递,意味着传递了对象的一个副本。因此,就算是改变 了对象副本,也不会影响源对象的值。

    2、对象被引用传递,意味着传递的并不是实际的对象,而是对象的引用 。因此,外部对引用对 象所做的改变会反映到所有的对象上。

  二、 Java集合:
  1. Java 集合类框架的基本接口有哪些?
    
    1、Collection:代表一组对象,每一个对象都是它的子元素。

    2、Set:不包含重复元素的 Collection。

    3、List:有顺序的 collection,并且可以包含重复元素。

    4、Map:可以把键(key)映射到值(value)的对象,键不能重复。

  2. Iterator 和 ListIterator 的区别是什么?


    1、Iterator 可用来遍历 Set 和 List 集合,但是 ListIterator 只能用来遍历 List。

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

  3. HashMap 和 Hashtable 有什么区别?

    1、HashMap 和 Hashtable 都实现了 Map 接口,因此很多特性非常相似。

    但是,他们有以下不同 点:

    2、HashMap 允许键和值是 null,而 Hashtable 不允许键或者值是 null。

    3、Hashtable 是同步的,而 HashMap 不是。因此,HashMap 更适合于单线程环境,而 Hashtable适合于多线程环境。

    4、HashMap 提供了可供应用迭代的键的集合,因此,HashMap 是快速失败的。另一方面,Hashtable 提供了对键的列举(Enumeration),Java5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。

  4.HashSet 和 TreeSet 有什么区别?

    1、HashSet 是由一个 hash 表来实现的,因此,它的元素是无序的。add(),remove(),contains()方法的时间复杂度是 O(1)。

    2、TreeSet 是由一个树形的结构来实现的,它里面的元素是有序的。因此,add(),remove(),contains()方法的时间复杂度是 O(logn)。

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

    1、Array 可以包含基本类型和对象类型,ArrayList 只能包含对象类型。

    2、Array 大小是固定的,ArrayList 的大小是动态变化的。

    3、ArrayList 提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。

    4、对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数 据类型的时候,这种方式相对比较慢。

  6.ArrayList 和 LinkedList 有什么区别?

    ArrayList 和 LinkedList 都实现了 List 接口,

    他们有以下的不同点:

    1、ArrayList 是基于索引的数据接口,它的底层是数组。它可以以 O(1)时间复杂度对元素进行随机访问。

    2、LinkedList 是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是     O(n)。

     3、相对于 ArrayList,LinkedList 的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。

    4、LinkedList 比 ArrayList 更占内存,因为 LinkedList 为每一个节点存储了两个引用,一个指向前 一个元素,一个指向下一个元素。

  7.Java 集合类框架的最佳实践有哪些?

    1、根据应用的需要正确选择要使用的集合的类型对性能非常重要,比如:假如元素的大小是固 定的,而且能事先知道,我们就应该用 Array 而不是 ArrayList。     

    2、有些集合类允许指定初始容量。因此,如果我们能估计出存储的元素的数目,我们可以设置初始容量来避免重新计算 hash值或扩容        

    3、为了类型安全,可读性和健壮性的原因总是要使用泛型。同时,使用泛型还可以避免运行时 的 ClassCastException。

    4、使用 JDK 提供的不变类(immutable class)作为 Map 的键可以避免为我们自己的类实现hashCode()和 equals()方法。
    5、编程的时候接口优于实现。

    6、底层的集合实际上是空的情况下,返回长度是 0 的集合或者是数组,不要返回 null。

猜你喜欢

转载自www.cnblogs.com/jemma/p/8988023.html