Java 面试题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 面试题相关的知识,希望对你有一定的参考价值。

1、 对finalize认识:

finalize—方法名。是gc操作的运行机制中得一部分,进行gc操作时会调用finalize方法。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作,如实现流的关闭finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。

 

2、 &和&&的区别。

  

& 是两个数相与,是运算符
&&是连接两个条件表达式的,两个条件表达式都为真时,整个才为真

 

3、 HashMap和Hashtable的区别。

 

HashMap不是线程安全的 

     hastmap是一个接口 是map接口的子接口,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。HashMap允许null keynull value,而hashtable不允许。

 

     HashTable是线程安全的一个Collection

 

HashMapHashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key,由于非线程安全,效率上可能高于Hashtable
HashMap允许将null作为一个entrykey或者value,而Hashtable不允许。
HashMapHashtablecontains方法去掉了,改成containsvaluecontainsKey。因为contains方法容易让人引起误解。 
Hashtable继承自Dictionary类,而HashMapJava1.2引进的Map interface的一个实现。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 
HashtableHashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。

 

 

4.Collection 和 Collections的区别。 

Collection 和 Collections的区别。 

Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。 

 

Collection是个java.util下的接口,它是各种集合结构的父接口。

 值得注意的是: ListSetCollection的实现, Map不是

 

5、ArrayListVector的区别。

  简而言之,从两方面回答:

.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的 

.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半 。

   但深入的讲:

一、从存储数据的方式来看:

1、ArrayList是采用数组方式存储数据,实现了可变大小的数组。

它允许所有元素,包括null。

其特点:

(1)ArrayList没有同步。

(2)此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以索引数据快插入数据慢。

 

2、Vector也是采用数组方式存储数据,由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差。

其特点:

(1)Vector是同步的。

(2)由Vector创建的Iterator,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕获该异常。

二、从存取操作的效率来看

  在取数据操作中Arraylist最快。

  在存数据操作中 linklist最快。

  在删除数据操作中linklist最快。

三、从应用的角度来看:
    如果需要快速随机访问元素,应该使用ArrayList。
  如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一个类,应该使用同步的类。

6.GC是什么? 为什么要有GC?

     GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。

    目的就是将不用的资源释放掉 。Gabage Collection(垃圾回收) 有了GC,程序员就不需要再手动的去控制内存的释放。当Java虚拟机(VM)内存资源紧张的时候,就会自动地去清理无用对象(没有被引用到的对象)所占用的内存空间.如果需要,可以在程序中显式地使用System.gc() / System.GC.Collect()来强制进行一次立即的内存清理。

 

 

7.什么时候用assert。

   assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion检查通常是关闭的。

  例如

#include <stdio.h>

#include <assert.h>

void main()

{ float a,b; scan("%f %f",&a,&b); assert(b!=0); printf("%f\n",a/b); }

以上的程序要计算A/B的值,因此要求b!=0,所以在程序中使用了assert()用于确保b!=0,如果b==0,则程序会退出。

 

 

8.short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? (易错题)

     是报错为可能损失精度吗?呵呵,这个问题的原因就是所有声明为short的类型变量在进行运算时都会自动转为int类型的变量,这样s1+1就不是short型的,而变成int类型的,这时再赋给还是short类型的s1就会报精度损失错误了,这样改下就不会报错了

s1=(short)(s1+1),试试看!

 

 

9.sleep() 和 wait() 有什么区别?

   sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。waitObject类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

 

 

10、数组有没有length()这个方法? String有没有length()这个方法?
    数组没有length()这个方法,有length的属性。String有有length()这个方法。

 

11、 Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
   1、什么是Set?(what)

     SetCollection容器的一个子接口,它不允许出现重复元素,当然也只允许有一个null对象。

   2、如何来区分重复与否呢?(how)

       JPI中写的很明白:“set 不包含满足e1.equals(e2) 的元素对 e1 和 e2 ”,由此可见回答使用equals()区分更合适。

   3、为什么用equals()而不用==来区分?(why)

     应该从它俩的区别谈起,==是用来判断两者是否是同一对象(同一事物),而equals是用来判断是否引用同一个对象。再看一下Set里面存的是对象,还是对象的引用。根据java的存储机制可知,set里面存放的是对象的引用,所以当两个元素只要满足了equals()时就已经指向同一个对象,

也就出现了重复元素。所以应该用equals()来判断。

 

12.error和exception有什么区别?

    Error(错误)表示系统级的错误和程序不必处理的异常,是java运行环境中的内部错误或者硬件问题,比如,内存资源不足等,对于这种错误,程序基本无能为力,除了退出运行外别无选择。
    Exception(违例)表示需要捕捉或者需要程序进行处理的异常,它处理的是因为程序设计的瑕疵而引起的问题或者在外的输入等引起的一般性问题,是程序必须处理的。

 

 

13、 接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?

  

接口可以继承接口。

抽象类可以实现(implements)接口。

抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。

 1.接口可以继承接口..但是要使用extends~而不是用implements

如:interface a{}

interface b extends a{}

 2.抽象类可以实现接口..

比如java.util中的AbstractCollection类就是实现的Collection接口

 

14、 构造器Constructor(构造函数)是否可被override?
    构造器不是方法,那么用来修饰方法特性的所有修饰符都不能用来修饰构造器(并不等于构造器不具备这些特性,虽然不能用static修饰构造器,但它却有静态特性)构造器只能用 public private protected这三个权限修饰符,且不能有返回语句。

      1). 构造器不能是native,final,static,synchronized 的,可以是public,private,protected或什么都没有。
   2). 构造器函数里可以写return呢,但后面什么都不许有(包括null)
   3). 构造器不能返回值.
     但如果有个"构造器"返值了,它就不是构造器喽,只是个普通方法
   4). super();this();这两个方法只能在构造方法里调用.
   5). 成员变量声明时候赋值,比构造函数还早.

 

以上是关于Java 面试题的主要内容,如果未能解决你的问题,请参考以下文章

经验总结:Java高级工程师面试题-字节跳动,成功跳槽阿里!

前端面试题之手写promise

一道经典面试题:字符串在Java中如何通过“引用”传递

Java之String相关内容详解(字符串和字符串常量池)面试题

JAVA基础面试题

Java面试题及答案2020,java登录界面代码