前言
掉进水里你不会淹死,待在水里你才会淹死,只有一直学习才不会被前沿淘汰,以下面试题心愿对你们有帮忙!
什么是面向对象?谈谈你对面向对象的了解
答:在程序设计中有面向过程和面向对象,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架构实战电子书等等!
全副收费分享给大家,有须要的敌人欢送关注公众号:前程有光,支付!