十年开发经验集团老师给我测试面试JavaSE中的一些面试题

发布时间 2023-09-13 15:07:14作者: 琮墨

给我们上实训课的老师是学校请来的有着多年的实际开发经验的老师,我们进行了模拟面试,简单的问了几个JavaSE中的基础问题,当时我也只回答出来了一点点,只是浅谈了表面,没有实际深入应用,因为没有什么项目经验,也就只停留在懂得语法层面,根据记忆把当时给我面试老师出的题目分享给大家,附上我的理解

list与Set区别

List 和 Set 是 Java 集合中两个重要的接口,它们在数据存储、数据查找、数据操作等方面有以下几个不同点: 

1. 数据存储方式不同:List 是一个有序的 Collection,它允许存储重复的元素,每个元素都有一个对应的索引。而 Set 是一个不允许有重复元素的 Collection,它没有提供对元素的索引访问。

2. 数据访问方式不同:List 可以根据索引值(下标)访问元素,而 Set 没有提供类似索引的方式访问元素,只能通过遍历或迭代器来访问集合中的元素。 

3. 数据操作方式不同:List 提供了一系列操作元素的方法,如在指定索引处添加/删除某个元素,替换某个元素等;而 Set 只提供了添加/删除元素等方法,不支持操作指定索引位置的元素。

4. 内部实现机制不同:List 的实现有 ArrayList、LinkedList、Vector 等,底层数据结构各不相同;而 Set 的实现有 HashSet、TreeSet、LinkedHashSet 等,底层数据结构也各不相同。

以上是 List 和 Set 的主要不同点,开发者可以根据具体的业务场景和需求选择使用哪个集合接口。当需要按索引访问集合元素或元素可能重复时,建议使用 List;当不需要按索引访问集合元素或元素不需要重复时,可以使用 Set。

 

接口与抽象类的区别

相同点

(1)都不能被实例化 (2)接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化。

不同点

(1)接口只有定义,不能有方法的实现,java 1.8中可以定义default方法体,而抽象类可以有定义与实现,方法可在抽象类中实现。

(2)实现接口的关键字为implements,继承抽象类的关键字为extends。一个类可以实现多个接口,但一个类只能继承一个抽象类。所以,使用接口可以间接地实现多重继承。

(3)接口强调特定功能的实现,而抽象类强调所属关系。

(4)接口成员变量默认为public static final,必须赋初值,不能被修改;其所有的成员方法都是public、abstract的。抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号。

 

谈谈你对泛型的理解

  泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。

泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。

 

增强for循环格式

  在某些情况下,常规的遍历方式容易显得代码臃肿,增强for可以简化数组和集合的遍历增强代码的可读性

  增强for格式:

  for (数据类型 变量名 : 数组或者集合对象) {

               //循环体

       }

 

用过Stream流吗

Stream 流是 Java 8 新提供给开发者的一组操作集合的 API,将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选、排序、聚合等。元素流在管道中经过中间操作(intermediate operation)的处理,最后由终端操作 (terminal operation) 得到前面处理的结果。Stream 流可以极大的提高开发效率,也可以使用它写出更加简洁明了的代码。

Stream<T> filter(Predicate<? super T> predicate);
-----> 参数:public interface Predicate<T> (函数式接口)
----> 抽象方法:boolean test(T t);
-----> 参数:public interface Consumer<T> (函数式接口)
----> 抽象方法:boolean test(T t);

整体代码看来:流式思想 类似于 工厂车间的“流水线”

 

会写Lambda表达式吗

Lambda表达式是JDK1.8之后的一种语法,是一个匿名函数,是对匿名函数的简写形式,我们可以把 Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递),可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升;他的写法是使用一个->符号,箭头将Lambda表达式分为左右两部分,左边写的是实现的这个接口中的抽象方法中的形参列表,右边就是对抽象方法的处理;

Lambda标准形式:(参数类型 参数名称) ‐> { 代码语句 }

 

你怎么理解多态

多态是Java面向对象三个特征中的一个也是做主要的一个,所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。
多态分为编译时多态和运行时多态。其中编译时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的函数,通过编辑之后会变成两个不同的函数,在运行时谈不上多态。而运行时多态是动态的,它是通过动态绑定来实现的,也就是我们所说的多态性。

多态的好处

可替换性:多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
可扩充性:多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
接口性:多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。
灵活性:它在应用中体现了灵活多样的操作,提高了使用效率。
简化性:多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

会写冒泡排序吗

 1 int temp;
 2 for (int i = 0; i < arr.length-1; i++) {
 3         for (int j = 0; j < arr.length-1-i; j++){
 4             if (arr[j]>arr[j+1]){
 5                 temp = arr[j];
 6                 arr[j] = arr[j+1];
 7                 arr[j+1] = temp;
 8             }
 9         }
10     }            

 

希望看完这些问题,对于刚学完JavaSE的同学能有所帮助