Java面试准备:15个Java面试问题

并非所有的访谈都将重点放在算法和数据结构上–通常,访谈通常只侧重于您声称是专家的语言或技术。在此类访谈中,通常没有任何“陷阱”问题,而是 它们要求您利用内存和使用该语言的经验-换句话说,它们测试您对编程语言的了解。

但是,忘记像Java这样的语言的所有来龙去脉很容易,因为简单地说,我们不会处理诸如“ JVM管理哪种内存?”之类的问题。 和“以示例描述多态”。 以一天为周期。

This post outlines some popular questions asked in a Java interview. Because Java specific questions can vary so much, this post acts as a guide to get you thinking about the different types of questions you can expect and what topics you should prepare for. If you’d like to see a complete guide to mastering the Java language, you can check out “Ťhe Definitive Java Interview Handbook”.

今天,我们将讨论与以下内容有关的面试问题和答案:

  • Java生态系统Java类介面遗产多线程内存管理馆藏异常处理序列化辛格尔顿

让我们开始吧!

Q1: What is meant by Java being platform independent?

Java按照一次编写即可在任何地方运行的原则工作。 编写Java程序后,它将被编译为字节码,然后可以在任何Java虚拟机或JVM上运行。

Alt Text

字节码的编译是Java互操作性背后的魔力。 不同的操作系统和硬件体系结构具有为自己定制的JVM,并且所有JVM都可以运行相同的字节码。 因此,如果您在Linux上编写Java程序,它将在为Windows操作系统设计的JVM上无缝运行,从而使代码与底层硬件和OS无关。

Q2: Explain the concepts of JRE, JDK, and JVM

  • JRE(Java运行时环境)包括Java虚拟机和标准Java API(核心类和支持文件)。 JRE包含的内容足以执行Java应用程序,但不足以对其进行编译。JDK(Java开发套件)是JRE加上Java编译器,以及一组其他工具来编译和调试代码。 JRE由Java平台库,Java虚拟机(JVM),Java插件和Java Web Start组成,以运行Java应用程序。 JRE作为独立版本不包含编译器和调试工具。 如果需要开发Java程序,则需要完整的Java SDK。 JRE不足以进行程序开发。 只有完整的Java SDK包含Java编译器,该编译器会将您的.java源文件转换为字节码.class文件。JVM(Java虚拟机)是规范的实现,详细说明了JVM的预期行为。 符合JVM规范的任何实现都应该能够运行编译为Java字节码的代码,而与最初编写代码的语言无关。 在Java编程语言中,首先将所有源代码编写为以.java扩展名结尾的纯文本文件。 然后,这些源文件由javac编译器编译为.class文件。 .class文件不包含处理器固有的代码。 相反,它包含字节码-Java虚拟机的机器语言。 然后,Java启动器工具将使用Java虚拟机的实例运行您的应用程序。

Q3: How would you mark an entity package private in Java?

对于私有包,没有明确的修饰符。 在没有任何修饰符的情况下,类或成员变量是程序包私有的。 标记为包私有的成员仅在其自己的包中可见。 考虑下面的类。

// class can be accessed by other classes within the same
// package but not outside of it.
class IamPackagePrivateClass {

   int IamPackagePrivate;
   private int IamPrivate;

   public IamPackagePrivate(int a, int b) {
      this.IamPackagePrivate = a;
      this.IamPrivate = b;
   }
}

私有包是私有的一种较宽泛的形式。 关于package-private的一件好事是,您可以使用它来授予对单元测试类本来认为私有的方法的访问权。 因此,如果您使用的帮助程序类没有其他用途,而是为了帮助您的公共类执行客户需要的事情,则有必要将它们打包为私有,这是您想要的,以使库用户尽可能简单。

Q4: Why should you avoid the finalize() method in the Object class? What are some alternatives?

Object类提供了一个回调方法finalize(),当该对象变为垃圾时可以在该对象上调用该方法。 对象对finalize()的实现没有任何作用-您可以覆盖finalize()进行清理,例如释放资源。

的finalize() method may be called automatically by the system, but when it is called, or even if it is called, is uncertain. Therefore, you should not rely on this method to do your cleanup for you. For example, if you don’t close file descriptors in your code after performing I/O and you expect finalize() to close them for you, you may run out of file descriptors.

以下是一些替代方案:

  • try-with-resources惯用法可以用来清理对象。 这需要实现AutoCloseable接口。垃圾回收对象时使用PhantomReference进行清理使用Cleaner类执行清除操作。实施关()方法,它将进行清理并记录该方法的调用。

Q5: Can you change the contents of a final array as shown in the code snippet below?

final int[] array = new int[5];
array[0] = 1;

它可能看起来违反直觉,但实际上我们可以更改数组的内容,即使它被标记为final。 数组变量指向内存中放置数组内容的特定起始位置。 位置或内存地址无法更改。 例如,以下代码将无法编译:

final int[] array = new int [5]
array = new int[10];

但是,以下代码将起作用。

public class FinalArrayExample {
  final int[] array = new int[5];

  // allowed
  void changeArrayContents(int i, int val) {
    array[i] = val;
  }

  // not allowed and will not compile
  /*

  void changeArray() {
    array = new int [10]

  }*/

}

Q6: Explain the difference between an interface and an abstract class? When should you use one or the other?

抽象类无法实例化,但可以被子类化。 抽象类通常包含抽象和非抽象方法,子类被迫为其提供实现。

接口是完全“抽象类”,用于将相关方法与空主体组合在一起。

以下是抽象类和接口之间的四个主要区别:

  • 抽象类可以具有最终变量,静态变量或类成员变量,而接口只能具有默认为final和static的变量。抽象类可以具有静态,抽象或非抽象方法。 接口可以具有静态,抽象或默认方法。抽象类的成员可以具有对私有,受保护或公共的不同可见性。 而在接口中,所有方法和常量都是公共的。一个类只能扩展另一个类,但是它可以实现多个接口。 同样,一个接口可以扩展多个接口。 接口从不实现类或接口。

当子类共享状态或使用通用功能时,请使用抽象类。 或者,您需要声明非静态,非最终字段,或者需要使用public以外的访问修饰符。

如果您期望不相关的类将实现您的接口,请使用接口。 例如,接口Comparable和Cloneable由许多不相关的类实现。 接口还用于需要类型的多重继承的实例中。

Q7: What is polymorphism? Can you give an example?

多态是在编程中针对不同的基础形式或数据类型呈现相同接口的能力。 多态是当您可以将对象视为某物的通用版本时,但是当您访问它时,代码确定它的确切类型并调用关联的代码。 这意味着多态性使您的代码可以与不同的类一起使用,而无需知道它正在使用哪个类。

多态性用于使应用程序更具模块化和可扩展性。 您可以创建根据需要选择的可互换对象,而不必使用混乱的条件语句来描述不同的操作过程。 这是多态性的基本目标。

多态的经典例子是形状类。 我们得出圈,三角形,and 长方形父类的类形状,which exposes an abstract method 画()。 派生类为以下项提供了自定义实现:画()方法。 现在,很容易通过调用以下命令来渲染所有包含在同一数组中的不同类型的形状画()每个对象的方法。 这样可以避免我们为每种形状创建单独的绘制方法,例如draw三角形(),draw圈()等等

Alt Text

Q8: Can the main method be overloaded?

是的,main方法是静态方法,可以重载。 但只有公共静态void main(String [] args)即使您指定一个或两个命令行参数,在JVM启动您的类时也会使用。 但是,可以以编程方式调用main方法的重载版本。

Q9: How can you pass multiple arguments to a method on each invocation call?

我们可以使用varargs功能将可变数量的参数传递给方法。 下面是将相同类型的多个参数传递给方法的示例。

public void childrenNames(string... names) {
   for(int i= 0; i < names.length; i++)
   system.out.println(names[i]);

}
  • 类型名称后跟三个点,一个空格,然后是变量名称。varargs变量被视为数组。varargs变量必须出现在方法签名的最后。由于上述原因,方法签名中只能有一个变量。

可以按以下方式调用上述方法:调用Varargs方法

childrenNames();
childrenNames("Jane");
childrenNames("Jane", "Tom", "Peter");

Q10: Can a semaphore act as a mutex?

如果信号量可以发出的许可数设置为1,则它有可能充当互斥量。但是,两者之间最重要的区别是,在互斥量的情况下,同一线程必须调用Acquisition并随后释放 互斥锁,而在二进制信号量的情况下,不同的线程可以在信号量上调用获取和释放。

这将我们引向“所有权”的概念。 互斥锁由获取它的线程拥有,直到它释放为止,而对于信号量则没有所有权的概念。

Need a refresher on multithreading? Check out this article “Java Multithreading and Concurrency: What to know to crack a senior engineering interview”.

Q11: Explain the Externalizable interface

Serializable接口为我们的类对象提供自动序列化功能。 另一方面,Externalizable接口提供了一种实现自定义序列化机制的方法。 实现Externalizable接口的类负责保存和还原其自己实例的内容。

Externalizable接口扩展了Serializable接口,并提供了两种方法来序列化和反序列化对象,writeExternal()和readExternal()。

Q12: If a code block throws more than one exception, how can it be handled?

一段代码片段引发的多种类型的异常可以由多个catch块子句后跟try块来处理。 下面是一个示例异常处理片段:

void process(int val)  {
   try {
        if (val == 1)
            //checked exception
            throw new FileNotFoundException();

        if (val == 2)
            // runtime exception
            throw new NullPointerExxception();

        if (val == 3)
            // error exception
            throw new StackOverflowError

   } catch (RuntimeException re) {
            // catches all unchecked  exceptions

   } catch (Exception e) {
            // catches all checked exceptions

   } catch (Error err) {
            // catches all errors

   }

}

Q13: If you were to use a set, how would you determine between a HashSet and a TreeSet?

最初,您可能希望使用HashSet,因为它会给您带来更好的时间复杂性,但是不能保证该集的迭代顺序。 特别是,它不能保证顺序会随着时间的推移保持恒定。

因此,如果您想保持顺序,最好使用TreeSet,因为它以升序而不是按插入顺序存储键。 它不是线程安全的。 但是,请记住,TreeSet不是线程安全的,而HashSet是线程安全的。

Q14: What are a few ways you can improve the memory footprint of a Java application?

您可以采取以下三个关键步骤来改善内存占用量:

  • 限制局部变量的范围。 每次弹出堆栈顶部的作用域时,该作用域中的引用都会丢失,这会使对象有资格进行垃圾回收。不需要时将变量引用显式设置为null。 这将使对象符合垃圾收集的条件。避免终结器。 它们会降低程序性能,并且不能保证任何事情。

Q15: What is the best way to implement a singleton class?

根据乔什·布洛赫(Josh Bloch),实现单例的最佳方法是为单例使用枚举类型。 因为Java确保只创建一个枚举实例,所以通过枚举实现的单例类可以免受反射和序列化攻击。

class Demonstration {
    public static void main( String args[] ) {
        Superman superman = Superman.INSTANCE;
        superman.fly();
    }
}

enum Superman {
    INSTANCE;

    private final String name = "Clark Kent";
    private String residence = "USA";

    public void fly() {
        System.out.println("I am flyyyyinggggg ...");
    }
}

Gaining a mastery

这篇文章涵盖了很多有关Java编程语言的内容,从Java生态系统(问题1)到多线程(问题10)和异常(问题12)不等。 这些是您可以期望的Java面试问题的类型。 最好将上述材料用作您要学习的主题和可能遇到的问题类型的指南。

However, the material here just scratches the surface. There are many more concepts to revisit or explore like object-oriented programming, static variables, and method overloading. If you’d like to take a deep dive into Java and explore hundreds of more questions about the topics mentioned above then “The Definitive Java Interview Handbook” is going to be a great resource to get you refreshed on the core java principles — everything from the basics to more advanced functionality.

学习愉快!

from: https://dev.to//educative/java-interview-prep-15-java-interview-questions-i64

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值