- [ 面试 ]

Java常见面试题

2021-02-21  本文已影响0人  好多可乐
1.String能被继承吗?为什么?

不可以,因为String类有final修饰符,而final修饰的类是不能被继承的

2.ArrayList 和 LinkedList 有什么区别。

ArrayList和LinkedList都实现了List接口,有以下的不同点:

1、ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)。

2、相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。

3、LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。

3.讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,当 new 的时候, 他们的执行顺序。

此题考察的是类加载器实例化时进行的操作步骤(加载–>连接->初始化)。

父类静态代变量、

父类静态代码块、

子类静态变量、

子类静态代码块、

父类非静态变量(父类实例成员变量)、

父类构造函数、

子类非静态变量(子类实例成员变量)、

子类构造函数。

4,抽象类和接口的区别?

1,结构:抽象类包含抽象方法,普通方法,常量,变量,构造方法。接口包含抽象方法,全局常量

2,定义:抽象类用abstract定义,接口用interface定义

3,子类:抽象类用extends实现,接口用implements实现

4,限制:一个类只能继承一个抽象类,接口是可以多继承的

5,关系:一个抽象类可以实现多个接口,接口不能继承抽象类,但是可以继承多个接口

6,实例化:二者都是通过子类实例化

7,特征:抽象类是模板设计模式,接口一种标准,能力

5,重载(Overload)和重写(Override)的区别?

重写:发生在继承关系中,一般是子类重写父类方法(比如toString方法), 返回值和形参都不能改变。即外壳不变,核心重写!

1,参数列表必须完全与被重写方法的相同。

2,返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类

3,访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected。

4,父类的成员方法只能被它的子类重写。

重载:方法名相同(不管它是什么类型的,只要方法名一样),参数不同(个数或者类型不一样)

1,被重载的方法必须改变参数列表(参数个数或类型不一样);

2,被重载的方法可以改变返回类型;

3,被重载的方法可以改变访问修饰符;

4,被重载的方法可以声明新的或更广的检查异常;

5,方法能够在同一个类中或者在一个子类中被重载。

6,无法以返回值类型作为重载函数的区分标准。

6,String和StringBuilder、StringBuffer的区别?

答:Java平台提供了两种类型的字符串:String和StringBuffer/StringBuilder,它们可以储存和操作字符串。其中String是只读字符串,也就意味着String引用的字符串内容是不能被改变的。而StringBuffer/StringBuilder类表示的字符串对象可以直接进行修改。StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer要高。

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

答:接口可以继承接口,而且支持多重继承。抽象类可以实现(implements)接口,抽象类可继承具体类也可以继承抽象类。

8,描述一下JVM加载class文件的原理机制?

答:JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java中的类加载器是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件中的类。类的加载是指把类的.class文件中的数据读入到内存中,通常是创建一个字节数组读入.class文件

9,数据类型之间的转换:

答: 调用基本数据类型对应的包装类中的方法parseXXX(String)或valueOf(String)即可返回相应基本类型;

一种方法是将基本数据类型与空字符串(”")连接(+)即可获得其所对应的字符串;另一种方法是调用String 类中的valueOf()方法返回相应字符串

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

答:List、Set 是,Map 不是。Map是键值对映射容器,与List和Set有明显的区别,而Set存储的零散的元素且不允许有重复元素(数学中的集合也是如此),List是线性结构的容器,适用于按数值索引访问元素的情形。

11,Collection和Collections的区别?

答:Collection是一个接口,它是Set、List等容器的父接口;Collections是个一个工具类,提供了一系列的静态方法来辅助容器操作,这些方法包括对容器的搜索、排序、线程安全化等等。

12,List、Map、Set三个接口存取元素时,各有什么特点?

答:List以特定索引来存取元素,可以有重复元素(有序可重复)。Set不能存放重复元素(无序不可重复)(用对象的equals()方法来区分元素是否重复)。Map保存键值对(key-value pair)映射,映射关系可以是一对一或多对一

13,== 和 equals 的区别是什么?

equals是比较具体的值是否相等,==比较的是内存地址

14,throw 和 throws 的区别?

throw:是真实抛出一个异常。

throws:是声明可能会抛出一个异常。

15,try-catch-finally 中哪个部分可以省略?

try-catch-finally 其中 catch 和 finally 都可以被省略,但是不能同时省略,也就是说有 try 的时候,必须后面跟一个 catch 或者 finally。

16, try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?

finally 一定会执行,即使是 catch 中 return 了,catch 中的 return 会等 finally 中的代码执行完之后,才会执行。

17,说一下堆栈的区别?

1,功能方面:堆是用来存放对象的,栈是用来执行程序的。

2,共享性:堆是线程共享的,栈是线程私有的。

3,空间大小:堆大小远远大于栈。

18,常见的异常类有哪些?

1,NullPointerException 空指针异常

2,ClassNotFoundException 指定类不存在

3,NumberFormatException 字符串转换为数字异常

4,IndexOutOfBoundsException 数组下标越界异常

5,ClassCastException 数据类型转换异常

6,FileNotFoundException 文件未找到异常

7,NoSuchMethodException 方法不存在异常

8,IOException IO 异常

9,SocketException Socket 异常

19,什么是反射?

反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。

反射有三种调用方式:

// 方法1: Class.forName("com.kola.java.lesson28.Student"); //方法2:类名.class Class clazz = Student.class; // 方法3:对象名.getClass Student student = new Student(); Class stuClass = student.getClass();

20,JDK 和 JRE 有什么区别?

1,JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java 的开发环境和运行环境。

2,JRE:Java Runtime Environment 的简称,Java 运行环境,为 Java 的运行提供了所需环境。

具体来说 JDK 其实包含了 JRE,同时还包含了编译 Java 源码的编译器 Javac,还包含了很多 Java 程序调试和分析的工具。简单来说:如果你需要运行 Java 程序,只需安装 JRE 就可以了,如果你需要编写 Java 程序,需要安装 JDK。

21,final 在 Java 中有什么作用?

1,final 修饰的类叫最终类,该类不能被继承。

2,final 修饰的方法不能被重写。

3,final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。

22,String 属于基础的数据类型吗?

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

23,抽象类必须要有抽象方法吗?

不需要,抽象类不一定非要有抽象方法

24,普通类和抽象类有哪些区别?

1,普通类不能包含抽象方法,抽象类可以包含抽象方法。

2,抽象类不能直接实例化,普通类可以直接实例化。

25,抽象类能使用 final 修饰吗?

不能,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产生矛盾,所以 final 不能修饰抽象类

26,java 中 IO 流分为几种?

按功能来分:输入流(input)、输出流(output)。

按类型来分:字节流和字符流。

字节流和字符流的区别是:字节流按 8 位传输以字节为单位输入输出数据,字符流按 16 位传输以字符为单位输入输出数据。

27,Java 容器都有哪些?

Java 容器分为 Collection 和 Map 两大类,其下又有很多子类,如下所示:

28,Array 和 ArrayList 有何区别?

1,Array 可以存储基本数据类型和对象,ArrayList 只能存储对象。

2,Array 是指定固定大小的,而 ArrayList 大小是自动扩展的。

3,Array 内置方法没有 ArrayList 多,比如 addAll、removeAll、iteration 等方法只有 ArrayList 有。

29,迭代器 Iterator 是什么?

Iterator 接口提供遍历任何 Collection 的接口。我们可以从一个 Collection 中使用迭代器方法来获取迭代器实例。迭代器取代了 Java 集合框架中的 Enumeration,迭代器允许调用者在迭代过程中移除元素。

30,Iterator 怎么使用?有什么特点?

Java中的Iterator功能比较简单,并且只能单向移动:

(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,公共基类Collection提供iterator()方法。

(2) 使用next()获得序列中的下一个元素。

(3) 使用hasNext()检查序列中是否还有元素。

(4) 使用remove()将迭代器新返回的元素删除。

Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。

List<String> list = new ArrayList<>(); Iterator<String> it = list. iterator(); while(it. hasNext()){ String obj = it. next(); System. out. println(obj); }

Iterator 的特点是更加安全,因为它可以确保,在当前遍历的集合元素被更改的时候,就会抛出 ConcurrentModificationException 异常。

31,并行和并发有什么区别?

1,并行:多个处理器或多核处理器同时处理多个任务。

2,并发:多个任务在同一个 CPU 核上,按细分的时间片轮流(交替)执行,从逻辑上来看那些任务是同时执行

32,线程和进程的区别?

一个程序下至少有一个进程,一个进程下至少有一个线程,一个进程下也可以有多个线程来增加程序的执行速度。

33,访问修饰符 public、private、protected、default 的作用域?

作用域 当前类 同包 子类 其他包

public √ √ √ √

protected √ √ √ ×

default √ √ × ×

private √ × × ×

34,请列出 5 个运行时异常。

Java.lang.ArithmeticException

Java.lang.ArrayStoreExcetpion

Java.lang.ClassCastException

Java.lang.IndexOutOfBoundsException

Java.lang.NullPointerException

35,Error与Exception的区别

java的异常一般分为2类,异常(exception)和错误(error),都继承自父类throwable

exception表示程序可以处理的情况,一般是直接处理或者抛出

error一般指跟虚拟机有关的严重问题,比如线程死锁,内存溢出等,遇到这种问题,建议直接关闭

exception分为2类:

编译时异常(继承自exception):找不到类ClassNotFoundException,找不到方法NoSuchmethodException,拒绝访问目标类IllegalAccessException

运行时异常(继承自runtimeexception):空指针,数组下标越界,类型转换异常,算数异常

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

泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数,泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,以提高代码的重用率

37,String 类的常用方法都有那些?

indexOf():返回指定字符的索引。

charAt():返回指定索引处的字符。

replace():字符串替换。

trim():去除字符串两端空白。

split():分割字符串,返回一个分割后的字符串数组。

getBytes():返回字符串的 byte 类型数组。

length():返回字符串长度。

toLowerCase():将字符串转成小写字母。

toUpperCase():将字符串转成大写字符。

substring():截取字符串。

equals():字符串比较。

38,List、Set、Map 之间的区别是什么?
image.png
39,如何实现数组和 List 之间的转换?

List转换成为数组:调用ArrayList的toArray方法。

数组转换成为List:调用Arrays的asList方法。

40,局部变量和全局变量的区别:

1,局部变量不能有修饰符,如public。全局变量可以有修饰符,如public,protetect,默认,private

2,局部变量需要初始化,全局变量不需要初始化,给的值为默认值

3,局部变量定义在方法内部,全局变量定义在方法外部

4,局部变量作用域是方法内部,全局变量作用域是整个类

41,while和do while的区别?

while是先判断,在确认是否需要执行,如果条件成立,继续执行循环体。

循环次数=判断次数-1,判断次数比循环次数+1

do--while,先执行,然后判断,如果条件成立,继续执行循环体

循环次数=判断次数

上一篇下一篇

猜你喜欢

热点阅读