1. Java 语言都有哪些特点?
答:Java 语言包含以下特点。
- 面向对象,程序容易理解、开发简单、方便;
- 跨平台,可运行在不同服务器类型上,比如:Linux、Windows、Mac 等;
- 执行性能好,运行效率高;
- 提供大量的 API 扩展,语言强大;
- 有多线程支持,增加了响应和实时交互的能力;
- 安全性好,自带验证机制,确保程序的可靠性和安全性。
2. Java 跨平台实现的原理是什么?
答:要了解 Java 跨平台实现原理之前,必须先要了解 Java 的执行过程,Java 的执行过程如下(详细过程见上一文):
Java 执行流程:Java 源代码(.java)-> 编译 -> Java 字节码(.class) ->通过 JVM(Java 虚拟机)运行 Java 程序。
每种类型的服务器都会运行一个 JVM,Java 程序只需要生成 JVM 可以执行的代码即可,JVM 底层屏蔽了不同服务器类型之间的差异,从而可以在不同类型的服务器上运行一套 Java 程序。
3. JDK、JRE、JVM 有哪些区别?
答:了解了 JDK、JRE、JVM 的定义也就明白了它们之间的区别,如下所述。
- JDK:Java Development Kit(Java 开发工具包)的简称,提供了 Java 的开发环境和运行环境;
- JRE:Java Runtime Environment(Java 运行环境)的简称,为 Java 的运行提供了所需环境;
- JVM:Java Virtual Machine(Java虚拟机)的简称,是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的,简单来说就是所有的 Java 程序都是运行在 JVM(Java 虚拟机)上的。
总体来说,JDK 提供了一整套的 Java 运行和开发环境,通常使用对象为 Java 的开发者,当然 JDK 也包含了 JRE;而 JRE 为 Java 运行的最小运行单元,一般安装在 Java 服务器上,所以 JDK 和 JRE 可以从用途上进行理解和区分。JVM 不同于 JDK 和 JRE,JVM 是 Java 程序运行的载体,Java 程序只有通过 JVM 才能正常的运行。
4. Java 中如何获取明天此刻的时间?
答:JDK 8 之前使用 Calendar.add()
方法获取,代码如下:
1 Calendar calendar = Calendar.getInstance(); 2 calendar.add(Calendar.DATE, 1); 3 System.out.println(calendar.getTime());
JDK 8 有两种获取明天时间的方法。
方法一,使用 LocalDateTime.plusDays()
方法获取,代码如下:
1 LocalDateTime today = LocalDateTime.now(); 2 LocalDateTime tomorrow = today.plusDays(1); 3 System.out.println(tomorrow);
方法二,使用 LocalDateTime.minusDays()
方法获取,代码如下:
1 LocalDateTime today = LocalDateTime.now(); 2 LocalDateTime tomorrow = today.minusDays(-1); 3 System.out.println(tomorrow);
minusDays()
方法为当前时间减去 n 天,传负值就相当于当前时间加 n 天。
5. Java 中如何跳出多重嵌套循环?
答:Java 中跳出多重嵌套循环的两种方式。
- 方法一:定义一个标号,使用 break 加标号的方式
- 方法二:使用全局变量终止循环
方法一,示例代码:
1 myfor:for (int i = 0; i < 100; i++) { 2 for (int j = 0; j < 100; j++) { 3 System.out.println("J:" + j); 4 if (j == 10) { 5 // 跳出多重循环 6 break myfor; 7 } 8 } 9 }
方法二,示例代码:
1 boolean flag = true; 2 for (int i = 0; i < 100 && flag; i++) { 3 for (int j = 0; j < 100; j++) { 4 System.out.println("J:" + j); 5 if (j == 10) { 6 // 跳出多重循环 7 flag = false; 8 break; 9 } 10 } 11 }
6. char 变量能不能存贮一个中文汉字?为什么?
答:char 变量可以存贮一个汉字,因为 Java 中使用的默认编码是 Unicode ,一个 char 类型占 2 个字节(16 bit),所以放一个中文是没问题的。
7. Java 中会存在内存泄漏吗?请简单描述一下。
答:会的,例如这种情况:一个不再被程序使用的对象或变量一直被占据在内存中就造成了内存泄漏。
Java 中的内存泄漏的常见情景如下:
- 长生命周期对象持有短生命的引用,比如,缓存系统,我们加载了一个对象放在缓存中,然后一直不使用这个缓存,由于缓存的对象一直被缓存引用得不到释放,就造成了内存泄漏;
- 各种连接未调用关闭方法,比如,数据库 Connection 连接,未显性地关闭,就会造成内存泄漏;
- (后两个有些难,慢慢来理解)
- 内部类持有外部类,如果一个外部类的实例对象的方法返回了一个内部类的实例对象,这个内部类对象被长期引用了,即使那个外部类实例对象不再被使用,但由于内部类持有外部类的实例对象,这个外部类对象将不会被垃圾回收,这也会造成内存泄露;
- 改变哈希值,当一个对象被存储进 HashSet 集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段了,否则对象修改后的哈希值与最初存储进 HashSet 集合中时的哈希值就不同了,在这种情况下,即使在 contains 方法使用该对象的当前引用作为的参数去 HashSet 集合中检索对象,也将返回找不到对象的结果,这也会导致无法从 HashSet 集合中单独删除当前对象,造成内存泄露。