Java经典面试题答案解析(1-80题)

2610次阅读  |  发布于4年以前

Java经典面试题答案解析(1-80题)

前言

前几天,在茫茫的互联网海洋中寻寻觅觅,把收藏的800道Java经典面试题都发出来,有小伙伴私聊我要答案。所以感觉没有答案的面试题是没有灵魂的,于是今天先整理基础篇的前80道答案出来哈~

所有的Java面试题已经上传github,答案也上传了一部分~

https://github.com/whx123/JavaHome/tree/master/Java%E9%9D%A2%E8%AF%95%E9%A2%98%E9%9B%86%E7%BB%93%E5%8F%B7

Java 基础

1. equals与==的区别

==

equals

2. final, finally, finalize 的区别

3. 重载和重写的区别

4. 两个对象的hashCode()相同,则 equals()是否也一定为 true?

两个对象equals相等,则它们的hashcode必须相等,如果两个对象的hashCode()相同,则equals()不一定为true。

hashCode 的常规协定:

5. 抽象类和接口有什么区别

6. BIO、NIO、AIO 有什么区别?

这个答案来自互联网哈,个人觉得是最好理解的~

  • BIO:线程发起 IO 请求,不管内核是否准备好 IO 操作,从发起请求起,线程一直阻塞,直到操作完成。

BIO 是一个连接一个线程。,NIO 是一个请求一个线程。,AIO 是一个有效请求一个线程。

  • BIO:同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。

7. String,Stringbuffer,StringBuilder的区别

String:

StringBuffer:

StringBuilder:

8. JAVA中的几种基本数据类型是什么,各自占用多少字节呢

基本类型位数字节
int324
short162
long648
byte81
char162
float324
double648
boolean
对于boolean,官方文档未明确定义,它依赖于 JVM 厂商的具体实现。逻辑上理解是占用 1位,但是实际中会考虑计算机高效存储因素

感兴趣的小伙伴,可以去看官网

9. Comparator与Comparable有什么区别?

在牛客网看到这道题的答案,觉得写的最好~

链接:https://www.nowcoder.com/questionTerminal/99f7d1f4f8374e419a6d6924d35d9530 来源:牛客网

10. String类能被继承吗,为什么。

首先,String是一个final修饰的类,final修饰的类不可以被继承。

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {

String类为什么不能被继承呢?

有两个原因:

11. 说说Java中多态的实现原理

举个例子吧,假设有个Fruit父类,一个taste味道方法,两个子类Apple和Pear,如下:

abstract class Fruit {
    abstract String taste() ;
}


class Apple extends Fruit {
    @Override
    String taste() {
        return "酸酸的";
    }
}


class Pear extends Fruit {
    @Override
    String taste() {
        return "甜甜的";
    }
}
public class Test {
    public static void main(String[] args) {
        Fruit f = new Apple();
        System.out.println(f.taste());
    }
}

程序运行,当调用对象Fruit f的方法taste时,JVM查找Fruit对象类的方法表以确定taste方法的直接引用地址,到底来自Apple还是Pear,确定后才真正调用对应子类的taste方法,

12. Java泛型和类型擦除

这个面试题,可以看我这篇文章哈~

Java程序员必备基础:泛型解析

13. int和Integer 有什么区别,还有Integer缓存的实现

这里考察3个知识点吧:

看个Integer的缓存的例子,加深一下印象哈:

Integer a = 10;
Integer b = 10;


Integer c = 129;
Integer d = 129;
System.out.println(a == b);
System.out.println(c == d);
输出结果:
true
false

14. 说说反射的用途及实现原理,Java获取反射的三种方法

这道面试题,看我这篇文章哈:谈谈Java反射:从入门到实践,再到原理

Java获取反射的三种方法

15. 面向对象的特征

面向对象的三大特征:

16. &和&&的区别

17. Java中IO流分为几种?

18. 讲讲类的实例化顺序,比如父类静态数据,构造函数,子类静态数据,构造函数。

直接看个例子吧:

public class Parent {
    {
        System.out.println("父类非静态代码块");
    }
    static {
        System.out.println("父类静态块");
    }
    public Parent() {
        System.out.println("父类构造器");
    }
}
public class Son extends Parent {
    public Son() {
        System.out.println("子类构造器");
    }
    static {
        System.out.println("子类静态代码块");
    }
    {
        System.out.println("子类非静态代码块");
    }
}
public class Test {
    public static void main(String[] args) {
        Son son = new Son();
    }
}

运行结果:

父类静态块
子类静态代码块
父类非静态代码块
父类构造器
子类非静态代码块
子类构造器

所以,类实例化顺序为:父类静态代码块/静态域->子类静态代码块/静态域 -> 父类非静态代码块 -> 父类构造器 -> 子类非静态代码块 -> 子类构造器

19. Java创建对象有几种方式

Java创建对象有5种方式

20. 如何将GB2312编码的字符串转换为ISO-8859-1编码的字符串呢?

public class Test {
    public static void main(String[] args) throws UnsupportedEncodingException {
        String str = "捡田螺的小男孩";
        String strIso = new String(str.getBytes("GB2312"), "ISO-8859-1");
        System.out.println(strIso);
    }
}

21. 守护线程是什么?用什么方法实现守护线程

22. notify()和 notifyAll()有什么区别?

23. Java语言是如何处理异常的,关键字throws、throw、try、catch、finally怎么使用?

这道面试题,可以看我这篇文章哈:Java程序员必备:异常的十个关键知识点

24. 谈谈Java的异常层次结构

从前从前,有位老人,他的名字叫Throwable,他生了两个儿子,大儿子叫Error,二儿子叫Exception

Error

表示编译时或者系统错误,如虚拟机相关的错误,OutOfMemoryError等,error是无法处理的。

Exception

代码异常,Java程序员关心的基类型通常是Exception。它能被程序本身可以处理,这也是它跟Error的区别。

它可以分为RuntimeException(运行时异常)和CheckedException(可检查的异常)。

常见的RuntimeException异常:

- NullPointerException 空指针异常
- ArithmeticException 出现异常的运算条件时,抛出此异常
- IndexOutOfBoundsException 数组索引越界异常
- ClassNotFoundException 找不到类异常
- IllegalArgumentException(非法参数异常)

常见的 Checked Exception 异常:

- IOException (操作输入流和输出流时可能出现的异常)
- ClassCastException(类型转换异常类)

25. 静态内部类与非静态内部类有什么区别

这道面试题,可以看我这篇文章哈:Java程序员必备基础:内部类解析

26. String s与new String与有什么区别

String str ="whx";
String newStr =new String ("whx");

String str ="whx"

先在常量池中查找有没有"whx" 这个对象,如果有,就让str指向那个"whx".如果没有,在常量池中新建一个“whx”对象,并让str指向在常量池中新建的对象"whx"。

String newStr =new String ("whx");

是在堆中建立的对象"whx" ,在栈中创建堆中"whx" 对象的内存地址。

如图所示:

网上这篇文章讲的挺好的:String和New String()的区别

27. 反射中,Class.forName和ClassLoader的区别

Class.forName和ClassLoader都可以对类进行加载。它们区别在哪里呢?ClassLoader负责加载 Java 类的字节代码到 Java 虚拟机中。Class.forName其实是调用了ClassLoader,如下:

这里面,forName0的第二个参数为true,表示对加载的类进行初始化化。其实还可以调用 Class<?>forName(Stringname,booleaninitialize,ClassLoaderloader)方法实现一样的功能,它的源码如下:

所以,Class.forName和ClassLoader的区别,就是在类加载的时候,class.forName有参数控制是否对类进行初始化。

28. JDK动态代理与cglib实现的区别

29. error和exception的区别,CheckedException,RuntimeException的区别。

Error: 表示编译时或者系统错误,如虚拟机相关的错误,OutOfMemoryError等,error是无法处理的。

Exception: 代码异常,Java程序员关心的基类型通常是Exception。它能被程序本身可以处理,这也是它跟Error的区别。

它可以分为RuntimeException(运行时异常)和CheckedException(可检查的异常)。常见的RuntimeException异常:

- NullPointerException 空指针异常
- ArithmeticException 出现异常的运算条件时,抛出此异常
- IndexOutOfBoundsException 数组索引越界异常
- ClassNotFoundException 找不到类异常
- IllegalArgumentException(非法参数异常)

常见的 Checked Exception 异常:

- IOException (操作输入流和输出流时可能出现的异常)
- ClassCastException(类型转换异常类)

有兴趣可以看我之前写得这篇文章:Java程序员必备:异常的十个关键知识点

30. 深拷贝和浅拷贝区别

浅拷贝

复制了对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意的值,另一个值都会随之变化。

深拷贝

将对象及值复制过来,两个对象修改其中任意的值另一个值不会改变

31. JDK 和 JRE 有什么区别?

32. String 类的常用方法都有那些呢?

33. 谈谈自定义注解的场景及实现

有关于注解,建议大家看一下java编程思想的注解篇章哈~

34. 说说你熟悉的设计模式有哪些?

设计模式分为三大类:

最好平时积累一下,单例模式(7种实现方式),工厂模式,模板方法设计模式,策略模式,装饰者模式、代理模式这几种怎么写吧~

35. 抽象工厂和工厂方法模式的区别?

可以看一下这篇文章介绍:抽象工厂模式-与-工厂方法模式区别

36. 什么是值传递和引用传递?

37. 可以在static环境中访问非static变量吗?

static变量在Java中是属于类的,它在所有的实例中的值是一样的。当类被Java虚拟机载入的时候,会对static变量进行初始化。因为静态的成员属于类,随着类的加载而加载到静态方法区内存,当类加载时,此时不一定有实例创建,没有实例,就不可以访问非静态的成员。类的加载先于实例的创建,因此静态环境中,不可以访问非静态!

38. Java支持多继承么,为什么?

不支持多继承,原因:

39. 用最有效率的方法计算2乘以8?

2 << 3

40. 构造器是否可被重写?

构造器是不能被继承的,因为每个类的类名都不相同,而构造器名称与类名相同,所以谈不上继承。又由于构造器不能被继承,所以相应的就不能被重写了。

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

在Java中,char类型占2个字节,而且Java默认采用Unicode编码,一个Unicode码是16位,所以一个Unicode码占两个字节,Java中无论汉子还是英文字母都是用Unicode编码来表示的。所以,在Java中,char类型变量可以存储一个中文汉字。

char ch = '啦';
System.out.println("char:" + ch);

42. 如何实现对象克隆?

43. object中定义了哪些方法?

44. hashCode的作用是什么?

  • hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的;

45. for-each与常规for循环的效率对比

关于这个问题,《Effective Java》给我们做的解答:

for-each能够让代码更加清晰,并且减少了出错的机会。下面的惯用代码适用于集合与数组类型:

for (Element e : elements) {
     doSomething(e); 
}

使用for-each循环与常规的for循环相比,并不存在性能损失,即使对数组进行迭代也是如此。实际上,在有些场合下它还能带来微小的性能提升,因为它只计算一次数组索引的上限。

46. 写出几种单例模式实现,懒汉模式和饿汉模式区别

7种:

可以看这篇文章:单例模式的七种写法

47. 请列出 5 个运行时异常。

- NullPointerException 空指针异常
- ArithmeticException 出现异常的运算条件时,抛出此异常
- IndexOutOfBoundsException 数组索引越界异常
- ClassNotFoundException 找不到类异常
- IllegalArgumentException(非法参数异常)

48. 2个不相等的对象有可能具有相同的 hashcode吗?

有可能哈~

hashCode 的常规协定:

49. 访问修饰符public,private,protected,以及default的区别?

50. 谈谈final在java中的作用?

51. java中的Math.round(-1.5) 等于多少呢?

JDK 中的 java.lang.Math 类:

52. String属于基础的数据类型吗?

String 不属于基础类型,基础类型有 8 种:byte、boolean、char、short、int、float、long、double,而 String 属于对象。

53. 如何将字符串反转呢?

54. 描述动态代理的几种实现方式,它们分别有什么优缺点

55. 在自己的代码中,如果创建一个java.lang.String类,这个类是否可以被类加载器加载?为什么。

不可以。因为JDK处于安全性的考虑,基于双亲委派模型,优先加载JDK的String类,如果java.lang.String已经加载,便不会再次被加载。

56. 谈谈你对java.lang.Object对象中hashCode和equals方法的理解。在什么场景下需要重新实现这两个方法。

  • 在我们的业务系统中判断对象时有时候需要的不是一种严格意义上的相等,而是一种业务上的对象相等。在这种情况下,原生的equals方法就不能满足我们的需求了,所以这个时候我们需要重写equals方法,来满足我们的业务系统上的需求。

57. 在jdk1.5中,引入了泛型,泛型的存在是用来解决什么问题。

Java 泛型(generics)是 JDK 5 中引入的一个新特性,其本质是参数化类型,解决不确定具体对象类型的问题。

这个面试题,可以看我这篇文章哈~Java程序员必备基础:泛型解析

58. 什么是序列化,怎么序列化,反序列呢?

可以看我这篇文章哈~ Java程序员必备:序列化全方位解析

59. java8的新特性。

60. 匿名内部类是什么?如何访问在其外面定义的变量呢?

匿名内部类就是没有名字的内部类,日常开发中使用的比较多。

public class Outer {


    private void test(final int i) {
        new Service() {
            public void method() {
                for (int j = 0; j < i; j++) {
                    System.out.println("匿名内部类" );
                }
            }
        }.method();
    }
 }
 //匿名内部类必须继承或实现一个已有的接口
 interface Service{
    void method();
}

匿名内部类还有以下特点:

可以看我这篇文章哈~Java程序员必备基础:内部类解析

61. break和continue有什么区别?

62. String s = "Hello";s = s + " world!";这两行代码执行后,原始的 String 对象中的内容是否会改变?

没有。因为 String 被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。

63. String s="a"+"b"+"c"+"d";创建了几个对象?

1个而已啦。

Java 编译器对字符串常量直接相加的表达式进行优化,不等到运行期去进行加法运算,在编译时就去掉了加号,直接将其编译成一个这些常量相连的结果。所以 "a"+"b"+"c"+"d" 相当于直接定义一个 "abcd" 的字符串。

64. try-catch-finally-return执行顺序

try-catch-finally-return 执行描述:

看一个例子

 public static void main(String[] args) throws IOException {
        System.out.println("result:" + test());
    }


    private static int test() {
        int temp = 1;
        try {
            System.out.println("start execute try,temp is:"+temp);
            return ++temp;
        } catch (Exception e) {
            System.out.println("start execute catch temp is: "+temp);
            return ++temp;
        } finally {
            System.out.println("start execute finally,temp is:" + temp);
            ++temp;
        }
    }

运行结果:

start execute try,temp is:1
start execute finally,temp is:2
result:2

分析:

65. Java 7新的 try-with-resources语句,平时有使用吗

try-with-resources,是Java7提供的一个新功能,它用于自动资源管理。

try-with-resources出现之前

try{
    //open resources like File, Database connection, Sockets etc
} catch (FileNotFoundException e) {
    // Exception handling like FileNotFoundException, IOException etc
}finally{
    // close resources
}

Java7, try-with-resources出现之后,使用资源实现

try(// open resources here){
    // use resources
} catch (FileNotFoundException e) {
    // exception handling
}
// resources are closed as soon as try-catch block is executed.

Java7使用资源demo

public class Java7TryResourceTest {
    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new FileReader(
                "C:/jaywei.txt"))) {
            System.out.println(br.readLine());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

使用了 try-with-resources的好处

66. 简述一下面向对象的”六原则一法则”。

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

68. 数组有没有length()方法?String有没有length()方法?

69. 是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?

不可以。

70. String s = new String("jay");创建了几个字符串对象?

一个或两个

可以看老王这篇文章,很清晰~别再问我 new 字符串创建了几个对象了!我来证明给你看!

71. this和super关键字的作用

this:

super:

72. 我们能将int强制转换为 byte类型的变量吗?如果该值大于byte 类型的范围,将会出现什么现象?

可以,我们可以做强制转换,但是在Java中,int是32位,byte是8位,如果强制做转化,int类型的高24位将会被丢弃。

public class Test {
    public static void main(String[] args)  {
        int a =129;
        byte b = (byte) a;
        System.out.println(b);
        int c =10;
        byte d = (byte) c;
        System.out.println(d);


    }
}

输出: -127 10

73. float f=3.4;正确吗?

不正确,精度不准确,应该用强制类型转换

74. 接口可否继承接口?抽象类是否可实现接口?抽象类是否可继承实体类?

都可以的

75. Reader和InputStream区别?

76. 列举出JAVA中6个比较常用的包

77. JDK 7有哪些新特性

78. 同步和异步有什么区别?

参考这篇文章~ 同步和异步的区别

79. 实际开发中,Java一般使用什么数据类型来代表价格?

java中使用BigDecimal来表示价格是比较好的。

可以看这篇文章,写得非常好老大说:谁要再用double定义商品金额,就自己收拾东西走

80. 64 位 JVM 中,int 的长度是多数?

int数据类型占4个字节 32位,跟JVM位数没关系的

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8