Java面试题

2019-04-10  本文已影响0人  Arthur_Pluto

看到一篇不错的java面试题的文章,自己整理一下,作为备用吧!

Java面试题

面向对象的特征有哪些方面?

String是最基本的数据类型吗?

int 和 Integer 有什么区别?

String 和StringBuffer的区别?

运行时异常与一般异常有何异同?

说出ArrayList,Vector, LinkedList的存储性能和特性。

Collection 和 Collections的区别。

首先不要说成了一个是单数,一个是复数。。。

&和&&的区别

HashMap和Hashtable的区别

HashMap和Hashtable都实现了Map接口,都是键值对保存数据的方式

final, finally, finalize的区别

Overload和Override的区别,即重载和重写的区别。 Overloaded的方法是否可以改变返回值的类型?

Error和Exception有什么区别?

abstract class和interface有什么区别?

abstract class 抽象类和interface接口的区别

heap和stack有什么区别

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

GC是Garbage Collection的缩写,即垃圾回收 这里所谓的垃圾,指的是那些不再被使用的对象,JVM的垃圾回收机制使得开发人员从无聊、容易犯错的手动释放内存资源的过程中解放出来。 开发人员可以更加专注的进行业务功能的开发,而资源回收的工作交由更加专业的垃圾回收机制自动完成。

short s1 = 1; s1 = s1 + 1;有什么错?

short s1 = 1; //这一句没有错误,编译器会自动把1这个整数处理为short.
s1 = s1 + 1; //右侧的表达式会返回一个Int类型的整数,再把这个int类型的整数赋给short类型的s1的时候,就会出现强制转换错误

Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

Math.round 的意思是+0.5 取整数
所以 Math.round(11.5) 即 11.5+0.5 = 12
Math.round(-11.5) 即 -11.5+0.5 = -11

String s = new String("xyz");创建了几个String Object?

String s = new String("xyz");

首先构造方法 new String("xyz"); 中的"xyz" 这本身就是一个字符串对象 然后 new 关键字一定会创建一个对象 所以总共创建了两个String对象

Java有没有goto?

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

List, Set, Map是否继承自Collection接口?

List 和 Set 继承了Collection接口

但是Map和Collection之间没有继承关系,因为一个是键值对容器,一个是单值容器,无法兼容

1960.png

abstract的method是否可同时是static,是否可同时是synchronized?

数组有没有length()这个方法? String有没有length()这个方法?

Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?

以HashSet为例,判断重复的逻辑是:

  1. 首先看hashcode是否相同,如果不同,就是不重复的

  2. 如果hashcode一样,再比较equals,如果不同,就是不重复的,否则就是重复的。

构造器Constructor是否可被override?是否可以继承String类?

switch 是否能作用在byte上,是否能作用在long上,是否能作用在String上?

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

try里的return 和 finally里的return 都会执行,但是当前方法只会采纳finally中return的值

两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?

因为hashCode()方法和equals()方法都可以通过自定义类重写,是可以做到equals相同,但是hashCode不同的

但是,在Object类的equals()方法中有这么一段话

* Note that it is generally necessary to override the {@code hashCode}
* method whenever this method is overridden, so as to maintain the
* general contract for the {@code hashCode} method, which states
* that equal objects must have equal hash codes.

通常来讲,在重写这个方法的时候,也需要对hashCode方法进行重写,

以此来保证这两个方法的一致性——

当equals返回true的时候,这两个对象一定有相同的hashcode.

两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?

所以这个题的答案应该是否定的,但是得搞清楚里面的原委

垃圾回收的优点和原理。并考虑2种回收机制。

  1. 定时回收 每隔30分钟进行一次回收,这种机制的弊端是如果垃圾产生的比较快,有可能30分钟之内垃圾已经把内存占用光了,导致性能变慢

  2. 当垃圾占到某个百分比的时候,进行回收 比如,当垃圾占到70%的时候,进行回收。 这种机制的弊端是,如果垃圾产生的频率很快,那么JVM就必须高频率的进行垃圾回收。 而在垃圾回收的过程中, JVM会停顿下来,只做垃圾回收,而影响业务功能的正常运行。

一般说来 JVM会采用两种机制结合的方式进行垃圾回收。

你所知道的集合类都有哪些?主要方法?

常见的集合
ArrayList,LinkedList,HashSet,HashMap,TreeSet 等等
常见方法:
size()
add()
remove()
等等

char型变量中能不能存贮一个中文汉字?为什么?

char是16位的,占两个字节 汉字通常使用GBK或者UNICODE编码,也是使用两个字节 所以可以存放汉字

解析XML文档有哪几种方式?

主要是两种,SAX和DOM:

SAX 就是逐行读取,直到找到目标数据为止

DOM 是先全文档加载,然后读取

关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?

一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?

可以包括多个类,但是只能出现一个public修饰的类,但是可以出现多个非public修饰的类。

java中有几种类型的流?

Java中所有的流都是基于字节流,所以最基本的流是

以及一些其他的奇奇怪怪的流 ~~~

java中会存在内存泄漏吗,请简单描述。

因为Java是自动进行垃圾回收管理的,所以不存在 C语言中同等概念的内存泄漏,但是存在Java特色的内存泄漏

当某些对象不被使用,但是又有非直接引用指向的时候,那么就不满足垃圾回收的条件,而形成内存泄漏。

比如代码中的例子,每个Object创建的时候,有一个引用o指向,接着就被放进了集合al中。 下一个Object创建的时候,上一个Object就没有引用指向了。

这些Object都没有引用指向,但是却放在ArrayList中,而这个Arraylist忘记了回收,那么里面的所有对象,都会一直存活下去,虽然不再被使用了。

package exercise;
 
import java.util.ArrayList;
 
public class MemoryLeak {
    static ArrayList<Object> al = new ArrayList<Object>();
 
    public static void main(String[] args) {
 
        for (int i = 0; i < 100; i++) {
            Object o = new Object();
            al.add(o);
        }
 
    }
}

java中实现多态的机制是什么?

  1. 父类(接口)引用指向子类对象

  2. 方法有重写

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

什么是java序列化,如何实现java序列化?

是否可以从一个static方法内部发出对非static方法的调用?

在JAVA中,如何跳出当前的多重嵌套循环?

即能达到结束多重嵌套循环的效果

public class HelloWorld {
    public static void main(String[] args) {
        //打印单数    
        outloop: //outloop这个标示是可以自定义的比如outloop1,ol2,out5
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                System.out.println(i+":"+j);
                if(0==j%2) 
                    break outloop; //如果是双数,结束外部循环
            } 
        } 
    }
}

参考源:http://how2j.cn/k/j2se-interview/j2se-interview-java/624.html

上一篇 下一篇

猜你喜欢

热点阅读