关于java:纯干货分享金三银四高频java面试题整理一线名企面试重点拆分

2次阅读

共计 4674 个字符,预计需要花费 12 分钟才能阅读完成。

前言

掉进水里你不会淹死,待在水里你才会淹死,只有一直学习才不会被前沿淘汰,以下面试题心愿对你们有帮忙!

什么是面向对象?谈谈你对面向对象的了解

答:在程序设计中有面向过程和面向对象,C 语言是面向过程的,就是一步一步的十分分明,比拟间接高效,而 java 是面向对象的,更易于重复使用、扩大和保护。

面向过程只会思考这个事件(问题)自身

面向对象要将一个事件解拆成一个一个的模块

 

面向对象三大个性:

封装、继承、多态 

封装的意义:

外部细节对外部调用通明,内部调用无需批改或者关怀外部实现

比方:ORM 框架 操作数据库,咱们不须要关怀链接是如何建设的、sql 是如何执行的,只须要引入 mybatis,调办法即可

 

继承:

继承基类的办法,并做出本人的扭转和扩大

 将共性的办法或属性写在父类,而不须要本人再定义,只须要扩大本人的个性化   就有点像 AOP 面向切面编程一样 在不扭转源码的根底上增加一些新的性能,继承也是在继承了父类的所有办法和属性上 子类能够优化父类的办法和扩大本人的办法

 

多态:

多态和继承其实是一脉相承的 多态有一个条件:要有继承 要重写父类的办法 父类援用指向子类对象 

多态的用法 :  父类类型 变量名 =  new 子类对象;      变量名. 办法名() ;    调用的办法是子类对象的办法 这就是多态  然而多态有一个弊病 无奈调用子类本人特有的性能 就是子类对象的办法必须是在父类中有

也就是重写了父类的办法能力被调用(办法重写)

 

 

JAVA 虚拟机(重点)

JAVA 语言有一个十分牛 B 的个性 就是跨平台 代码一次编写到处运行

跨平台个性实现:应用 JVM(虚拟机)实现 字节码文件都会放到 jvm 外面去运行 针对不同的平台 会生成不同的代码 java 虚拟机帮咱们做到的 

java 虚拟机是 JDK 的一个组成部分

java 虚拟机由那些局部组成:

由三大部分组成:

1:类装载子系统 

2:运行时数据区(内存模型(重点))蕴含堆 栈(线程)本地办法栈 办法区(元空间)程序技术器

3:字节码执行引 xin

栈(线程):官网叫(虚拟机栈)而我本人想叫它线程栈,为什么呢?只有一个线程开始运行 java 虚拟机就会给这个线程调配它一块本人的专属内存空间 这个内存空间就叫做线程栈!为什么调配这个空间?因为在这个线程运行过程中须要内存空间去寄存一些变量 那么就是放到这个线程栈的

 

栈帧内存空间:就是线程栈外部为每个办法调配的一个内存空间 这个内存空间用来寄存这个办法内的局部变量 这就叫(栈帧)!

数据结构外面有个叫栈的数据结构 有个十分重要的个性 FILO 先进后出
线程栈外部放栈帧的数据结构就是 FILO 构造 先进后出 

 

先调用的办法后完结 后调用的办法先完结 也就是先调用的办法后开释内存资源 后调用的办法先开释内存资源

java jvm 虚拟机赋值步骤

将 JAVA 文件编译后的 class 文件转换为不便浏览的源码:

 

栈帧内的操作数栈操作步骤:
 

 

程序计数器:

以后在内存中执行的代码行  字节代码行号从 0 开始
用途:多线程 以后线程正在运行时 一个比以后线程优先级高的线程开始执行了 那么以后线程就会被挂起 前面开始执行的时候就通过这个程序计数器的行号开始执行

程序计数器的值由字节码执行引擎来进行批改  因为字节码执行引擎指向着 Math.class 和程序计数器  当 Math.class 每行代码执行结束时都会批改程序计数器的值

 

局部变量:

就是一个局部变量表 放以后部分的变量
 

操作数栈:

放操作数的 +-*/ 操作运算的 长期寄存的一块内容空间 

 

动静链接:

源码 牵扯到 C 语言和 C ++   把一些符号援用转换为间接援用   
符号援用:办法名称 括号啊 在 JVM 外面都有一个名称 叫符号 当程序真正运行到一行代码的时候 就将这些符号援用转换为间接援用 

通过动静链接在办法区(元空间)找到那些要执行的代码 

 

办法进口:

就是 compute 办法执行结束后晓得返回到 main 主函数的第几行代码去继续执行
 

 

对象是放在堆区域的 

栈和堆的关系就是栈外面的内存地址通过指针指向堆里绝对应的对象
 

办法区放: 常量 + 动态变量 + 类信息

 

不论是栈外面的对象还是办法区里的动态对象 都是通过内存地址指针指向堆里对应的对象 堆里就是寄存对象的 不论是动态还是非动态的 只有是对象都会寄存在堆里 让其它中央通过内存地址指针到对应的对象
办法区类信息 字节码的一些信息会加载到办法区外部 

本地办法栈: 本地办法分配内存空间 native(nei ti wu)润饰的办法叫本地办法 本地办法:底层是 C 和 C ++ 实现的 这个本地办法必定有要运行的货色嘛 所以就须要调配一个内存空间

 

堆:由年老代和老年代形成  老年代占 3 分之 2  年老代占 3 分之 1 

如果一个对象被 minor gc(ma lr GC)干了 15 次还没有被干掉 那么这个对象会被移到老年代

 

补充:

残缺对象蕴含:对象头、实例数据

 

 

JAVA 虚拟机调优:

调优工具 阿里开源工具: Arthas(啊 sr 死)   JDK 自带的:Visual GC

 

 

JDK、JRE、JVM 三者区别和分割

JDK:java 开发工具 提供给开发人员来应用的

JRE:java 运行时环境 提供给运行 java 程序的用户来应用的 谁须要运行 java 程序就须要装置 JRE

JVM: 虚拟机 解析 class 文件 解析成机器码(二进制)让操作系统能够执行

 

是 class 文件是能够到处运行的 并不是 JVM 能够到处运行  JVM 是将以后 class 文件解析成以后操作系统能辨认的机器码

 

 

== 和 equals 的区别

在 java 中有两块很重要的内存 栈和堆  堆是存对象 栈是存值

String s = new String()  String ss = new String() s=“123”ss =“123”

boolean b = s == s?true:false; b 的值为 false 因为 s 和 ss 在堆里开拓了不同的内存空间

boolean b = s.equals(ss)   b 的值为 true 因为 equals 重写了办法 只是比拟了两个字符串的内容 没有进行对象比拟 只是比拟了值 所以能够了解 equals 就是比拟的值

int a = 1  int b = 1

boolean b = a==b ?true:false;  b 的值为 true 因为 a 和 b 都是在栈中 并且值都是 1 所以后果为 true

来一道题:

解析:

str1==str2  false  因为 str1 和 str2 应用 == 比拟的是栈中的值 栈中 str1 str2 都寄存的是不同的内存地址 是寄存在堆中的对象 所以它们的内存对象值不同 所以返回为 false 

str2==str3 同理 

str2==str3 true  因为 str3 间接通过赋值运算符获得了 str2 在栈中的内存地址值 所以 str3 和 str2 的内存地址值是一摸一样的 都指向的是堆里的那个对象

str1.equals(str2) true  equals 比照的是内容 内容都是 Hello 必定都是 true

 

 

 

简述 final 作用


 

为什么部分外部类和匿名外部类只能拜访部分 final 变量?


本人的了解:final 申明的变量只是为了部分生成的匿名类或者外部类调用时这个值是统一的 就是面向对象的思维 
 

 

重载和重写的区别

 

重载:产生在同一个类中,办法名必须雷同,参数类型不同,个数不同、程序不同,办法返回值和拜访修饰符能够不同,产生在编译时。

重写:产生在父子类中,办法名、参数列表必须雷同,返回值范畴小于等于父类,抛出的异样范畴小于等于父类,拜访修饰符范畴大于等于父类;如果父类办法拜访修饰符为 private 则子类就不能重写该办法

 

接口和抽象类的区别

抽象类只能继承一个,接口能够实现多个

抽象类能够存在一般成员函数,而接口中只能存在 public abstract 办法 接口外面只能是形象的办法

抽象类中的成员变量能够是各种类型的,而接口中的成员变量只能是 public static final 类型的

高级程序员答:
抽象类除了有形象办法还有实现了的办法也就是一般成员函数  而接口不能够 接口外面的办法必须全副是形象的

在咱们的抽象类中成员变量是能够有多种类型的  而接口中的成员变量只能是 public static final 类型的  接口中的成员变量默认都是常量

抽象类是单继承 而接口是能够多实现的

中级程序员答、高级程序员答:

接口的设计目标:它只对类可能提供那些办法 至于这个办法怎么实现的 它不论 

抽象类的设计目标:代码服用  不同的类具备雷同的行为 有共性的货色 这个时候就能够把这些独特的货色抽取进去写入道抽象类中 能够有形象办法 也能够有曾经实现了的办法

抽象类蕴含并实现子类的通用个性 

抽象类是对类实质的形象 表白的是 is a 的关系  比方 BMW is a Car  如果用 BMW 继承 Car 类 就代表 BMW 是 Car

而接口是对行为的形象 表白的是 like a 的关系 是相似 不是间接就是 Bird like a Aircraft   Aircraft 接口有一个飞的办法      Bird 就能够去实现 Aircraft 接口里的飞的办法 

然而 Bird(小鸟)不是一个 Aircraft(飞行器)因为 Aircraft(飞行器)接口外面有飞的办法 所以 Bird 小鸟能够去实现 Aircraft 接口飞的办法 

应用场景:

当你关注一个事务的实质的时候,用抽象类

当你关注一个操作的时候,用接口

抽象类的性能要远超过接口 抽象类能够有实现的办法 也能够有未实现的办法 然而定义抽象类的代价比拟高  抽象类只能实现一个   接口会升高难度:接口能够实现多个 

List 和 Set:List 是有序的 可反复的 能够应用迭代器和下表读取存入的值  set 是无需的 不可反复的 只能应用迭代器读取存入的值 
 

hashcode 和 equals:
如果两个对象相等,那么 hashcode 肯定也是雷同的

两个对象相等,对两个对象别离调用 equals 办法都返回 true

 

ArrayList 和 LinkedList 的区别:

ArrayList 是基于动静数组的 亮点在于扩容机制 老数组和新数组 当应用 ArrayList 开拓了一个能包容 10 个值的数组时想插入第 11 个值的话 那么扩容机制就来了

扩容机制原理:就是新数组和老数组  开拓一个比老数组要长的新数组 将老数组的值 CP 到新数组中并将新插入的值插入到新数组中 这就是扩容机制也就是动静数组的机制

它更利于插入不利于查问 然而 如果将 ArrayList 应用的失当是能够比 LinkedList 性能要好的 它能够通过下标和迭代器拜访存入的值

LinkedList 是基于链表的 它利于插入不利于查问 只能应用迭代器拜访存入的值 不能通过下标  而且不举荐应用 for 循环来遍历 因为 LinkedList 是基于链表的 如果应用 for 循环去拜访存入的值 那么每读取一个值都会从链表链一次 效率可想而知有多低

 

HashMap 和 HashTable 的区别?及底层原理

HashMap 是线程不平安的  HashTable 是线程平安的 因为 HashTable 为外面的每个办法都增加了锁 而 HashMap 没有 它们两的办法都差不多 然而 HashTable 效率低 HashMap 效率高 能够依据不同的业务来抉择应用

HashMap 基于动静数组实现

HashTable 基于链表实现

 

Thread、Runable 的区别

实现 Runable 或者继承 Thread   si wei dr           Thread 实现了 Runable    Thread 和 Runable 的本质是继承关系,没有可比性,Thread 是单继承然而 Runable 是多实现  

最初

在文章的最初作者为大家整顿了很多材料!包含 java 外围知识点 + 全套架构师学习材料和视频 + 一线大厂面试宝典 + 面试简历模板 + 阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题 +Spring 源码合集 +Java 架构实战电子书等等!

全副收费分享给大家,有须要的敌人欢送关注公众号:前程有光,支付!

正文完
 0