• 互联网Java工程师面试题·Java 总结篇·第四弹


    目录

    31、String s = new String(“xyz”);创建了几个字符串对象?

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

    33、一个”.java”源文件中是否可以包含多个类(不是内部类)?有什么限制?

    34、Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口?

    35、内部类可以引用它的包含类(外部类)的成员吗?有没有什么限制?

    36、Java 中的 final 关键字有哪些用法?

    37、指出下面程序的运行结果

    38、数据类型之间的转换:

    39、如何实现字符串的反转及替换?

    40、怎样将 GB2312 编码的字符串转换为 ISO-8859-1 编码的字符串?

    41、日期和时间:

    42、打印昨天的当前时刻。

    43、比较一下 Java 和 JavaSciprt。

    44、什么时候用断言(assert)?

    45、Error 和 Exception 有什么区别?

    46、try{}里有一个 return 语句,那么紧跟在这个 try 后的finally{}里的代码会不会被执行,什么时候被执行,在 return前还是后?


    31、String s = new String(“xyz”);创建了几个字符串对象?

    两个对象,一个是静态区的”xyz”,一个是用 new 创建在堆上的对象。


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

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


    33、一个”.java”源文件中是否可以包含多个类(不是内部类)?有什么限制?

    可以,但一个源文件中最多只能有一个公开类(public class)而且文件名必须和公开类的类名完全保持一致。


    34、Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口?

    可以继承其他类或实现其他接口,在 Swing 编程和 Android 开发中常用此方式来实现事件监听和回调。


    35、内部类可以引用它的包含类(外部类)的成员吗?有没有什么限制?

    一个内部类对象可以访问创建它的外部类对象的成员,包括私有成员。


    36、Java 中的 final 关键字有哪些用法?

    (1)修饰类:表示该类不能被继承;

    (2)修饰方法:表示方法不能被重写;

    (3)修饰变量:表示变量只能一次赋值以后值不能被修改(常量)。


    37、指出下面程序的运行结果

    1. class A {
    2. static {
    3. System.out.print("1");
    4. }
    5. public A() {
    6. System.out.print("2");
    7. }
    8. }
    9. class B extends A{
    10. static {
    11. System.out.print("a");
    12. }
    13. public B() {
    14. System.out.print("b");
    15. }
    16. }
    17. public class Hello {
    18. public static void main(String[] args) {
    19. A ab = new B();
    20. ab = new B();
    21. }
    22. }

    执行结果:1a2b2b。创建对象时构造器的调用顺序是:先初始化静态成员,然后调用父类构造器,再初始化非静态成员,最后调用自身构造器。

    提示:如果不能给出此题的正确答案,说明之前第 21 题 Java 类加载机制还没有完全理解,赶紧再看看吧。


    38、数据类型之间的转换:

    如何将字符串转换为基本数据类型?

    如何将基本数据类型转换为字符串?

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

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


    39、如何实现字符串的反转及替换?

    方法很多,可以自己写实现也可以使用 String 或 StringBuffer/StringBuilder 中的方法。有一道很常见的面试题是用递归实现字符串反转,代码如下所示:

    1. public static String reverse(String originStr) {
    2. if(originStr == null || originStr.length() <= 1)
    3. return originStr;
    4. return reverse(originStr.substring(1)) + originStr.charAt(0);
    5. }

    40、怎样将 GB2312 编码的字符串转换为 ISO-8859-1 编码的字符串?

    代码如下所示:

    1. String s1 = "你好";
    2. String s2 = new String(s1.getBytes("GB2312"), "ISO-8859-1");

    41、日期和时间:

    如何取得年月日、小时分钟秒?

    如何取得从 1970 年 1 月 1 日 0 时 0 分 0 秒到现在的毫秒数?

    如何取得某月的最后一天?

    如何格式化日期?

    问题 1:创建 java.util.Calendar 实例,调用其 get()方法传入不同的参数即可获得参数所对应的值。Java 8 中可以使用 java.time.LocalDateTimel 来获取,代码如下所示。

    1. public class DateTimeTest {
    2. public static void main(String[] args) {
    3. Calendar cal = Calendar.getInstance();
    4. System.out.println(cal.get(Calendar.YEAR));
    5. System.out.println(cal.get(Calendar.MONTH));
    6. System.out.println(cal.get(Calendar.DATE));
    7. System.out.println(cal.get(Calendar.HOUR_OF_DAY));
    8. System.out.println(cal.get(Calendar.MINUTE));
    9. System.out.println(cal.get(Calendar.SECOND));
    10. LocalDateTime dt = LocalDateTime.now();
    11. System.out.println(dt.getYear());
    12. System.out.println(dt.getMonthValue());
    13. System.out.println(dt.getDayOfMonth());
    14. System.out.println(dt.getHour());
    15. System.out.println(dt.getMinute());
    16. System.out.println(dt.getSecond());
    17. }
    18. }

    问题 2:以下方法均可获得该毫秒数。

    1. Calendar.getInstance().getTimeInMillis();
    2. System.currentTimeMillis();
    3. Clock.systemDefaultZone().millis(); // Java 8

    问题 3:代码如下所示。

    1. Calendar time = Calendar.getInstance();
    2. time.getActualMaximum(Calendar.DAY_OF_MONTH);

    问题 4:利用 java.text.DataFormat 的子类(如 SimpleDateFormat 类)中的format(Date)方法可将日期格式化。Java 8 中可以用java.time.format.DateTimeFormatter 来格式化时间日期,代码如下所示。

    1. import java.text.SimpleDateFormat;
    2. import java.time.LocalDate;
    3. import java.time.format.DateTimeFormatter;
    4. import java.util.Date;
    5. class DateFormatTest {
    6. public static void main(String[] args) {
    7. SimpleDateFormat oldFormatter = new
    8. SimpleDateFormat("yyyy/MM/dd");
    9. Date date1 = new Date();
    10. System.out.println(oldFormatter.format(date1));
    11. // Java 8
    12. DateTimeFormatter newFormatter =
    13. DateTimeFormatter.ofPattern("yyyy/MM/dd");
    14. LocalDate date2 = LocalDate.now();
    15. System.out.println(date2.format(newFormatter));
    16. }
    17. }

    补充:Java 的时间日期 API 一直以来都是被诟病的东西,为了解决这一问题,Java8 中引入了新的时间日期 API,其中包括 LocalDate、LocalTime、LocalDateTime、Clock、Instant 等类,这些的类的设计都使用了不变模式,因此是线程安全的设计。


    42、打印昨天的当前时刻。

    1. import java.util.Calendar;
    2. class YesterdayCurrent {
    3. public static void main(String[] args){
    4. Calendar cal = Calendar.getInstance();
    5. cal.add(Calendar.DATE, -1);
    6. System.out.println(cal.getTime());
    7. }
    8. }
    Java 8 中,可以用下面的代码实现相同的功能。
    1. import java.time.LocalDateTime;
    2. class YesterdayCurrent {
    3. public static void main(String[] args) {
    4. LocalDateTime today = LocalDateTime.now();
    5. LocalDateTime yesterday = today.minusDays(1);
    6. System.out.println(yesterday);
    7. }
    8. }

    43、比较一下 Java 和 JavaSciprt。

    JavaScript 与 Java 是两个公司开发的不同的两个产品。Java 是原 Sun Microsystems 公司推出的面向对象的程序设计语言,特别适合于互联网应用程序开发;而 JavaScript 是 Netscape 公司的产品,为了扩展 Netscape 浏览器的功能而开发的一种可以嵌入 Web 页面中运行的基于对象和事件驱动的解释性语言。

    JavaScript 的前身是 LiveScript;而 Java 的前身是 Oak 语言。

    下面对两种语言间的异同作如下比较:

    基于对象和面向对象:Java 是一种真正的面向对象的语言,即使是开发简单的程序,必须设计对象;JavaScript 是种脚本语言,它可以用来制作与网络无关的,与用户交互作用的复杂软件。它是一种基于对象(Object-Based)和事件驱动(Event-Driven)的编程语言,因而它本身提供了非常丰富的内部对象供设计人员使用。

    解释和编译:Java 的源代码在执行之前,必须经过编译。JavaScript 是一种解释性编程语言,其源代码不需经过编译,由浏览器解释执行。(目前的浏览器几乎都使用了 JIT(即时编译)技术来提升 JavaScript 的运行效率)

    强类型变量和类型弱变量:Java 采用强类型变量检查,即所有变量在编译之前必须作声明;JavaScript 中变量是弱类型的,甚至在使用变量前可以不作声明,JavaScript 的解释器在运行时检查推断其数据类型。

    代码格式不一样。

    补充:上面列出的四点是网上流传的所谓的标准答案。其实 Java 和 JavaScript最重要的区别是一个是静态语言,一个是动态语言。目前的编程语言的发展趋势是函数式语言和动态语言。在 Java 中类(class)是一等公民,而 JavaScript 中函数(function)是一等公民,因此 JavaScript 支持函数式编程,可以使用 Lambda函数和闭包(closure),当然 Java 8 也开始支持函数式编程,提供了对 Lambda表达式以及函数式接口的支持。对于这类问题,在面试的时候最好还是用自己的语言回答会更加靠谱,不要背网上所谓的标准答案。


    44、什么时候用断言(assert)?

    断言在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。一般来说,断言用于保证程序最基本、关键的正确性。断言检查通常在开发和测试时开启。为了保证程序的执行效率,在软件发布后断言检查通常是关闭的。断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为 true;如果表达式的值为 false,那么系统会报告一个 AssertionError。断言的使用如下面的代码所示:

    assert(a > 0); // throws an AssertionError if a <= 0

    断言可以有两种形式:

    assert Expression1;

    assert Expression1 : Expression2 ;

    Expression1 应该总是产生一个布尔值。

    Expression2 可以是得出一个值的任意表达式;这个值用于生成显示更多调试信息的字符串消息。

    要在运行时启用断言,可以在启动 JVM 时使用-enableassertions 或者-ea 标记。

    要在运行时选择禁用断言,可以在启动 JVM 时使用-da 或者-disableassertions标记。要在系统类中启用或禁用断言,可使用-esa 或-dsa 标记。还可以在包的基础上启用或者禁用断言。

    注意:断言不应该以任何方式改变程序的状态。简单的说,如果希望在不满足某些条件时阻止代码的执行,就可以考虑用断言来阻止它。


    45、Error 和 Exception 有什么区别?

    Error 表示系统级的错误和程序不必处理的异常,是恢复不是不可能但很困难的情况下的一种严重问题;比如内存溢出,不可能指望程序能处理这样的情况;

    Exception 表示需要捕捉或者需要程序进行处理的异常,是一种设计或实现问题;也就是说,它表示如果程序运行正常,从不会发生的情况。

    面试题:2005 年摩托罗拉的面试中曾经问过这么一个问题“If a process reports a stack overflow run-time error, what’s the most possible cause?”,给了四个选项

    a. lack of memory;

    b. write on an invalid memory space;

    c.recursive function calling;

    d. array index out of boundary.

    Java 程序在运行时也可能会遭遇 StackOverflowError,这是一个无法恢复的错误,只能重新修改

    代码了,这个面试题的答案是 c。如果写了不能迅速收敛的递归,则很有可能引发栈溢出的错误,如下所示:

    1. class StackOverflowErrorTest {
    2. public static void main(String[] args) {
    3. main(null);
    4. }
    5. }

    提示:用递归编写程序时一定要牢记两点:

    1. 递归公式;

    2. 收敛条件(什么时候就不再继续递归)。


    46、try{}里有一个 return 语句,那么紧跟在这个 try 后的finally{}里的代码会不会被执行,什么时候被执行,在 return前还是后?

    会执行,在方法返回调用者前执行。

    注意:在 finally 中改变返回值的做法是不好的,因为如果存在 finally 代码块,try中的 return 语句不会立马返回调用者,而是记录下返回值待 finally 代码块执行完毕之后再向调用者返回其值,然后如果在 finally 中修改了返回值,就会返回修改后的值。显然,在 finally 中返回或者修改返回值会对程序造成很大的困扰,C#中直接用编译错误的方式来阻止程序员干这种龌龊的事情,Java 中也可以通过提升编译器的语法检查级别来产生警告或错误,Eclipse 中可以在如图所示的地方进行设置,强烈建议将此项设置为编译错误。


    要想了解更多:

    千题千解·Java面试宝典_时光の尘的博客-CSDN博客

  • 相关阅读:
    JDK8新特性之Stream流
    Java大厂面试题第2季
    Linux虚拟服务器-LVS-集群技术
    Android 设置中增加 OTG 开关以方便调试
    牛客练习赛100 A.小红的小桃子(exgcd)
    小孟再接盲盒小程序,3天开发完!
    用java代码实现security
    TCP/IP四层模型
    使用MapStruct忽略不映射的属性
    HTML+CSS跑马灯/流光字效果实例代码
  • 原文地址:https://blog.csdn.net/MANONGDKY/article/details/133859393