整理了操作系统,计算机网络,以及JVM的高频面试题目,对于面试大厂的Android以及后端开发岗位,可以说的是十分必要的部分就是JAVA语言的基础,在整体的内容上我认为有以下的几个部分,我发现任何的学习都是先建立框架体系,再逐个击破,针对Java的基础中包括:
(1)Java语言的面向对象的特性
(2)Java语言的集合种类以及特性
(3)Java语言的反射特性
(4)Java的IO流
(5)Java语言与其他编程语言的特性对比
Java语言的基础部分的面试就是这些,我们直接上面试题,完整的面试题目资料可以关注我的公众号:AI学习经历分享,回复JAVA,即可获得。
1.Java语言的特性和优点有哪些?
(1)跨平台特性( 一次编译,N次执行,得益于JVM虚拟机将就文件转换为class字节码)
(2)支持多线程
(3)面向对象的特性
2.详细解释一下Java语言的面向对象特性与C语言的面向过程特性?
面向过程特性:分析解决问题的步骤,用函数进行逐步的实现,性能较高
面向对象特性:将构成问题的事物分解成若干的对象,而建立对象的目的也不是为了完成一个个步骤,而是为了描述某个事物在解决整个问题的过程中所发生的行为。性能上比面向对象要低。
3.Java语言的自动装箱以及自动拆箱?
(1)装箱为将基本数据类型转换为包装器数据类型(int->integer)
(2)拆箱为将包装类转换为基本数据类型(integer->int)
4.Java的重写与重载的区别(高频)?
(1)重载:在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同甚至是参数顺序不同),重载对返回类型没有要求,可以相同也可以不同,但不能通过返回类型是否相同来。
(2)重写:发生在父类与子类之间,进行重写,方法名,参数列表,返回类型(除过子类中方法的返回类型是父类中返回类型的子类)必须相同,仅仅是对方法进行重写。
5.equal与==的区别是什么?
== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。
equals 用来比较的是两个对象的内容是否相等。
所有比较是否相等时,都是用 equals 并且在对常量相比较时,把常量写在前面。
6.string,stringbuffer,stringbuild的三种数据类型的区别是什么(高频)?
String 是只读字符串,它并不是基本数据类型,而是一个对象。从底层源码来看是一个final 类型的字符数组。
另外 StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。
7.ArrayList与linkedlist的容器区别?
Array(数组)是基于索引(index)的数据结构,它使用索引在数组中搜索和读取数据是很快的。
LinkList 是一个双链表,在添加和删除元素时具有比 ArrayList 更好的性能.但在 get 与 set 方面弱于ArrayList.当然,这些对比都是指数据量很大或者操作很频繁。
8.Hashmap和Hashtable的区别是什么(高频)?
(1)继承的父类不同:HashMap 是继承自 AbstractMap 类,而 Hashtable 是继承自 Dictionary 类。
(2)对null的支持性不同:HashMap的key和value均可以为null,但是这样的 key 只能有一个,因为必须保证 key 的唯一性;可以有多个 key 值对应的 value 为 null。
hashmap的key和value均不可以为null
(3)线程安全性:HashMap 是线程不安全的,在多线程并发的环境下,可能会产生死锁等问题,Hashtable 是线程安全的,它的每个方法上都有 synchronized 关键字,因此可直接用于多线程中。
(4)效率不同:虽然 HashMap 是线程不安全的,但是它的效率远远高于 Hashtable,相比来说,ConcurrentHashMap 使用了分段锁,并不对整个数据进行锁定,适合多线程下使用。
- Collection 包结构,与 Collections 的区别?(高频)
Collection 是集合类的上级接口,子接口有 Set、List、LinkedList、ArrayList、Vector、Stack、Set;Collections 是集合类的一个帮助类, 它包含有各种有关集合操作的静态多态方法,用于实现对各种集合的搜索、排序、线程安全化等操作。此类不能实例化,就像一个工具类,服务于 Java 的 Collection 框架。
10.Java语言中的四种引用,强弱软虚
(1)强引用:强引用在内存不足时也不会被回收
String str = new String("str");
(2)软引用:软引用在内存不足的时候会被回收
(3)弱引用:只要 JVM 垃圾回收器发现了它,就会将之回收
(4)虚引用:虚引用的回收机制跟弱引用差不多,但是它被回收之前,会被放入 ReferenceQueue 中
11.Java的final的使用方法和特性
类不能继承,方法不能重写,修饰得常量进入常量池
12.Java中的IO流种类:
根据操作对象分为字节流和字符流
根据输出方向分为输入流和输出流
13.详细解释一下Java的面向对象的特性含义
14.sleep 和 wait 的区别
(1)对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。
(2)sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。
(3)而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。
15.volatile 的原理,作用,能代替锁吗?
Volatile利用内存栅栏机制来保持变量的一致性。不能代替锁,其只具备数据可见性一致性,不具备原子性。
16.JDK是什么?JRE是什么?
JDK是面向开发人员使用的SDK,JRE是Java程序的运行环境,JVM包涵在JRE中,JRE包含在JDK内部。
17.简述this的主要用法
this关键字使用在实例方法中,代表调用该方法的当前对象。
- BIO、NIO、AIO 有什么区别?
BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
NIO:Non IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。
19.List、Set、Map 之间的区别是什么?
三种集合的主要区别在于存储元素是否有序以及是否重复,
20.简述HashMap 的实现原理?
HashMap 基于 Hash 算法实现的,我们通过 put(key,value)存储,get(key)来获取。当传入 key 时,HashMap 会根据 key. hashCode() 计算出 hash 值,根据 hash 值将 value 保存在 bucket 里。当计算出的 hash 值相同时,我们称之为 hash 冲突,HashMap 的做法是用链表和红黑树存储相同 hash 值的 value。当 hash 冲突的个数比较少时,使用链表否则使用红黑树。
21.简述 HashSet 的实现原理?
HashSet 是基于 HashMap 实现的,HashSet 底层使用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,相关 HashSet 的操作,基本上都是直接调用底层 HashMap 的相关方法来完成,HashSet 不允许重复的值。
22.迭代器 Iterator 是什么?
Iterator 接口提供遍历任何 Collection 的接口。我们可以从一个 Collection 中使用迭代器方法来获取迭代器实例。迭代器取代了 Java 集合框架中的 Enumeration,迭代器允许调用者在迭代过程中移除元素。
23.throw 和 throws 的区别?
throw用于方法内部,throws用于方法声明上
throw后跟异常对象,throws后跟异常类型
throw后只能跟一个异常对象,throws后可以一次声明多种异常类型
24.谈谈final, finally, finalize的区别
如果一个类被final修饰,意味着该类不能派生出新的子类,不能作为父类被继承。因此一个类不能被声明为abstract,又被声明为final。将变量或方法声明为final。可以保证他们在使用的时候不被改变。其初始化可以在两个地方:一是其定义的地方,也就是在final变量在定义的时候就对其赋值;二是在构造函数中。这两个地方只能选其中的一个,要么在定义的时候给值,要么在构造函数中给值。被声明为final的方法也只能使用,不能重写。
在异常处理的时候,提供finally块来执行任何的清除操作。如果抛出一个异常,那么相匹配的catch字句就会执行,然后控制就会进入finally块,前提是有finally块。
finalize是方法名,java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是在垃圾收集器确认一个对象没有被引用时对这个对象调用的。它是在Object类中定义的,因此,所有的类都继承了它。子类覆盖finalize()方法已整理系统资源或者执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。
25Java的面向对象的特性;
面向对象是一种思想,可以将复杂的问题简单化,让我们从执行者变为指挥者。面向对象的三大特征:封装、继承和多态。
封装:将事务封装成一个类,减少耦合,隐藏细节。保留特定的接口与外界联系,当接口内部发生改变时,不影响外部的调用方。
继承:从一个已知的类中派生出另一个新的类,但新的类拥有已知类的属性和方法,并且可以通过覆盖/重写来增强已知类的能力。
多态:多态的本质就是一个程序中出现多个同名的不同方法,主要通过三种方式体现:
通过子类对父类的覆盖来实现
通过一个类中对方法的重载来实现
通过将子类对象作为父类对象使用来实现
26.Java是编译型语言还是解释性语言?
Java的执行经历了编译和解释的过程,是一种先编译,后解释执行的语言。不可以简单的归到编译型或解释型语言的类别中。
- 启动一个线程是用run()还是start()? 多线程有几种实现 同步和并发是如何解决的 什么叫守护线程,用什么方法实现守护线程(Thread.setDeamon()的含义) 如何停止一个线程? 解释是一下什么是线程安全?举例说明一个线程不安全的例子。解释Synchronized关键字的作用。 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
(1)start
(2)继承Thread类、实现Runnable接口、使用ExectuorService、Future、Callable实现由返回值的线程。
(3)同步方法、同步代码块、锁
(4)Damon线程、为其他线程的运行提供服务,如GC,Thread。setDeamon(true)。
(5)Thread.stop()不推荐(不会正确释放资源)、使用中断来停止线程。
(6)当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。
(7)车票被重复卖出。
(8)同步关键词。修饰静态方法,则以类作为锁对象,同时只能有一个线程访问此类同步的静态方法;修饰普通方法,则以此对象作为锁对象,同时只能有一个线程访问此类同步的普通方法;也可以自定义锁对象同步代码块。
(9)synchronized方法不可以进入,非synchronized可以进入。
致谢:
2.https://www.jianshu.com/p/226a1753296b
3.https://zhuanlan.zhihu.com/p/97132867