java基础知识和面试题

来源:互联网 发布:淘宝的招聘求职平台 编辑:程序博客网 时间:2024/04/30 04:40

一、GC是什么? 为什么要有GC?

GCGabage Collection的缩写。中文意思就是垃圾回收。

JavaC++发展而来,在C/C++中,需要程序员自己来释放无用变量的内存空间,这样非常繁琐,程序员也可能忘记释放或者释放了不该释放的内存。同时也会耗费程序员大量精力在释放内存上。所以,Java就对此做了改进,由系统来管理内存的释放,不再由程序员去人工释放内存空间了。当Java虚拟机发觉内存资源紧张的时候,就会自动地去清理无用变量所占用的内存空间,如果程序员显示地调用System.gc(),可以通知虚拟机加快垃圾回收的速度。但并不能控制垃圾回收。

 

二、switch语句能否作用在byte上,能否作用在long上,能否作用在String?

switch(condition)中,condition只能是一个整数表达式或者枚举常量,整数表达式可以是int基本类型或Integer包装类型,由于byteshortchar都可以隐含转换为int,所以这些类型以及这些类型的包装类型也是可以的。long不能作用于switch语句中。Stringjdk1.7之前的版本也不可以。

 

三、"=="equals方法究竟有什么区别?

1. "=="是运算符,equals是方法,可以被重写。

2.==”操作符用来比较变量所对应的内存中所存储的数值是否相同。所以要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。因为比较基本数据类型是否相等就是比较其内存中的数值是否相等。比较两个引用变量是否相等就是比较其内存中的值(该变量所指向的对象的首地址)是否相等,就是比较它们是否指向同一个对象。

3. equals()方法是用于比较两个独立对象的内容是否相同。比如:String a=new String("java"); String b=new String("java");这两个变量指向的是两个不同的对象,它们的首地址是不同的,也就是说ab内存中存储的值是不同的,即a==b会返回false,但它们的内容是相同的,所以a.equals(b)将返回true

4. equalsObject的方法。其底层实现就是根据“==”来判断的,这就是说如果一个类或者其父类没有覆盖Objectequals()方法,那么“==”和equals()效果是一样的。上面就是因为String类已经重写了equals()方法,所以“==”和equals()得到的结果才会不一样。

 

四、构造方法能否被重写和重载?

1、构造方法是允许被重载的,而且重载构造方法是一种很普遍的做法,可以方便使用者灵活的创建对象。重载的构造方法之间相互调用可以使用this关键字。

2、在继承过程中构造方法是不能被继承的,因此在子类中无法对父类构造方法重新定义,当然就不能被重写了。如果需要在子类中调用父类的方法,可以调用super关键字引用。

 

五、抽象类和接口的区别?

1、接口和抽象类都不能产生对象。接口变量只能指向实现类对象,抽象类变量只能指向子类对象。
2、一个类实现接口或者一个类继承一个抽象类,都必须实现接口或抽象类中定义的所有抽象方法。除非该类也是抽象类。
3、抽象类中可以定义抽象方法也可以定义具体方法。但接口中只能定义抽象方法。
4、接口中定义的变量都是public static final。而抽象类中定义的变量是普通属性。
5、接口中定义的方法都是public。不能用privateprotected修饰。而抽象类中定义的方法可以是默认、protectedpublic
6、一个类只能继承另一个类,但可以实现多个接口。
7、接口和抽象类中都可以不定义抽象方法。


六、String s = new String("xyz");创建了几个String Object? 二者之间有什么区别?

严格的说应该是一个或者两个。

因为如果常量池之前没有"xyz"这个对象,那么它首先会在常量池里面创建一个"xyz"对象。如果之前常量池就已经有一个"xyz"对象了,那么就不会在常量池里面再创建了,因为常量池里面的对象不会重复。

而每new String一次,就会在内存中创建一个对象。它是以常量池里面的对象为模板创建的。

 

七、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?

1.finally {}一定会执行,只有一种情况下不会执行,即调用了system.exit(),终止了虚拟机进程。

2. finally始终是在跳出方法之前被执行,常用来做一些资源清理工作,所以在return(跳出方法)前执行。

3.比较复杂点的情况是,如果return 后面有一个表达式,那么会先执行表达式的内容,但并不会马上跳出方法,而是执行finally块,若finally也有return语句,整个方法会从finallyreturn跳出,若finally中没有return,则会再从try{}中的return跳出。

 

八、Integerint的区别

1.int是基本数据类型,直接存数值;Integerint的包装类。intInteger都可以表示某一个数值。

2. Integer里面定义了一些静态转换方法,用于实现基本数据类型和String之间的转换。

3. int的默认值为0,而Integer的默认值为null,所以Integer可以区分出未赋值和值为0的情况,而int则没办法区分这种情况。

4. int是基本类型,Integer是引用类型,声明为int的变量不需要实例化,声明为Interger的变量需要实例化

5.Integer是比int更高级的数据类型,int一般只用在数值计算中,而Integer用在需要使用对象的地方,比如MapSetList集合里面存放的都是Object,需要使用包装类。   

 

九、sleep()wait()有什么区别?

1. sleepThread类的方法;waitObject的方法。

2.调用sleep不会释放对象锁;调用wait会释放对象锁,使得其他线程可以使用同步块或者同步方法。

3.sleep会导致线程暂停指定时间,时间一到会自动恢复。而wait需要调用notify或者notifyAll唤醒。

4.作用范围不一样。waitnotifynotifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用。

5. sleep必须捕获异常,而waitnotifynotifyAll不需要捕获异常。

 

十、启动一个线程是用run()还是start()?

启动一个线程是调用start()方法,线程进入就绪状态,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。当cpu分配给它时间时,才开始执行run()方法。

若直接调用run()方法,只是把该方法执行了一遍,并没有真正启动一个线程


十一、谈谈final,finally,finalize的区别?

1.final是修饰符,是一个关键字。修饰变量,如果是基本类型表示该变量的值不能修改;如果是引用类型表示该变量不能指向别的对象;修饰类,表示该类不能被继承;修饰方法,表示该方法不能被重写。

2. finally是在try-catch-finally块中配套使用。一般用于资源清理工作:流的关闭,以及数据库的关闭等。

3. finalizeObject的方法,是GC运行机制的一部分。没有特别要求的话,一般不需要我们调用该方法,交给GC自己管理就好。Java中允许使用 finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作,但其具体执行时间点是无法确定的。子类可以覆盖finalize()方法以整理系统资源或者执行其他清理工作。

 

十二、error和exception有什么区别?

相同点Error类和Exception类都继承Throwable类。

不同点

1.Error表示系统级错误和或低层资源的错误。是java运行环境中的内部错误或者硬件问题,比如,内存资源不足等。这种问题不可能指望通过程序能处理。

2.Exception表示需要捕捉或者需要程序进行处理的异常,它是由于程序设计有问题而产生的,可以通过程序来解决。包括编译时异常(必须捕获)和运行时异常(可以不捕获)。

 

十三、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

是值传递Java编程语言中只有值传递没有引用传递的说法。当一个对象实例作为一个参数被传递到方法中时,这个参数的值就是该对象的引用(该对象的地址)。对象的内容可以在被调用的方法中改变,但对象的引用即地址是永远不会改变的。

 

十四、作用域public,private,protected,以及不写时的区别

对于这个题,只要看懂这个图就没问题了。

作用域 当前类 同包 不同包子孙类 其他包
public       √           √              √              √
protected  √           √              √               ×
friendly    √            √              ×              ×
private     √            ×              ×              ×
不写时默认为friendly

 注: 访问意味着什么呢?当我们说来自一个类(类A)的代码可以访问另一个类(类B)时,就意味着类A能够执行以下3种操作之一:

  • 创建类B的一个实例(instance)
  • 扩展(extend)类B(换句话说,类A成为类B的一个子类)
  • 访问(access)类B中的某些方法和变量,这取决于这些方法和变量的访问控制
从效果上,访问意味着可见性(visibility)。如果类A不能“看到”类B,则类B内的方法和变量的访问级别无关紧要,类A将没有任何办法访问那些方法和变量。

十五、33.String StringBuffer有什么差别?在什么情况下使用它们?

区别

1.String是字符串常量,一旦创建就不能修改,每次对String操作都是产生一个新的字符串对象;

2.StringBufferStringBuilder是字符串可变量,可以修改,操作的始终是原对象。但是StringBuffer是线程安全的(效率低),StringBuilder是线程不安全的(效率高)。

选择:如果很少修改,使用String,毕竟它最简单;
           如果经常修改,且是单线程,使用StringBuilder(最常用);
           如果经常修改,且是多线程,使用StringBuffer

十六、运行时异常与一般异常有何异同

Java提供了两类主要的异常:runtime exceptionchecked exception

1.checked exception:这种异常也就是我们经常遇到的IO异常,以及SQL异常等。对于这种异常,JAVA编译器强制要求我们必须进行catch。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。

2. runtime exception:也称运行时异常,是最常见的异常之一,不是必须处理的异常,比如:我们从来没有人去处理过NullPointerException异常。当出现这样的异常时,总是由虚拟机接管,系统会把异常一直往上层抛,直到遇到处理代码。如果没有处理代码,要么是线程中止,要么是主程序终止。

 

十七、ArrayListVector的区别,HashMapHashtable的区别?

ArrayListVector

1.同步性:Vector 线程安全,同步;ArrayList线程不安全,不同步。

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

HashMapHashtable

1.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMapJava 1.2引进的Map接口的一个实现类。

2.同步性Hashtable线程安全,同步;HashMap线程不安全,不同步。

3.值:HashMap允许空键控值。Hashtable不允许。

 

十八、LinkedListArrayList的区别?

1. LinkedList是基于链表实现;ArrayList是基于动态数组实现。

2.对于随机访问,ArrayList优于LinkedList。因为LinkedList要移动指针。

3.对于新增和删除操作,总体来说LinkedList要优于ArrayList。但并不是所有情况都优于ArrayList。比如,插入和删除单条数据和在末尾插入和删除数据ArrayList反而优于LinkedList

所以综合来说,随机访问比较多就用ArrayList。频繁插入和删除比较多就用LinkedList

 

十九、介绍JAVA开发中常用的Collection Frame Work(集合框架)?

Java中集合框架分为CollectionMap接口,Collection接口下的集合每个元素都由一个值组成,Map接口下的集合类每个元素都是由键值对组成。
1.Collection接口下面有ListSet接口,List接口下常见的实现类有ArrayListLinkedListVector。它们中的元素可以重复,并且是有序的。Set接口下常见的实现类有HashSetTreeSet。它们中的元素不能重复,并且是无序的。

2.Map接口下常见的实现类有:HashMapTreeMap。注意HashtableHashMap非常类似,但它是Dictionary的子类。

 

二十、在异常当中 throwthrows 有什么区别和联系?

1. throws 是方法修饰符,表示该方法有可能抛出某个异常,这时调用方就必须处理该异常。谁调用谁捕获。throw是关键字,表示显示抛出异常对象。

2. throws可单独使用。throw要么和try-catch-finally语句配套使用,要么与throws配套使用。

3. throws用在方法声明后,throw用在方法体内。

4. throws抛出的是类;throw抛出的是对象。


原创粉丝点击