Java常见基础笔试+面试题

Java常见基础面试题总结

原:https://blog.csdn.net/qq_16633405/article/details/79211002

1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?JVM、JDK、JRE之间的关系和区别?

Java虚拟机(JVM)是一个可以执行Java字节码的虚拟机进程。Java源文件(.class文件)被编译成能被Java虚拟机执行的字节码文件

JDK(Java Development Kit):Java开发工具包,其中的两个目录bin+lib,bin里面是jvm,lib里面是类库,针对的是开发人员。

JRE(Java Runtime Environment):Java运行环境,针对的是使用java程序的用户。

关系:JDK>JRE>JVM。

JDK:

JRE:

JVM:

2.“static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?

“static”关键字表明一个成员变量或者成员方法可以在没有所属的类的实例变量的情况下被访问。
Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。

3.是否可以在static环境中访问非static变量?
static变量在Java中是属于类的,它在所有的实例中的值是一样的。当类被Java虚拟机载入的时候,会对static变量进行初始化。如果你的代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。
4.Java支持的数据类型有哪些?什么是自动拆装箱?

基本类型:int,short,byte,char,long, floa,double,boolean

自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间做的一个转化。比如:把int转化成Integer,double转化成double,等等。反之就是自动拆箱。

5.Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载O verloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被”屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。
6.Java支持多继承么?
不支持,Java不支持多继承。每个类都只能继承一个类,但是可以实现多个接口。

7.接口和抽象类的区别是什么?
Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:
•    接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
•    类可以实现很多个接口,但是只能继承一个抽象类
•    类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
•    抽象类可以在不提供接口方法实现的情况下实现接口。
•    Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。
•    Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。
•    接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。
也可以参考JDK8中抽象类和接口的区别
8.什么是值传递和引用传递?
对象被值传递,意味着传递了对象的一个副本。因此,就算是改变了对象副本,也不会影响源对象的值。
对象被引用传递,意味着传递的并不是实际的对象,而是对象的引用。因此,外部对引用对象所做的改变会反映到所有的对象上

9.创建线程有几种不同的方式?你喜欢哪一种?为什么?
有三种方式可以用来创建线程:
•    继承Thread类
•    实现Runnable接口
•    应用程序可以使用Executor框架来创建线程池
实现Runnable接口这种方式更受欢迎,因为这不需要继承Thread类。在应用设计中已经继承了别的对象的情况下,这需要多继承(而Java不支持多继承),只能实现接口。同时,线程池也是非常高效的,很容易实现和使用.

10.同步方法和同步代码块的区别是什么?
在Java语言中,每一个对象有一把锁。线程可以使用synchronized关键字来获取对象上的锁。synchronized关键字可应用在方法级别(粗粒度锁:这里的锁对象可以是This)或者是代码块级别(细粒度锁:这里的锁对象就是任意对象)。

11.什么是死锁(deadlock)?
两个进程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是两个进程都陷入了无限的等待中。

12.如何确保N个线程可以访问N个资源同时又不导致死锁?
使用多线程的时候,一种非常简单的避免死锁的方式就是,强制线程按照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。

13.Java集合类框架的基本接口有哪些?
Java集合类提供了一套设计良好的支持对一组对象进行操作的接口和类。Java集合类里面最基本的接口有:
•    Collection:代表一组对象,每一个对象都是它的子元素。
•    Set:不包含重复元素的Collection。
•    List:有顺序的collection,并且可以包含重复元素。
•    Map:可以把键(key)映射到值(value)的对象,键不能重复。

14.什么是迭代器(Iterator)?
Iterator接口提供了很多对集合元素进行迭代的方法。迭代器可以在迭代的过程中删除底层集合的元素。

15.Iterator和ListIterator的区别是什么?
下面列出了他们的区别:
•    Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。
•    Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。
•    ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。

16.Java中的HashMap的工作原理是什么?

link:https://blog.csdn.net/andylau_zhl/article/details/78871917

通过hash的方法,通过put和get存储和获取对象。存储对象时,我们将K/V传给put方法时,它调用hashCode计算hash从而得到bucket位置,进一步存储,HashMap会根据当前bucket的占用情况自动调整容量(超过Load Facotr则resize为原来的2倍)。获取对象时,我们将K传给get,它调用hashCode计算hash从而得到bucket位置,并进一步调用equals()方法确定键值对。如果发生碰撞的时候,Hashmap通过链表将产生碰撞冲突的元素组织起来,在Java 8中,如果一个bucket中碰撞冲突的元素超过某个限制(默认是8),则使用红黑树来替换链表,从而提高速度。HashMap的一些重要的特性是它的容量(capacity),负载因子(load factor)和扩容极限(threshold resizing)。

17.HashMap和Hashtable有什么区别?
•    HashMap和Hashtable都实现了Map接口,因此很多特性非常相似。但是,他们有以下不同点:
•    HashMap允许键和值是null,而Hashtable不允许键或者值是null。
•    Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。
•    HashMap提供了应用迭代的键的集合,因此,HashMap是快速失败的。另一方面,Hashtable提供了对键的列举(Enumeration)。
o    一般认为Hashtable是一个遗留的类。
18.数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList?
下面列出了Array和ArrayList的不同点:
•    Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。(数据类型)
•    Array大小是固定的,ArrayList的大小是动态变化的。(容量特点)
•    ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。(方法)
•    对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。

19.ArrayList和LinkedList有什么区别?

  • ArrayList 是实现了基于动态数组的数据结构,LinkedList 基于链表的数据结构。
  • 在 ArrayList 的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在 LinkedList 的中间
    插入或删除一个元素的开销是固定的
  • ArrayList 支持高效的随机元素访问。LinkedList 不支持高效的随机元素访问。
  • ArrayList 的空间浪费主要体现在在 list 列表的结尾预留一定的容量空间,而 LinkedList 的空间花费则体现在
    它的每一个元素都需要消耗相当的空间

20.HashSet和TreeSet有什么区别?

HashSet是由一个hash表来实现的,因此,它的元素是无序的。add(),remove(),contains()方法的时间复杂度是O(1)。
另一方面,**TreeSet是由一个树形的结构来实现的,它里面的元素是有序的。**因此,add(),remove(),contains()方法的时间复杂度是O(logn)。
 

猜你喜欢

转载自blog.csdn.net/qq_39659876/article/details/88365070