企业真题
一个”.java
”源文件中是否可以包括多个类?有什么限制
来源:明?数据
是!
一个源文件中可以声明多个类,但是最多只能有一个类使用 public
进行声明。且要求声明为 public
的类的类名与源文件名相同。
Java 的优势
来源:阿??巴
- 跨平台型
- 安全性高
- 简单性
- 高性能
- 面向对象性
- 健壮性
常用的几个命令行操作都有哪些?(至少 4 个)
来源:北京数字??
略
Java 中是否存在内存溢出、内存泄漏?如何解决?举例说明
来源:拼?多
存在!
内存溢出:
- 栈溢出:不正确的递归调用
- 堆溢出:大对象、大数组
内存泄漏:主要是因为不能正确释放不需要的资源,长生命周期对象持有短生命周期对象的引用。
- 静态字段:静态字段引起的内存泄漏比较常见,如果某个不需要的类中含有静态字段,那么就会造成内存泄漏。单例模式中如果持有其他的类引用就会造成内存泄漏,静态集合如
HashMap
、LinkedList
等持有的一些对象没有及时释放等。 - ThreadLocal:ThreadLocal 引用一个对象使用完成后并没有被及时 remove 掉,线程一直存活的情况下(使用线程池时)就会发生内存泄漏。
大多时候内存泄漏都是由于开发人员的代码错误导致的,要防止这种内存泄漏,就需要编写必要的代码来配合垃圾回收器释放资源。
避免 Java 内存泄漏的一些最佳实践
- 使用最新稳定版本的 Java
- 尽量减少使用静态变量,使用完之后及时赋值
null
,移除引用 - 明确对象的有效作用域,尽量缩小对象的作用域。局部变量回收会很快。
- 减少长生命周期对象持有短生命周期的引用
- 各种连接应该及时关闭(数据库连接,网络,IO 等)
- 使用内存泄漏检测工具,如 MAT、Visual VM、jprofile 等
- 避免在代码中使用
System.gc()
- 避免使用内部类
内存泄漏很难定位并修复,但是我们可以遵循以下几个步骤去定位并修复:
- 确定是否存在内存泄漏,启用详细的 GC 跟踪。
- 使用一些第三方插件进行分析(jprofile、Visual VM 等)
- 检查调用堆栈是否有未释放的引用(分析 GC 状态)
- 找出对象没有被垃圾回收的原因
- 编写代码手动删除此类对象
如何看待Java是一门半编译半解释型的语言
来源:携?
拓展练习
System.out.println()
和 System.out.print()
有什么区别?
System.out.println();
:在最后会加换行;可以不传参数,代码仅换行System.out.print()
; :不会加换行;不传参数会报错
一个”.java
”源文件中是否可以包括多个类?有什么限制?
答:可以。但最多只有一个类名声明为 public
,与文件名相同。
拓展:程序中若只有一个 public
修饰的类。那么类名与源文件名可否不一致?
答:不能。
Something
类的文件名叫 OtherThing.java
是否可以?
class Something {
public static void main(String[] something_to_do) {
System.out.println("Do something ...");
}
}
答案: 正确。从来没有人说过 Java 的 class
名字必须和其文件名相同。但 public class
的名字必须和文件名相同。
为什么要设置 path
?
答:目的是为了在控制台的任何文件路径下,都可以调用 JDK 指定目录下的所有指令。
JDK、JRE 和 JVM 的关系是什么?以及 JDK、JRE 包含的主要结构有哪些
- JDK 包含 JRE,JRE 包含 JVM。
- JDK = JRE + Java 开发工具
- JRE = JVM + Java SE 核心类库
请对 public static void main(String[] args)
的每一个单词做解释?
public
:公共的,用它修饰的类或成员在任意位置可见static
:静态的,用它修饰的方法,可以不用创建对象就可以调用void
:表示该方法没有返回值main
:Java 的主方法名,JavaSE 的程序入口String[]
:字符串数组,这是main
方法的形参类型,可以通过命令行参数传值- args:这是
main
方法的形参名,如果要在main
中使用命令行参数,可以遍历该args
数组。
说明:刚开始学习 Java 上面每个单词意思不需要掌握。只需要知道这是程序入口,先“死记硬背”下来即可。