关于图灵JAVA一百道面试题总结

https://www.bilibili.com/video/BV1Eb4y1R7zd?from=search&seid=10716683573082248310&spm_id_from=333.337.0.0https://www.bilibili.com/video/BV1Eb4y1R7zd?from=search&seid=10716683573082248310&spm_id_from=333.337.0.0

 上图是面试题链接

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如何判断对象可以被回收?

目前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是什么:

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值