Java八股文

110 阅读9分钟

2024/8/10

目录:

一、Java基础
    ~~~~ 1.接口和抽象类的区别
    ~~~~ 2.重载和重写方法的区别
    ~~~~ 3.Java中hashCode和equals方法是什么?和==有什么区别
    ~~~~ 4.异常处理机制
    ~~~~ 5.Java优势是什么
    ~~~~ 6.什么是Java地多态特性
    ~~~~ 7.面向对象和面向过程的区别
    ~~~~ 8.面向对象和面向过程的区别
    ~~~~ 9.Java的自动装箱和拆箱
    ~~~~ 10.Hashcode的作用
二、Java多线程
三、JVM
    ~~~~ 1.知识点汇总
    ~~~~ 2.知识点详解
四、Mysql
五、常用框架系列
六、Redis
七、计算机网络系列
八、linux
九、其他

一、Java基础

1.接口和抽象类的区别

相似点:
(1)接口和抽象类都不能实例化,
(2)实现接口或者继承抽象类的普通子类都必须实现这些抽象方法。
不同点:
(1)抽象类可以包含普通方法和代码块,接口类中只能有抽象方法,静态方法和默认方法,
(2)抽象类可以有构造方法,接口没有,
(3)抽象类的成员变量可以是各种类型的,接口类中只能是public static final类型的,并且必须赋值。

2.重载和重写方法的区别

重载发生在同一个类中,方法名相同、参数列表、返回类型、权限修饰符可以不同;
重写发生在子类中,方法名、参数列表、返回类型都相同,权限修饰符要大于父类方法,声明异常范围要小于父类方法,但是final和private修饰的方法不可重写。

3.Java中hashCode和equals方法是什么?和==有什么区别

hashCode用于散列存储结构中确定对象的存储位置。可用于快速比较两个对象是否相同,因为如果他们的哈希码不同,那么肯定不相等。
equals用于比较两个对象的内容是否相等,通常需要重写自定义比较逻辑。
==比较基本数据类型,比较它们的值;比较引用类型,比较内存地址。

4.异常处理机制

(1)使用try-catch-finally捕获异常,finally中的代码一定会执行,捕获异常后程序正常进行; (2)使用throws声明该方法可能会抛出异常类型,出现异常类型后,程序终止。

5.Java优势是什么

跨平台
首先java是跨平台的,不同平台执行的机器码是不一样的,而java因为加了一层中间层JVM,所以可以做到一次编写多平台运行,即[Write once,Run anywhere]
编译执行过程是先把Java源代码编译成字节码,字节码再由JVM解释或JI编译执行,而因为JIT编译时需要预热的,所以还提供了AOT,可以直接把字节码转成机器码,来让程序重启之后能迅速拉满战斗力。
垃圾回收
Java还提供垃圾自动回收功能,虽说手动管理内存意味着自由、精细化地掌控,但很容易出错。
在内存充裕的当下,将内存的管理交给GC来做,减轻了程序员编程的负担,提升了开发的效率。
生态
现在Java生态圈太全了,丰富的第三方类库、网上全面的资料、企业级框架、各种中间件等等。

补充

  • 1.简单易学、有丰富的类库
  • 2.面向对象(Java最重要的特性,让程序耦合度更低,内聚性更高)
  • 3.与平台无关性(JVM是Java跨平台使用的根本)
  • 4.可靠安全
  • 5.支持多线程

6.什么是Java地多态特性

多态其实是一种抽象行为,他的主要作用是让程序员可以面对抽象编程而不是具体的实现类,这样写出来的代码扩展性会更强。
比如某个人很喜欢吃苹果,我们在写文章描述他的时候可以写他很喜欢吃苹果,也可以写他很喜欢吃水果。 水果就是抽象,苹果就是具体的实现类。 假设这个人某天开始换口味了,他喜欢吃桃子了,如果我们之前的文章写的是水果,那么完全不需要改,如果写的是苹果,是不是需要把苹果替换成桃子了? 这就是多态的意义。

多态地实现要有继承、重写、父类引用指向子类对象。它的好处是可以消除类型之间的耦合关系,增加类的可扩充性和灵活性。

7.HashMap原理

1.HashMap在JDK1.8以后是基于数组+链表+红黑树来实现的,特点是,key不能重复,可以为null,线程不安全 2.HashMap扩容机制:
HashMap的默认容量是16,默认的负载因子是0.75,当HashMap中元素个数超过容量乘以负载因子的个数时,就创建一个大小为前一次两倍的新数组,再将原来数组中的数据复制到新数组中。当数组长度到达64且链表长度大于8时,链表转为红黑树。
3.HashMap存取原理
(1)计算key的hash值,然后进行二次hash,根据二次hash结果找到对应的索引位置。
(2)如果这个位置有值,先进性equals比较,若结果为true则取代该元素,若结果为false,就使用高低位平移法将节点插入链表(JDK8以前使用头插法,但是头插法在并发扩容时可能会造成环形链表或数据丢失,而高低位平移会发生数据覆盖的情况)

8.面向对象和面向过程的区别

面向对象: 是分析解决问题的步骤,然后用函数把这些步骤一步一步地实现,然后在使用的时候一一调用则可。性能较高,所以单片机、嵌入式开发等一般采用面向过程开发。
面向过程: 是把构成问题的事务分解成各个对象,而建立对象的目的也不是为了完成一个个步骤,而是为了描述某个事物在解决整个问题地过程中所发生的行为。面向对象有封装继承多态的特性,所以易于维护、易服用、易扩展。可以设计出低耦合的系统。但是性能上来说,比面向过程要低。

9.Java的自动装箱和拆箱

装箱就是自动将基本数据类型转换为包装器类型(int->Integer);调用方法:Integer的valueOf(int)方法
拆箱就是自动将包装器类型转换为基本数据类型(Integer->int);调用方法:Inerger的intValue方法

微信图片_20240830131838.png

输出结果表示i1和i2是一个对象,i3和i4不是一个对象。
从两个实现类的源码来看,通过valueOf方法创建Integer对象的时候,如果数值在[-128,127]之间,便返回指向IntegerCache.cache中已存在的对象的引用;否则创建一个新的Integer对象。
上面的代码中i1和i2的数值为100,因此会直接从cache中取已经存在的对象,所以i1和i2 指向的是同一个对象,而i3和i4则是分别指向不同的对象。

微信图片_20240830132819.png

原因:在某个范围内的整形数值的个数是有限的,而浮点数却不是。

10.Hashcode的作用

java的集合有两类,一类是list,一类是Set。前者有序可重复,后者无序不可重复。当我们在set中插入时候怎么判断是否已经存在该元素呢,可以通过equals方法,但是如果元素太多,就会比较慢。
于是有人发明了哈希算法来提高集合中查找元素的效率。这种方式将集合分成若干个存储区域,每个对象可以计算出一个哈希码,可以将哈希码分组,每组分别对应某个存储区域,根据一个对象的哈希码就可以确定该对象应该存储的哪个区域。
hashcode方法可以这样理解:它返回的就是根据对象的内存地址换算出的一个值。这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到他应该放置的物理位置上。如果这个位置上没有元素,他就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其他的地址。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。

11.

二、Java多线程

三、JVM

1、知识点汇总

JVM是Java运行基础,面试时一定会遇到JVM有关问题,内容集中

微信图片_20240830133517.png

其中内存模型,类加载机制,GC是重点方面。性能调优部分更偏向应用,重点突出实践能力。编译器优化和执行模式部分偏向于理论基础,重点掌握知识点。
需了解内存模型各部分作用,保存哪些数据.
类加载双亲委派加载机制,常用加载器分别加载哪种类型的类. GC分代回收的思想和依据以及不同垃圾回收算法的回收思路和适合场景.
性能调优常有JVM优化参数作用,参数调优的依据,常用的JVM分析工具能分析哪些问题以及使 用方法.
执行模式解释/编译/混合模式的优缺点,Java7提供的分层编译技术,JIT即时编译技术,OSR栈上 替 换,C1/C2 编译器针对的场景,C2针对的是server模式,优化更激进.新技术方面Java10的graal编译器
编译器优化javac的编译过程,ast抽象语法树,编译器优化和运行器优化

2、知识点详解

1.JVM内存模型

线程独占:栈,本地方法栈,程序计数器 线程共享:堆,方法区

2.栈

又称方法栈,线程私有的,线程执行方法是会创建一个栈桢,用来存储局部变量表,操作栈,动态链接,方法出口等信息,调用方法时执行入栈,方法返回时执行出栈。

四、Mysql

1、数据库的三范式是什么

第一范式

五、常用框架系列

六、Redis

七、计算机网络系列

八、linux

九、其他