JavaRush /Java 博客 /Random-ZH /Java 开发人员访谈问答分析。第16部分

Java 开发人员访谈问答分析。第16部分

已在 Random-ZH 群组中发布
朋友你好!成为开发人员需要多长时间?我问了很多不同的人,听到了很多不同的答案。对于某些人来说,一个月可能就足够了,但对于其他人来说,甚至一年都不够。但我确信,无论你最初的能力如何,成为一名 Java 开发人员都是一条荆棘丛生的漫长道路。毕竟,重要的不是能力,而是顽强和努力。 Java 开发人员访谈问答分析。 第 16 部分 - 1因此,今天我们继续有目的地分析Java开发人员最热门的面试问题。研究它们会让你逐渐接近你所珍视的目标。让我们开始吧!

17. 给出Optional使用成功和不成功的例子

假设我们有一系列的值,我们通过这些值来遍历流,最后我们得到一些可选的结果:
Optional<String> stringOptional = Stream.of("a", "ab", "abc", "abcd")
   .filter(str -> str.length() >= 3)
   .findAny();
正如预期的那样,我们需要从这个Optional 中获取值。仅仅使用get()是一个不好的方法:
String result = stringOptional.get();
但是这个方法应该从Optional中获取值并将其返回给我们吗?这当然是真的,但如果它有意义的话。好吧,如果流中的值不同,并且最终我们收到一个空的Optional ,当我们尝试使用get()方法从中获取值时,将会抛出以下错误: Java 开发人员访谈问答分析。 第 16 - 2 部分这不好。在这种情况下,最好使用以下结构:
  1. String result = null;
    if (stringOptional.isPresent()) {
     stringOptional.get();
    }

    在本例中,我们检查该元素是否在Optional中。如果不是,则生成的字符串具有其旧值。

  2. String result = stringOptional.orElse("default value");

    在这种情况下,我们指定一些默认值,如果Optional为空,则将其赋予结果字符串。

  3. String result = stringOptional.orElseThrow(() -> new CustomException());

    在这种情况下,当Optional为空时,我们自己抛出异常。

这在应用程序中非常方便,例如使用 Spring JPA 方法 - findById(),它返回可选值。在这种情况下,通过此方法,我们尝试获取该值,如果不存在,我们会抛出一些运行时异常,该异常在控制器级别使用ExceptionHandler进行处理,并转换为状态为404 - NOT FOUND 的HTTP响应。 Java 开发人员访谈问答分析。 第 16 - 3 部分

18. 是否可以将 main 方法声明为final?

是的,当然,没有什么可以阻止我们将main()方法声明为Final。编译器不会产生错误。但值得记住的是,任何方法在声明为final之后都将成为最后一个方法——而不是被覆盖。虽然,谁会重新定义main??? Java 开发人员访谈问答分析。 第 16 - 4 部分

19. 是否可以导入同一个包/类两次?可能会产生什么后果?

是的你可以。结果?我们将有一些不必要的导入,Intelijj IDEA 将显示为灰色,即 没用过。 Java 开发人员访谈问答分析。 第 16 - 5 部分Java 开发人员访谈问答分析。 第 16 - 6 部分

20.什么是选角?我们什么时候可以得到 ClassCastException?

类型转换,或类型转换,是将一种数据类型转换为另一种数据类型的过程:手动(隐式类型转换)或自动(显式类型转换)。 Java 开发人员访谈问答分析。 第 16 - 7 部分自动转换由编译器执行,手动转换由开发人员执行。基元和类的类型转换有些不同,因此我们将分别考虑它们。 基本类型基本类型 自动转换 的示例:
int value = 17;
double convertedValue = value;
正如您所看到的,除了=符号之外,这里不需要其他操作。手动转换原始类型的 示例:
double value = 17.89;
int convertedValue = (int)value;
在这种情况下,我们可以观察到手动转换,它是使用(int)实现的,其中逗号后面的部分将被丢弃,convertedValue的值为 - 17。阅读本文中有关转换基本类型的更多信息。好吧,现在让我们继续讨论对象。 引用类型 对于引用类型,可以将后代类自动转换为父类。这也称为多态性。假设我们有一个继承自Cat类的Lion类。在这种情况下,自动转换将如下所示:
Cat cat = new Lion();
但对于显式强制转换,一切都会变得更加复杂,因为没有像基元那样切断多余的功能。只需进行形式的显式转换:
Lion lion= (Lion)new Cat();
你会得到一个错误: Java 开发人员访谈问答分析。 第 16 - 8 部分事实上,你可以向Lion后代类中添加原本不在Cat类中的方法,然后尝试调用它们,因为你的对象类型将变成Lion。嗯,这没有逻辑。因此,只有当原始对象是Lion类型但后来被强制转换为父类时,才可能进行类型缩小:
Lion lion = new Lion();
Cat cat = lion;
Lion newLion = (Lion)cat;
此外,为了提高可靠性,建议使用instanceOf构造对对象进行缩小转换:
if (cat instanceof Lion) {
 newLion = (Lion)new Cat();
}
在本文中 阅读有关引用类型转换的更多信息。

21.为什么现代框架主要只使用未经检查的异常?

我认为这都是因为处理检查的异常仍然是到处重复的意大利面条代码,但并不是在所有情况下都真正需要。 Java 开发人员访谈问答分析。 第 16 - 9 部分在这种情况下,在框架内部进行处理会更容易,以免再次将其转移到开发人员的肩上。是的,当然,可能会出现紧急情况,但是可以以更方便的方式处理这些相同的未经检查的异常,而无需费心在try-catch中进行处理,也无需通过方法进一步传递它们。只需将异常转换为 异常处理程序中的某些 HTTP 响应就足够了。

22.什么是静态导入?

当使用静态数据(方法、变量)时,您不能创建对象本身,而是通过类的名称来创建,但即使在这种情况下,我们也需要对该类的引用。一切都很简单:它是使用常规导入添加的。但是如果我们去使用静态方法而不写类名,就好像它是当前类的静态方法一样怎么办?这可以通过静态导入来实现!在这种情况下,我们必须编写静态导入和该方法的链接。例如,Math类的静态方法用于计算余弦值:
import static java.lang.Math.cos;
因此,我们可以在不指定类名的情况下使用该方法:
double result = cos(60);
我们还可以使用静态导入一次性加载类的所有静态方法:
import static java.lang.Math.*;
Java 开发人员访谈问答分析。 第 16 - 10 部分

23. hashCode() 和 equals() 方法之间有什么关系?

根据Oracle 的规定,规则是: 如果两个对象相等(即equals()方法返回true),则它们必须具有相同的哈希码。 同时,不要忘记两个不同的对象可以具有相同的哈希码。要理解为什么equals()hashCode()总是成对重写,请考虑以下情况:
  1. 这两种方法都被覆盖。

    在这种情况下,具有相同内部状态的两个不同对象将返回equals() - true,而hashCode()将返回相同的数字。

    事实证明,一切都没问题,因为规则正在被遵守。

  2. 这两种方法都不会被覆盖。

    在这种情况下,具有相同内部状态的两个不同对象在equals()时将返回false,因为比较是通过==运算符进行引用的。

    hashCode()方法也会返回不同的值(很可能),因为它生成内存位置地址的转换值。但对于同一个对象,这个值将是相同的,就像本例中的equals()仅当引用指向同一个对象时才会返回true 一样。

    事实证明,在这种情况下一切正常并且规则得到满足。

  3. 重写equals(),而不是重写hashCode()

    在这种情况下,对于具有相同内部状态的两个不同对象,equals()将返回true,而hashCode()将返回(很可能)不同的值。

    这是违反规则的,所以不建议这样做。

  4. equals()未被覆盖,hashCode()被覆盖。

    在这种情况下,对于具有相同内部状态的两个不同对象,equals()将返回false,而hashCode()将返回相同的值。

    存在违反规则的情况,因此方法不正确。

正如您所看到的,只有当equals()hashCode()都被重写或根本没有被重写 时,该规则才能执行。在本文中阅读有关equals()hashCode()Java 开发人员访谈问答分析。 第 16 - 11 部分的更多信息。

24.什么时候使用BufferedInputStream和BufferedOutputStream类?

InputStream用于从某个资源中逐字节读取数据,OutputStream用于逐字节写入数据。但字节到字节的操作可能非常不方便,并且需要额外的处理(以便正常读/写文本)。其实就是为了简化这样的字节记录,引入了BufferedOutputStream,并且引入了BufferedInputStream用于读取。这些类只不过是累积数据的缓冲区,允许您不是逐字节而是按整个数据包(数组)处理数据。创建时,BufferedInputStream在其构造函数中接收一个InputStream类型的实例,从中读取数据:
BufferedInputStream bufferedInputStream = new BufferedInputStream(System.in);
byte[] arr = new byte[100];
bufferedInputStream.read(arr);
System.in是一个从控制台读取数据的InputStream对象。也就是说,使用这个BufferedInputStream对象,我们可以通过将数据写入传递的数组来从InputStream中读取数据。这实际上是InputStream类的一种包装器。此示例中的arr 数组是从BufferedInputStream接收数据的数组。反过来,它使用另一个数组从InputStream读取数据,默认情况下该数组的大小为 2048 字节。BufferedOutputStream也是如此: OutputStream类型的实例必须传递给构造函数,我们将在整个数组中写入数据:
byte[] arr = "Hello world!!!".getBytes();
BufferedOutputStream bufferedInputStream = new BufferedOutputStream(System.out);
bufferedInputStream.write(arr);
bufferedInputStream.flush();
System.out是一个OutputStream对象,它将数据写入控制台。lush()方法将数据从BufferedOutputStream发送到OutputStream ,在进程中刷新BufferedOutputStream。如果没有这个方法,就不会记录任何内容。与前面的示例类似:arr是将数据写入BufferedOutputStream的数组。从那里,它们被写入到另一个数组中的OutputStream ,默认情况下,该数组的大小为 512 字节。在文章中阅读有关这两个类的更多信息。

25. java.util.Collection 和 java.util.Collections 类之间有什么区别?

Collection是一个接口,是集合层次结构的头部。它引入了允许您创建、包含和修改整个对象组的类。为此提供了许多方法,例如add()remove()contains()等。Collection类的主要接口:
  • Set是一个接口,描述包含无序唯一(非重复)元素的集合。

  • 列表是一个接口,描述存储有序对象序列的数据结构。这些对象接收它们自己的索引(编号),您可以使用它与它们交互:获取、删除、更改、覆盖。

  • 队列是一个接口,它描述了一种以队列形式存储元素的数据结构,遵循FIFO 先进先出的规则。

Java 开发人员访谈问答分析。 第 16 - 12 部分阅读有关集合的更多信息。 Collections是一个实用程序类,提供许多不同的实用程序方法。例如:
  • addAll(Collection<? super T> collection, T...element) - 将传递的T类型元素添加到collection中。

  • copy(List<? super T> dest, List<? extends T> src) - 将列表src中的所有元素复制到dest中的列表。

  • emptyList() - 返回一个空列表。

  • max(Collection<? extends T> collection, Comparator<? super T> comp) - 根据指定比较器指定的顺序返回给定集合的最大元素。

  • unmodificList(List<? extends T> list) - 返回传递列表的不可修改表示形式。

Collections中有很多这样各种方便的方法。 这些方法的完整列表可以在 Oracle 网站上Java 开发人员访谈问答分析。 第 16 - 13 部分找到。我说他们舒服并不是没有道理的。毕竟,它们都是静态的。也就是说,您不需要每次都创建此类的对象来调用其必要的方法。您只需输入类的名称,调用所需的方法并传递所有必需的参数。总而言之,Collection是集合框架的根接口。Collections是一个辅助类,用于更方便地处理属于集合结构中某个类型的对象。好了,这就是今天的全部内容。一切顺利!Java 开发人员访谈问答分析。 第 16 - 14 部分
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION