2016年月薪过万的Java面试题及回答

更新时间:2023-07-12 19:45:07 阅读: 评论:0

凤箫吟
有关Java的一般问题
1. 什么是JVM? 为什么称Java为跨平台的编程语言?
Java虚拟机(Java Virtual Machine)是可以执行Java字节码的虚拟机,每个Java源文件将被编译成字节码文件,然后在JVM中执行。Java之所以被设计成可以在任意的平台运行,而不需要重写或者在不同的平台下重新编译,这些都要归功于Java虚拟机(JVM),因为JVM非常了解特定的指令的长度以及底层硬件平台的特殊性。
2. JDK和JRE之间的差异是什么?
Java运行环境(Java Runtime Enviroment) 是运行Java程序的基本的Java虚拟机,包括执行applet的浏览器插件。JDK (Java Development Kit) 是为了开发,编译和执行Java应用程序,针对Java的全功能的软件开发包,包含了JRE,编译器和工具(比如说  JavaDoc 和Java Debugger初中数学知识点总结及公式大全)。
3. “static” 关键字是什么意思?在Java里可以 override private 或 static 的方法吗? keyword mean ? Can you override private or static method in Java ?
static 关键字表示,访问这个成员变量或方法时,不必获取它属于的类的实例。
Java 里的 static 方法不能被 override,因为 override 的机制是运行时(runtime)的动态绑定,而 static 方法是在编译时静态绑定的。static 方法并不与任何类的具体实例有关,因此无法应用继承的概念。
4. 在静态方法里可以访问非静态变量吗?
Java 中的 static 变量归相应的类所有,它的值对于类的所有实例都是相同的。static 变量是在 JVM 加载类的时候初始化的。如果代码试图访问非静态的变量,而且不是通过类的实例去访问,编译器会报错,因为这些非静态变量还没有被创建呢,并且它们没有与实例相关联。
 
5. Java 支持哪些数据类型?什么是 Autoboxing 和 Unboxing?
mendJava语言支持的8个基本数据类型如下:
byte
short
int
long
float
double
boolean
char
Autoboxing 是指在基本数据类型和对应的包装(wrapper)类之间Java 编译器所做的自动转换。例如,编译器将 int 转换为 Integer,将 double 转换为 Double ,等等。逆向的转换称为 unboxing。
6. 在Java中什么是方法的 Override(覆盖) 和 Overload(重载)?
Java中方法的 overload 发生的条件是,同一个类里,有两个或以上的方法名称完全相同,但参数列表不同。另一方面,方法的 override 是指,子类重定义了父类里的同一个方法。Override 的方法必须方法名、参数列表和返回类型都完全相同。Override 的方法不会限制原方法的访问权限。
7.Java中构造函数、构造函数重载的概念和拷贝构造函数 
当类的对象被创建的时候,调用它的构造函数。每个类都有一个构造函数。如果程序员没有为类编写构造函数,Java编译器自动为类创建一个缺省的构造函数。 
构造函数重载和Java中函数重载类似,可以为同一个类创建不同的构造函数,每个构造函数必须拥有唯一的参数列表。 
Java与C++不同,它不支持拷贝构造函数,但是区别仅仅是,如果你没有编写类的拷贝构造函数,Java不会自动创建它。
8.Java支持多继承吗? 
Java不支持多继承,每个类只允许继承一个类,但是可以实现多个接口。 
9.接口和抽象类有什么不同?
Java同时提供和支持抽象类和接口,它们的实现有一些共同的特点,也有如下不同:
王菲歌曲大全
接口中所有的方法默认都是抽象的,而抽象类可以同时包含抽象和非抽象的方法。
湖北宜昌旅游景点大全一个类可以实现多个接口,但它只能继承一个抽象类。
一个类要实现某个接口,必须实现这个接口声明的所有方法。而一个类不需要实现抽象父类中声明的所有方法,不过,这时候这个类也必须声明为抽象类。
抽象类可以实现接口,而且不需要实现接口中的方法。
接口中声明的变量默认是final的,而抽象类可以包含非final的变量。
接口中的成员默认是public的,而抽象类的成员可以是private,protected,或public的。
接口是绝对抽象的,不可实例化,抽象类也不可以实例化,但可以在main方法中触发实例化(注:通过匿名类实现)。
也可以查阅       Abstract class and Interface differences for JDK 8     
10.传引用和传值 
当对象通过传值调用时,传递的是这个对象的一个拷贝。因此,即使函数修改这个对象,也不会影响原对象的值。  
当对象通过传引用调用时,对象本身没有被传递,而传递的是对象的一个引用。因此,外部函数对这个对象的修改,也会反映到任何出现这个对象的地方。   
Java 线程
11. 进程与线程的区别 ?
进程是一个程序的执行(即正在运行的程序), 然而线程是在进程中独立的执行序列. 一个进程可以包含很多线程. 线程有时被称为轻量级的进程.
12. 说下创建线程的不同方式. 你倾向于哪种方式并说明原因 ?
有三种创建线程的方式:
继承Thread类.
惠结构实现Runnable接口.
通过Executor框架创建线程池.
首选方式是实现Runnable接口, 因为它不需要继承Thread类. 当你的程序设计需要多继承时, 使用接口会有所帮助. 另外, 线程池效率是很高的, 并且实施起来也很简单.
13. 解释下可用的线程状态.
在执行期间, 线程会处于以下状态中的一种:
Runnable: 线程已准备就绪, 但没有立即运行.
Running: 处理器正在执行的线程代码.
Waiting: 处于阻塞状态的线程, 等待外部某种处理的结束.
Sleeping: 被强制休眠的线程.
Blocked on I/O: 等待I/O操作的完成.
97年现在多大Blocked on Synchronization: 等待取得线程锁.
Dead: 线程已经执行结束.
14. 同步方法与同步块的区别 ?
在Java程序中, 每个对象都拥有一个锁. 线程可以通过使用synchronized关键字来获取一个对象上的锁. synchronized关键字可以用于方法级别(粗粒度锁)或代码块级别(细粒度锁).
15. 在监视器中的线程同步是怎样发生的? 你可以使用哪些级别的同步 ?
JVM使用结合了监视器的锁. 监视器是一个守护者, 它看管一个同步代码的序列, 并且确保在一个时刻只能有一个线程执行同步代码片段. 每个监视器关联着一个对象引用. 只能得到锁的线程才可以执行同步代码.
16. 什么是死锁 ?
两个进程相互等待对方执行完毕时, 其结果是它们会永远等待下去.
17. 怎样确保N个线程访问N个资源时不会发生死锁 ?
使用N个线程时一个非常简单的避免死锁的方法是为所有的锁排序, 并强制每个线程也按那种方式排序. 这样, 如果所有线程以相同的顺序锁定和解锁互斥资源就不会发生死锁了.
Java Collections
18. Java Collections框架的基本接口 ?
Java Collections 框架 提供了一系列支持对象集合操作的设计良好的接口和类. Java Collections框架中最基础的接口是:
Collection, 表示一组对象(元素).
Set, 包含非重复元素的集合.
List, 包含非重复元素的有序集合.
Map, 包含非重复键的键值对的对象.
19. 为什么Collection没有继承Cloneable和Serializable接口 ?
Collection接口描述的是由元素组成的对象组. Collection的每一个具体实现可以选择自己的方式来管理元素. 一些集合允许存在重复键, 另一些则不允许.
当处理实际实现时复制和序列化的语义和效果才会起作用. 因此, 集合类的具体实现应该决定它们将怎样被复制和序列化.
金华有什么好玩的地方旅游景点
20. 什么是Iterator(叠代器) ?
Iterator接口提供了许多能够叠代集合的方法.每个java集合(Collection)都含有一个返回Iterator实例的iterator方法. 叠代器在叠代过程中能够移除底层集合中的元素.
21. Iterator 和ListIterator之间的不同 ?
它们之间的不同如下:
Iterator能够遍历Set和List集合, 而ListIterator只能用来遍历List.
Iterator只能正向遍历集合, 而ListIterator可以双向遍历List.
ListIterator实现了Iterator接口并提供了额外的功能, 例如添加元素, 替换元素, 取得上一个或上一个元素索引, 等等.
22. fail-fast与fail-safe的区别?
Iterator的fail_safe特性是对底层集合的拷贝进行操作, 因此对集合的任何改变都不会有影响. java.util包下的所有集合类是fail-fast的, 但urrent包下的集合类是fail-safe的. fail-fast叠代器会抛出ConcurrentModificationException, 而fail-safe叠代器不会抛出这种异常.
23. Java中的 HashMap 是怎么工作的?
Java 中的 HashMap 是用来存储键值对的。 HashMap 需要一个 hash 函数,它使用 hashCode 和 equals 方法,来进行 collection 中元素的保存和查找。调用 put 方法时,HashMap 会计算键(key)的 hash 值,然后将键值对存到 collection 的适当索引下。如果键已经存在,那么相应的值会更新。HashMap 的重要特征主要有它的容量,装载因子(load factor)和容量扩充(threshold resizing)。
24. hashCode() 和 equals() 方法重要性何在 ?
Java中的 HashMap 使用 hashCode 和 equals 方法来确定键值对的索引。根据键去查询对应的值时,同样会用到这两个方法。如果这两个方法没有正确实现,两个不同的键可能会产生相同的 hash 值,因此会被 collection 认为是相同的。并且,这两个方法在检测重复时也会用到。因此,这两个方法都要正确实现,对 HashMap 的正确性和效率都至关重要。
25.HashMap与HashTable之间有哪些不同?
HashMap、HashTable这两个类都实现了Map接口,因此有些非常相似的特征,但他们在以下特性中又有所不同:
HashMap的key与value都允许null值的存在,而HashTable则既不允许key为null,也不允许value为null。
HashTable是线程同步的,而HashMap则不是。因此,在单线程环境下HashMap是首选,而HashTable更适合在多线程环境下使用。
HashMap提供了它键的t集合,因此Java程序可以通过t进行迭代。因此,HashMap是快速失败的。另一方面,HashTable提供了它键的枚举。
HashTable类被当做遗留类(译者注:Java遗留类说明
26.Array与ArrayList间有什么不同?与ArrayList相比你什么时候会用Array?
Array与ArrayList类在以下特性中有所区别:
Arrays可以包含基础数据类型或者对象,而ArrayList只能包含对象。
Arrays有固定长度,而ArrayList长度则是动态的。
ArrayList类提供了更多的方法和特性,比如addAll,removeAll,iterator,等等
对于一个基础数据类型的list,集合框架使用了自动装箱去减少编码的工作。但针对固定长度的的基础数据类型,这种方法会使得它们变得更慢。
27.ArrayList与LinkedList间有什么不同?
ArrayList、LinkedList这两个类都实现了List接口,但他们以下特性中又有所不同:
ArrayList是基于索引的数据结构,底层由Array支持实现。它提供了以时间复杂度为O(1)的性能随机访问它的元素,另一方面,LinkedList以元素列表的方式来存储它的数据,每一个元素与它前一个和后一个元素都是相连的。对元素查询操作的时间复杂度为O(n).
对元素的插入、添加、移除操作,与ArrayList相比,LinkedList更快,因为,当一个元素被添加到集合内部的任意位置时,LinkedList不需要重新调整数组大小或者更新索引。
LinkedList比ArrayList消耗更多的内存,因为LinkedList中每一个节点都存储了两个引用,一个是它前一个元素,一个是它后一个元素
也可以查看我们的文章ArrayList vs. LinkedList
28. Comparable 和 Comparator 接口分别是什么 ? 列出它们的区别。
Java 提供的 Comparable 接口,其中只包含一个方法,就是 compareTo。这个方法会比较两个对象,从而得出它们的顺序关系。具体来说,它会返回一个负整数,零,或一个正整数,分别表示传入的对象小于,等于或大于已有的对象。
Java 提供的 Comparator 接口,包含两个方法,compare 和 equals 。compare 方法比较两个参数,得出它们的顺序关系。它会返回一个负整数,零,或一个正整数,分别表示第一个参数小于,等于或大于已有的对象。equals 方法有1个参数,它用来确定参数对象是否等于这个 camparator。这个方法仅在要比较的对象也是一个 comparator,同时它的序关系与这个 comparator 相同时,才会返回 true。

本文发布于:2023-07-12 19:45:07,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1093054.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:方法   对象   线程
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图