JAVA八股文精选

八股虽无聊,面试少不了。而且除了部分比较偏僻无意义的八股之外,更多的是一些基础知识,做个记录,也算是回顾一下。

 

1.JDK和JRE的区别是什么
很多人确实还搞不清楚。
JRE:JAVA Runtime Environment java运行环境
JDK:JAVA Development kit java开发工具
JRE是java的运行环境,也就包括了java虚拟机,java基础类库。是使用java语言编写的程序所需要的软件环境,是提供给想运行java程序的用户使用的。
JDK指的是java的开发工具包,是程序员使用java语言编写java程序所需要的开发工具包,也是提供给程序员使用的。JDK中自然包含了JRE,并且还包含了java源码的编译器javac,以及一些提供给java程序员进行调试和分析的工具:jconsole,jvisualvm,还包含了java程序编写所需要的文档和demo例子程序。
如果单纯的只希望运行java程序的话,jre足以满足要求,但是对于java开发者而言,JDK是必须的。

 

2.static关键字是什么意思?Java是否能够重写一个private或者是static的方法?
static关键字题会阵亡一堆人。
static表示静态的意思,static关键字用于修饰成员变量和成员函数,被静态修饰的成员函数只能用来访问静态成员,不能够访问非静态的成员,静态量是随着类加载的加载而加载的,所以能够无视对象,直接通过类进行访问。static变量经过实验,是可以被继承和重写的。而static方法是能够被继承的,但对于重写网上的意见一般是可以被隐藏。这里意思是说如果父类里有一个static方法,它的子类里如果没有对应的方法,那么当子类对象调用这个方法时就会使用父类中的方法。而如果子类中定义了相同的方法,则会调用子类的中定义的方法。唯一的不同就是,当子类对象上转型为父类对象时,不论子类中有没有定义这个静态方法,该对象都会使用父类中的静态方法。这和java中的动态绑定和静态绑定有关。

 

3.进程和线程
我面试就被问到了这个。
1.线程是内存分配的最小单位,进程是CPU调度的基本单位。
2.一个进程最少拥有一个线程,进程结束之后其拥有的所有线程都将被销毁,但是当线程结束之后不会影响到其他线程。
3.线程可以在一定程度上看成是轻量级的进程,其创建和销毁所需要的时间和进程相比小很多,所有操作系统的执行功能都是创建线程去完成的。
4.线程执行过程中一定要注意同步和互斥!!因为他们对于同一进程的资源而言是共享的。

 

4.线程的状态

1.新建,线程对象被新创建出来
2.可运行,在线程对象创建之后,其他对象调用了线程对象的start()方法,让其处于了可运行的线程池中,等待着cpu的宠幸。
3.运行,在可运行状态中的线程获得了cpu的宠幸,开始完成自己的任务。
4.阻塞,阻塞状态指线程因为某种原因放弃了cpu的使用权,暂时的停止了运行,直到阻塞状态结束之后将会回到可运行状态之中,重新等待cpu的宠幸
5.死亡,线程所持的任务完成,寿终正寝

 

5.网络模型(五层||七层)

  让我们先复习一下五层模型:

  1. 物理层:电缆,网线,无线电波等将两个电脑连起来,传递0,1的信号
  2. 链路层:以太协议,0,1信息转化数据包,MAC网卡
  3. 网络层:IP协议,子网络,子网掩码,ARP协议,通过IP获取MAC地址,交给网关,网关ARP找MAC。
  4. 传输层:UDP,TCP协议,解决端口通讯问题
  5. 应用层:解读数据包数据

  在这里只是将链路层和物理层合并成接口层或者是将应用层再划分层会话层,表示层和应用层罢了。

 

6.在浏览器上输入URL到显示主页的流程

 主要分为以下阶段:

  1. DNS将域名解析成IP
  2. 根据IP进行TCP连接
  3. 发送HTTP请求
  4. 服务器处理请求并返回HTTP报文
  5. 浏览器解析并渲染页面
  6. 连接结束

 

7.大数据表CURD优化方向

  这个也是会问,优化方向分为几个步骤。

    1.检查有没有合适的索引,SQL语句有没有合适的查询条件

    2.读写分离,让写操作与访问多的读操作分开

    3.缓存,对热点数据进行缓存处理

    4.垂直分表,将重点字段与不常用字段分开,拆分表大小,会有主键冗余问题以及让事务复杂化

    5.水平分表,这个基本就是分库了,不然没啥意义,会带来join问题和事务问题

 

8.JVM内存模型

    1.堆区:堆区存放对象

    2.方法区:方法区存放静态对象,类信息,常量池

    3.JVM栈:压入正在执行的方法以及即将执行的方法

    4.本地方法栈:native方法

    5.程序计数器:用于记录程序执行的字节码行号

 

9.常见标记算法以及GC算法

标记算法:

    1.引用计数:计算当前对象被引用次数,当被引用次数等于0时标记对象,缺点是无法处理循环引用对象

    2.可达性分析:从根节点开始,标记根节点引用的相应对象以及引用对象的引用,层层遍历

    扩展:可达性分析根节点对象

        1.方法区的静态变量和常量

        2.native方法与当前执行的方法

        3.当前持有锁的线程内对象

        4.类和类加载器对象

GC算法:

    1.标记-清除算法:标记清除算法是第一遍将可清除对象标记,然后将对象定点清除,这个算法简单粗暴,但是缺点是会导致内存空间不连贯,缺少大块的内存空间

    2.标记-整理算法:标记整理算法是标记清除算法的进阶,在标记清除之后还会整理内存,留出连续的内存

    3.标记-复制算法:标记复制算法是将内存划成两块,先过一遍标记,然后把未标记的对象放另一块,再清除标记的对象,这个算法缺点在于内存的分块导致了实际使用内存的减少

    通常来说,我们是在年轻代空间使用标记复制算法,在老年代和永久代或者元空间使用标记整理算法,二者联用

 

10.fullGC与minorGC

FullGC是全盘的GC,包括老年代和元空间。而minorGC是年轻代的GC。

minorGC在年轻代空间不足时就会触发,GC时间很短,

FullGC的时机一般在这几种情况:

1.在手动调用System.GC()的时候,可能会执行,但是不一定

2.在老年代空间不足的时候触发

3.在元空间空间不足的时候触发

 

11.类加载器

JVM最少会存在三类类加载器

1.启动类加载器:这是由C++实现的类加载器,负责将JAVAHOME/lib目录的类库加载进虚拟机中,启动类加载器无法直接被java程序使用

2.扩展类加载器:这是java实现的类加载器,负责将JAVAHOME/lib/ext目录下的类库加载进来,开发者可以直接使用扩展类加载器

3.应用类加载器:这个类加载器也称为系统类加载器,加载的是classPath下的类库,这个也是我们用的最多的类加载器,也是程序中默认的类加载器

 

12.双亲委派机制

在上述的类加载器机制中,存在委托机制。委托机制就是说在加载类的时候,会先尝试用更高级的类加载器去加载对应的类,如果加载不了,再使用后续的类进行加载。比如我们自己写了一个String类,这个类在运行的时候并不会被加载进应用中,因为应用类加载器的优先级在启动类加载器之后,我们使用的会是启动类加载器加载的类。这个机制的主要作用就是为了防止系统类比如object被改写,导致灾难性的后果。

 

13.双亲委派机制的破坏

比如tomcat,就是最常见的双亲委派机制破坏的例子,tomcat在加载类的时候会先尝试让底层的类加载器对加载,如果没有加载到再通过common类加载器兜底,这样的做法是为了让不通的webApp加载同样的jar的不同版本。

 

14.数据库的事务特性

    1.A,原子性:事务流程要么全部成功,要么全部都失败

    2.C:一致性:事务发生前后数据库的完整性不能被破坏,比如约束

    3.I:隔离性:事务直接不会彼此影响

    4.D:持久性:事务带来的改变是持久的

 

15.数据库的隔离级别

    1.读未提交:可以读到未提交的事务改变,脏读问题

    2.读已提交:可以读到已提交的数据,会产生不可重复读的问题

    3.可重复读:读锁和写锁会保持到事务结束,所以解决了不可重复读的问题

    4.串行化:事务挨个执行,也就没有所谓的事务问题了

 

posted @ 2023-02-15 14:41  危笑S  阅读(605)  评论(0)    收藏  举报