java基础常见面试题系列,41-50

10 篇文章 0 订阅

41、日期和时间:

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

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

public class DateTimeTest {
	public static void main(String[] args) {
		Calendar cal = Calendar.getInstance();
		System.out.println(cal.get(Calendar.YEAR));
		System.out.println(cal.get(Calendar.MONTH)); // 0 - 11
		System.out.println(cal.get(Calendar.DATE));
		System.out.println(cal.get(Calendar.HOUR_OF_DAY));
		System.out.println(cal.get(Calendar.MINUTE));
		System.out.println(cal.get(Calendar.SECOND));
// Java 8
		LocalDateTime dt = LocalDateTime.now();
		System.out.println(dt.getYear());
		System.out.println(dt.getMonthValue()); // 1 - 12
		System.out.println(dt.getDayOfMonth());
		System.out.println(dt.getHour());
		System.out.println(dt.getMinute());
		System.out.println(dt.getSecond());
	}
}

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

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

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

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

(4) 如何格式化日期?

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

import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Date;

class DateFormatTest {
	public static void main(String[] args) {
		SimpleDateFormat oldFormatter = new SimpleDateFormat("yyyy/MM/dd");
		Date date1 = new Date();
		System.out.println(oldFormatter.format(date1));
// Java 8
		DateTimeFormatter newFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
		LocalDate date2 = LocalDate.now();
		System.out.println(date2.format(newFormatter));
	}
}

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

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

import java.util.Calendar;
class YesterdayCurrent {
public static void main(String[] args){
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -1);
System.out.println(cal.getTime());
}
}
import java.time.LocalDateTime;
class YesterdayCurrent {
public static void main(String[] args) {
LocalDateTime today = LocalDateTime.now();
LocalDateTime yesterday = today.minusDays(1);
System.out.println(yesterday);
}
}

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 标记。还可以在包的基 础上启用或者禁用断言。

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

例子:

public class AssertionDemo {  
    //这个成员变量的值可以变,但最终必须还是回到原值5  
    static int i = 5;  
    public static void main(String[] args) {  
        assert i==6;  
        System.out.println("如果断言正常,我就被打印");  
    }  
}  

结果:

Exception in thread "main" java.lang.AssertionError
	at com.sunjianlong.july.Test.main(Test.java:34)

作用:

它主要使用在代码开发和测试时期,用于对某些关键数据的判断,如果这个关键数据不是你程序所预期的数据,程序就提出警告或退出。

使用:

run -->  run configurations  --> arguments -->   VM  arguments  : -ea  开启断言    -da关闭断言

开启后,下次运行就可以之间run了。

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。如果写了不能迅速收敛的递归,则很有可能引发 栈溢出的错误,如下所示:

class StackOverflowErrorTest {
public static void main(String[] args) {
main(null);
}
}

提示:用递归编写程序时一定要牢记两点:1. 递归公式;2. 收敛条件(什么时候 就不再继续递归)。

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

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

在 finally 中改变返回值的做法是不好的,因为如果存在 finally 代码块,try 中的 return 语句不会立马返回调用者,而是记录下返回值待 finally 代码块执行完 毕之后再向调用者返回其值,然后如果在 finally 中修改了返回值,就会返回修改 后的值。显然,在 finally 中返回或者修改返回值会对程序造成很大的困扰。

47、Java 语言如何进行异常处理,关键字:throws、throw、 try、catch、finally 分别如何使用?

Java 通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了 良好的接口。在 Java 中,每个异常都是一个对象,它是 Throwable 类或其子类 的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并可以对其进行处理。Java 的异常处理 是通过 5 个关键词来实现的:try、catch、throw、throws 和 finally。一般情况 下是用 try 来执行一段程序,如果系统会抛出(throw)一个异常对象,可以通过 它的类型来捕获(catch)它,或通过总是执行代码块(finally)来处理;try 用 来指定一块预防所有异常的程序;catch 子句紧跟在 try 块后面,用来指定你想要 捕获的异常的类型;throw 语句用来明确地抛出一个异常;throws 用来声明一个 方法可能抛出的各种异常(当然声明异常时允许无病呻吟);finally 为确保一段 代码不管发生什么异常状况都要被执行;try 语句可以嵌套,每当遇到一个 try 语 句,异常的结构就会被放入异常栈中,直到所有的 try 语句都完成。如果下一级的 try 语句没有对某种异常进行处理,异常栈就会执行出栈操作,直到遇到有处理这 种异常的 try 语句或者最终将异常抛给 JVM。

48、运行时异常与受检异常有何异同?

异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常 操作中可能遇到的异常,是一种常见运行错误,只要程序设计得没有问题通常就 不会发生。受检异常跟程序运行的上下文环境有关,即使程序设计无误,仍然可 能因使用的问题而引发。Java 编译器要求方法必须声明抛出可能发生的受检异常, 但是并不要求必须声明抛出未被捕获的运行时异常。异常和继承一样,是面向对 象程序设计中经常被滥用的东西,在 Effective Java 中对异常的使用给出了以下指 导原则:

 不要将异常处理用于正常的控制流(设计良好的 API 不应该强迫它的调 用者为了正常的控制流而使用异常)

 对可以恢复的情况使用受检异常,对编程错误使用运行时异常

 避免不必要的使用受检异常(可以通过一些状态检测手段来避免异常的发 生)

 优先使用标准的异常

 每个方法抛出的异常都要有文档

 保持异常的原子性

 不要在 catch 中忽略掉捕获到的异常

49、列出一些你常见的运行时异常?

 ArithmeticException(算术异常)  ClassCastException (类转换异常)  IllegalArgumentException (非法参数异常)  IndexOutOfBoundsException (下标越界异常)  NullPointerException (空指针异常)  SecurityException (安全异常)

50、阐述 final、finally、finalize 的区别。

 final:修饰符(关键字)有三种用法:如果一个类被声明为 final,意味 着它不能再派生出新的子类,即不能被继承,因此它和 abstract 是反义词。将 变量声明为 final,可以保证它们在使用中不被改变,被声明为 final 的变量必须 在声明时给定初值,而在以后的引用中只能读取不可修改。被声明为 final 的方 法也同样只能使用,不能在子类中被重写。 

 finally:通常放在 try…catch…的后面构造总是执行代码块,这就意味着 程序无论正常执行还是发生异常,这里的代码只要 JVM 不关闭都能执行,可以 将释放外部资源的代码写在 finally 块中。

 finalize:Object 类中定义的方法,Java 中允许使用 finalize()方法在垃 圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收 集器在销毁对象时调用的,通过重写 finalize()方法可以整理系统资源或者执行 其他清理工作。

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值