Java 面试题

一、 对finalize认识:java

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

 

二、 &和&&的区别。算法

  

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

 

三、 HashMap和Hashtable的区别。数组

 

HashMap不是线程安全的 
安全

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

 

     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不是

 

五、ArrayListVector的区别。

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

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

.数据增加:当须要增加时,Vector默认增加为原来一培,而ArrayList倒是原来的一半 。

   但深刻的讲:

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

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

它容许全部元素,包括null。

其特色:

(1)ArrayList没有同步。

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

 

二、Vector也是采用数组方式存储数据,因为使用了synchronized方法(线程安全)因此性能上比ArrayList要差。

其特色:

(1)Vector是同步的。

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

2、从存取操做的效率来看

  在取数据操做中Arraylist最快。

  在存数据操做中 linklist最快。

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

3、从应用的角度来看:
    若是须要快速随机访问元素,应该使用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()这个方法。

 

十一、 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(违例)表示须要捕捉或者须要程序进行处理的异常,它处理的是由于程序设计的瑕疵而引发的问题或者在外的输入等引发的通常性问题,是程序必须处理的。

 

 

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

  

接口能够继承接口。

抽象类能够实现(implements)接口。

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

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

如:interface a{}

interface b extends a{}

 2.抽象类能够实现接口..

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

 

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

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