关于图灵JAVA⼀百道⾯试题总结
上图是⾯试题链接
1.什么是⾯向对象:
①说到⾯向对象就不得不说⾯向过程,这⾥我举⼀个例⼦;我需要去洗⾐服。
如果是⽤⾯向过程的思想,那么就应该是: 我打开洗⾐机,放⾐服,关闭洗⾐机,开始洗⾐服。
如果是⽤⾯向对象的思想,那么就应该是: ⼈:打开洗⾐机,放⾐服,关闭洗⾐机;洗⾐机:洗⾐服。
两者的区别是:⾯向过程更注重事情的顺序与步骤,⽽⾯向对象更注重事情的参与者与各⾃需要完成的事情,所以⾯向对象更加容易维护,扩展与复⽤。
②⾯向对象有三个特点:封装,继承,多态;
封装是指:内部细节对外部的调⽤透明,外部调⽤不需要修改与知道内部的实现,保证数据的安全。
继承是指:⼦类继承⽗类,⼦类有共性的⽅法直接使⽤⽗类,不需要⾃⼰再定义,只需要扩展⾃⼰的个性化就可以了。
多态是指:基于对象所属类的不同,外部对同⼀个⽅法的调⽤,实际执⾏的逻辑不同。
2.JDK,JRE,JVM的区别和联系:
JDK:java开发⼯具包 (开发⼈员使⽤)
JRE:java运⾏时环境 (提供给java程序⽤户使⽤)
JVM:java虚拟机
3.==与equals
==⽐较的是栈中的值,基础类型的变量值,引⽤类型⽐较的是引⽤地址;
equals默认没有重写的情况下与==没有区别,但在string类中进⾏了重写,内部实现是将字符⼀⼀取出进⾏⽐对。
4.final
修饰类:表⽰类不可被继承
修饰⽅法:表⽰⽅法不能被⼦类覆盖,但是可以重载
修饰变量:表⽰常量,不可修改
5.string,StringBuffer,StringBuilder的区别以及使⽤场景
string 是final修饰的,不可变,每次操作都会新⽣成⼀个string对象,对内存造成负担
stringBuffer和stringBuilder都是在原来的对象上进⾏操作,
stringbuffer线程是安全的,stringbuilder线程不安全,
性能:stringbuffer>stringbuilder>string 。
使⽤场景:多线程:striungbuffer,经常改变字符串使⽤stringbuilder,没有其他要求⽤string
6.重载和重写的区别
重载:发⽣在同⼀个类中,⽅法名相同,参数类型不同,个数不同,顺序不同,
重写:发⽣在⽗⼦类中,⽅法名,参数列表必须相同返回值范围⼩于等于⽗类,如果⽗类访问修饰符是private则不能重写该⽅法
7.接⼝与抽象类
①抽象类可以存在普通成员⽅法,⽽接⼝只能存在 public abstract ⽅法
抽象类中的成员变量可以是各种类型的,⽽接⼝中的成员变量只能是public static final 类型的
抽象类只能继承⼀个,接⼝可以实现很多个
②接⼝设计的⽬的是约束类⾏为的有⽆,但不对如何实现进⾏限制
抽象类的⽬的是代码复⽤
使⽤场景:当你关注⼀个事物的本质的时候,⽤抽象类。当你关注⼀个操作的时候,⽤接⼝。
8.List和Set的区别
List:有序,可重复,允许多个null元素,可以使⽤iterator取出所有元素逐⼀遍历,可以使⽤get(index)获取指定下标取出数据
Set:⽆序,不可重复,最有允许有⼀个null元素,取元素只能使⽤迭代器进⾏取出
9.hashcode与equals
hashcode()的作⽤是获取⼀个哈希码,散列码,是⼀个int类型的整数,哈希码的作⽤是确定该对象在哈希表中的索引位置
10.ArraryList和LinkedList的区别
ArrayList:基于动态数组,在内存中需要连续的内存空间进⾏存储;存在扩容机制,在数组超出存储长度会进⾏扩容,创建新数组,并将旧数组数据复制到新数组中。ArrayList和LinkedList集合有⼀个误区,普遍认为ArrayList的插⼊效率⽐LinkedList低,因为涉及到扩容和数据复制。不过当ArrayList使⽤尾插法和指定出售长度得当,效率会⼤⼤⾼于LinkedList。
LinkedList:基于链表,可以存储分散的内存中,适合做新增和删除操作。不适合做查询:因为在LinkedList底层,每增加⼀个元素就会新增⼀个node。当遍历的时候,需要从第⼀个元素开始遍历。⽽且如果使⽤元素索引返回元素,如果结果为空,会将整个集合进⾏遍历,⾮常影响性能。
11.HashMap和HashTable的区别?底层实现是什么?
区别:
①HashMap⽅法没有synchronized修饰,线程⾮安全,HashTable线程安全;
②HashMap允许key和value 为null,⽽HashTable不允许
底层实现:数组+链表实现
jdk1.8开始 链表⾼度到8,数组长度超过64 链表转为红⿊树 元素以内部类Node节点存在
计算key的hash值,⼆次hash然后对数组长度取模,对应到数组下标;
如果没有产⽣hash冲突,则直接Node存⼊数组
如果产⽣hash冲突,先进⾏equals⽐较,相同则取代该元素,不同,则判断链表⾼度插⼊链表,链表⾼度达到8,并且数组长度到64转变为红⿊树,长度低于6则将红⿊树转为链表
key为null,存在下标0 的位置
数组扩容
12.ConcurrentHashMap原理简述,jdk1.8和jdk1.7的区别
-----------------------------------------------------------------暂时不讲解
13.如何实现⼀个IOC容器:
①配置⽂件配置包扫描路径
②递归包扫描获取class⽂件
③反射,确定需要交给IOC管理的类
④对需要注⼊的类进⾏依赖注⼊
14.java的类加载器有哪些?
引导类加载器,扩展类加载器,应⽤程序类加载器,⾃定义类加载器
引导类加载器:负责加载java核⼼类,maven仓库中的类
扩展类加载器:负责加载java⼯具类
应⽤程序类加载器:加载classpath下的类⽂件,也就是程序员⾃⼰写的类
15双亲委派模型:
重点:*向上委派到顶层类加载器,向下查到发起加载的加载器。
双亲委派的好处:抓要是为了安全性,避免⽤户⾃⼰编译的类动态替换JAVA的核⼼类,⽐如string
同时也避免了类的重复加载,因为jvm中区分不同类不仅仅是根据类名,相同的class⽂件被不同的classloader加载就是不同的两个类
16.java中的异常体系:
java中所有异常都来⾃顶级⽗类Throwable。
Throwable下有两个⼦类Exception和Error。
Error是程序⽆法处理的错误,⼀旦出现这个错误,则程序将被迫停⽌(如OOM)
Exception不会导致程序停⽌,它有分为两个部分,RunTimeException运⾏时异常和CheckedException检查异常 。
RunTimeException常常发⽣在程序运⾏中,会导致程序当前线程失败。CheckedException 常常发⽣在程序编译过程中,会导致编译不通过。
17.GC如何判断对象可以被回收?
java重写和重载的区别⽬前GC判断对象是否可以被回收有两种主流⽅法:引⽤计数法 和 可达性分析法。
引⽤计数法:每个对象有⼀个引⽤计数属性,每次当前对象被引⽤⼀次,计数器就+1。引⽤释放时,计数器-1。当计数器为0时可以被回收。
可达性分析法:从GC Roots开始向下搜索,当⼀个对象到GC Roots没有任何引⽤链时,证明此对象已经变成了垃圾,那么虚拟机就会回收该对象。
但是引⽤计数法有⼀个缺陷,如果出现循环依赖,则该对象永远⽆法被回收。所以JVM虚拟机⽤的是可达性分析法。
GC Roots对象有:
虚拟机栈中引⽤的对象
⽅法区中类静态属性引⽤的对象
⽅法区中常量引⽤的对象
本地⽅法栈中JNI引⽤的对象
18.线程的⽣命周期,线程有哪些状态:
线程状态:创建,就绪,运⾏,阻塞和死亡
阻塞的情况⼜分为三种:
等待阻塞:运⾏线程执⾏wait⽅法,JVM会将该线程放⼊“等待池”中,进⼊这个状态不能⾃动唤醒,需要依靠其他线程执⾏notify或者notifyAll进⾏唤醒。wait是object类的⽅法。
同步阻塞:运⾏的线程在获取同步锁时,若该同步锁被其他线程占⽤,则JVM会将该线程放⼊“锁池”当中去。
其他阻塞:运⾏的线程执⾏sleep或者join⽅法,或者发出I/O请求,JVM会将该线程置为阻塞状态。当sleep⽅法超时,join等待线程终⽌或者超时,或者I/O处理完毕后,线程重新转⼊就绪状态,sleep是Thread类的 ⽅法。
①新建状态:新创建了⼀个线程对象
②就绪状态:线程创建后,其他线程调⽤了该对象的start⽅法。该对象的线程位于可运⾏线程池中,变得可运⾏,等待CPU的使⽤权
③运⾏状态:就绪状态线程获取了CPU,执⾏程序代码
④阻塞状态:阻塞线程因为某种原因放弃CPU的使⽤权,暂时停⽌运⾏,直到线程进⼊就绪状态,才有机会转到运⾏状态。
⑤死亡状态:线程执⾏完或者因为异常退出run⽅法,该线程结束⽣命周期
19.spring是什么:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论