面试八股文之JAVA基础

JAVA基础

DNS、CDN?

  • DNS:即域名解析服务的意思。它在互联网的作用是:把域名转换成为网络可以识别的ip地址。
  • CDN:即内容分发网络,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。

如何实现对象克隆?

实现 Cloneable 接口并重写 Object 类中的 clone()方法;

实现 Serializable 接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆

父子类静态代码块, 非静态代码块, 构造方法执行顺序?

  • 父类 - 静态代码块
  • 子类 - 静态代码块
  • 父类 - 非静态代码
  • 父类 - 构造函数
  • 子类 - 非静态代码
  • 子类 - 构造函数

String s = new String("abc") 创建了几个对象, 分别放到哪里?

3个对象, s是引用对象, 放到栈里, s中存储的是内存地址,

new String是一个对象, 放到堆里, "abc"是一个字符串对象, 放到堆里.

OSI网络模型七层?

应用层, 表示层, 会话层, 传输层, 网络层, 数据链路层, 物理层.

应用层协议?

http协议, https协议, FTP协议, SIP协议, POP3和SMTP协议等

http协议和https协议区别?

http不安全, https协议安全, 因为https协议在传输过程中, 传输的内容会进行加解密.

原理是跟国家有关部门花钱申请CA证书, 将证书部署到tomcat服务器中, 那么传输的内容会经过CA证书进行加解密, 这样传输的内容是安全的.

传输层协议有哪些以及区别?

传输层只有两个协议, 一个是tcp, 一个是udp

tcp : 传输过程中有三次握手, 四次挥手过程. 所以传输的速度比udp慢, 但是不容易丢数据包.(HTTP协议是基于TCP协议的,发送数据之前需要建立好连接;)

udp: 传输过程是无状态的, 传输速度快, 但是容易丢数据包. 主要使用在视频, 语音传输中.

http协议是长连接还是短连接?

http协议1.0是短连接, http协议是1.1那么是长连接.

http常用响应码以及含义?

2XX: 成功

3XX: 重定向

4XX: 访问的资源错误, 或者不存在.

5XX: 服务器内部错误.也就是java代码中出现了问题.

常用的请求方式有哪些以及作用?

get: 一般用作查询

post: 一般用作添加

put: 一般用作修改

delete: 一般用作删除.

options: 一般前后端分离的项目中使用options发送一个简单的请求, 测试请求是否成功, 如果成功才会继续发业务请求(get, post, put, delete), 如果options尝试访问失败, 那么不会再发业务请求.

try、catch、finally 考察?

java 复制代码
public class TryDemo {
public static void main(String[] args) {
System.out.println(test());
}
public static int test() {
try {
return 1;
} catch (Exception e) {
return 2;
} finally {
System.out.print("3");
       }
   }
}

在 return 前会先执⾏ finally 语句块,所以是先输出 finally ⾥的 3,再输出 return 的 1。

如果finally里有return则不会执行try里面的return。

基本数据类型?

Java 中的基本数据类型只有8个:byte、short、int、long、float、double、char、

boolean;除了基本类型,剩下的都是引⽤类型。

  • 基本数据类型 :数据直接存储在栈上

  • 引⽤数据类型区别 :数据存储在堆上,栈上只存储引⽤地址。

  • char: 1个字节

  • short: 2个字节

  • int: 4个字节

  • long: 4个字节

int的取值范围?

int为4个字节:1字节=8位,所以int为32位在计算机中存储的二进制位数。

如果没有符号位的话: 就是32位:表示数的范围为2的32次方(可以举例数字就明白了).

最大的整数为:2的32次方-1。

就是这么大:

unsigned int 0~4294967295

token刷新(保活)?

使用两个token ,一个是真正的access_token时效短(2h),另外一个refresh_token时效长(7day)用于刷新token。用redis存储access_token,设置过期时间。

情况1:refresh_token过期,重新登录获取access_token

情况2:refresh_token没过期,access_token过期,不用登录,后端刷新access_token。

对称加密和非对称加密有什么区别?

  • 对称加密:使用一把密钥,加密和解密算法一样的;
  • 非对称加密:使用2把密钥,一把公钥,一把私钥;

用过那些加密算法?

  • base64:严格来说是一种编码和解码的算法;
  • MD5:将明文生成一个128位的字符串;
  • BCrypt算法:自带盐值(密文中),对于同一个密码,每次生成的密文是不同的(随机盐值);

字节流和字符流有什么区别?

  • 字节流:
    1、字节流以字节为单位进行读写,适用于处理二进制数据或者未经编码的文本数据。
    2、字节流通常用于处理图片、音频、视频等二进制数据,以及不需要考虑字符编码的文本数据。
    3、字节流的类包括InputStream和OutputStream。
  • 字符流:
    1、字符流以字符为单位进行读写,适用于处理文本数据,可以自动处理字符编码和解码。
    2、字符流通常用于处理文本文件、网络通信中的文本数据等需要考虑字符编码的场景。
    3、字符流的类包括Reader和Writer。

拆箱和装箱?

  • 装箱就是自动将基本数据类型转换为包装类型;
  • 拆箱就是自动将包装类型转换为基本数据类型
  • 这两种转换都是在需要的时候由编译器自动完成的,因此可以称为隐式转换。

TCP(传输控制协议)和UDP(用户数据报协议)区别?

  • TCP是面向连接的,UDP是无连接的
  • TCP是可靠的,UDP是不可靠的
  • TCP是面向字节流的,UDP是面向数据报文的
  • TCP只支持点对点通信,UDP支持一对一,一对多,多对多
  • TCP报文首部20个字节,UDP首部8个字节
  • TCP有拥塞控制机制,UDP没有
  • TCP协议下双方发送接受缓冲区都有,UDP并无实际意义上的发送缓冲区,但是存在接受缓冲区

锁相关?

  • synchronized:重量级锁,依赖于操作系统,自动加锁和自动释放锁,是一个关键字,不可以被打断;
  • lock:是一个接口,手动加锁和释放锁,可以被打断;

死锁和活锁的区别?

  • 死锁:多个线程相互占用对方的资源的锁,一直处于阻塞状态;
  • 互斥条件
    临界资源是独占资源,进程应互斥且排他的使用这些资源。
  • 请求和保持条件
    进程在请求资源得不到满足而等待时,不释放已占有资源。
  • 不剥夺条件
    又称不可抢占,已获资源只能由进程自愿释放,不允许被其他进程剥夺。
  • 循环等待条件
    又称环路条件,存在循环等待链,其中,每个进程都在等待链中等待下一个进程所持有的资源,造成这组进程处于永远等待状态。
    死锁只有在这四个条件同时满足时出现。
  • 活锁:活锁是拿到资源却又相互释放不执行;

解决死锁?

  • 避免使用多个锁:尽量减少代码中使用多个锁的情况,减少死锁的概率。

  • 避免循环等待 :尽量避免线程之间形成循环等待的情况,可以通过统一获取锁的顺序来避免循环等待。

  • 使用定时锁 :在获取锁的时候设置超时时间,如果超过一定时间还未获取到锁,则放弃锁并进行相应的处理。

  • 使用线程池:使用线程池来管理线程的执行顺序,避免线程之间的竞争和死锁。

  • 使用并发工具类:使用Java并发工具类如ReentrantLock、Semaphore等来替代synchronized关键字,这些工具类提供了更灵活的锁管理方式。

  • 使用死锁检测工具:可以使用一些工具来检测死锁的发生,如jstack、jconsole等,及时发现并解决死锁问题。

封装、继承、多态?

  • 封装:它指的是将数据和方法包裹在类中,并对外部隐藏具体实现细节。
  • 继承:通过继承,子类可以扩展或修改从父类继承而来的属性和方法,实现代码的重用和扩展。
  • 多态是指同一种类型的对象,在不同情况下可以表现出不同的行为,它包括编译时多态(重载)和运行时多态(重写)两种形式。

jdk8的新特性?

  • Stream API:(集合、或者数组创建stream,中间操作,过滤、map,终止操作)

            1.根据List获取流
    
              2.根据Set获取流
    
              3.根据Map获取流
    
                      3.1根据Map集合的键来获取流
    
                      3.2根据Map集合的值获取流
    
                      3.3根据Map集合的键值对对象获取流
    
              4.根据数组获取流
    
  • 新时间日期API:LocalDateTime

Java8新增的日期类主要有三个:

LocalDate:表示日期(年月日)

LocalTime :表示时间(时分秒)

LocalDateTime:表示时间+ 日期 (年月日时分秒),是java8最常用的日期类

  • Lambda表达式:代码更少(只有确保接口中仅有一个抽象方法)
  • 函数式接口:有且仅有一个抽象方法的接口(体现在lambda表达式)
  • HashMap:底层转化为数组+链表+红黑树。
  • 接口的默认方法:在接口中可以有方法的实现,default默认关键字。

为什么需要包装类?包装类的值比较要使用什么方法?包装类有哪些功能?

包装类是将基本类型转化为对象的机制,基本数据类型不具备对象的特性,不能直接调方法或者参与面向对象的操作。所以需要使用包装类。

可以直接使用equals方法进行比较,因为包装类是对象,对象之间比较值应该用equals方法。

功能:1.将基本类型转化为包装类 2,提供了和基本数据类型相对应的静态常量和方法

3,支持自动拆箱和装箱 4,提供一些额外的功能方法,如对数字进行格式化,转化

Java中的类型有哪些?

基本类型,引用类型(对象,接口,数组,字符串)

什么是字符串常量池?

是java提供对频繁创建字符串的一种解决方案,同一个对象创建多次,占用多个内存空间。

所有在创建一个字符串时,会先判断字符串常量池是否已经存在该字符串,不存在则创建,存在则返回这个对象的地址。

线程中的 start() 和 run() 有那些区别?

start():线程启动时调用,线程处于就绪状态;

run():线程运行时调用,线程处于运行状态;

ThreadLocal 有什么用?

可以保证线程安全,每个线程都会创建一个线程副本,set和get的值是同一个;

String、StringBuffer、StringBuilder 的区别?

string类是不可变的(也就是说一旦创建了一个字符串对象,就不能再修改它的值。因此,每次对字符串进行操作时,都会创建一个新的字符串对象,这样会产生大量的临时对象,影响程序的性能。)

stringBuffer,可变的,它们可以更改已有对象中的字符内容,而不必创建新的对象,线程安全(使⽤ synchronized 来保证线程安全);

stringBuilder是可变的,它们可以更改已有对象中的字符内容,而不必创建新的对象,线程不安全;

String 对象的 intern() 有什么作用?

1,字符串的重用(通过调用intern()方法,可以将字符串对象放入字符串常量池中,并返回常量池中的引用。这样可以避免创建多个相同内容的字符串对象,节省内存空间。),2,字符串的比较和优化(由于字符串常量池中的字符串是唯一的,所以可以使用==运算符来比较字符串对象的引用是否相等,而不需要使用equals()方法进行内容比较,提高比较的效率。)

Cookie、Session和Token的区别?

  • cookie和session都是浏览器的会话跟踪技术,解决http无状态的问题;
    Cookie:放在客户端,只能放字符串,大小有限制,不安全,会根据域名自动携带;
    Session:放在服务端,数据大小,类型没有限制,占用服务器资源,相对安全
    Token:不局限域浏览器,没有客户端限制,可以实现单点登录,可以揉入一些数据

什么是反射?

反射是java提供的一种机制,这个机制可以动态的获取一个类或对象的内部结构(属性,方法,接口,父类),还可以调用方法和修改属性。

什么地方用到反射?

自己写的工具类,框架

常用API

1,Class:表示字节码的文件对象

2,Method:对方法的封装

3,Field:对属性的封装

4,Parameter:方法形参的封装

5,Constructor:获取构造函数

接口和抽象类的区别?

  • 接口是一组抽象方法的集合,没有具体实现。接口定义了一个规范,要求实现该接口的类必须提供对应的方法实现。接口中的所有方法默认都是public,而且不能包含成员变量。一个类可以实现多个接口,从而实现多重继承。

  • 抽象类是一个类,它可以包含抽象方法和具体方法。抽象方法是没有具体实现的方法,需要由子类来实现。抽象类可以包含成员变量,可以有构造方法和非抽象方法。一个类只能继承一个抽象类,但是可以同时实现多个接口。

1、接口只定义了抽象方法,没有具体实现,而抽象类可以包含抽象方法和具体方法。
2、一个类可以实现多个接口,但只能继承一个抽象类。
3、接口中的所有方法默认都是public,而抽象类可以有不同的访问控制符。

值传递和引用传递的区别?

值传递:在方法调用时,将实际参数的副本传递给方法,当你在方法内部修改参数的值时,只会影响副本,不会影响原始的变量。(基本类型的传递)

引用传递:在方法内部操作会影响到原始数据,但如果重新分配一个新的对象,原始对象不会改变。(对象的传递)

重载和重写的区别?

重载:方法名称相同,参数列表不同,和返回值没有关系;

重写:方法名称相同,参数列表相同,返回值相同;

JAVA中sleep()和wait()方法的区别?

sleep属于Thread类,wait属于object类

sleep()睡眠时不会释放锁,wait会

sleep()睡眠指定时间会自动唤醒,wait()需要手动唤醒

JAVA单例模式的区别?

懒汉式 :在第一次调用获取实例的方法才创建,可能存在线程安全问题,(非原子操作懒汉式在第一次获取实例时才进行实例化操作,然而实例化操作通常不是原子操作,而是包括了对变量的初始化、内存分配和赋值等多个步骤。在多线程环境下,如果两个线程同时通过了实例是否为空的判断,然后都尝试去实例化对象,就有可能导致创建多个实例的情况。)
饿汉式 :在类加载的时候就会创建,不存在线程安全问题。

什么是悲观锁和乐观锁?

悲观锁 :的基本思想是,在整个数据处理过程中,将数据加锁,防止其他事务同时修改数据。

当一个事务访问数据时,悲观锁会认为其他事务可能会对数据进行修改,因此会直接对数据进行加锁,使其他事务无法访问或修改数据,直到当前事务完成。

悲观锁适用于并发写入较多、冲突概率较高的场景,但它的缺点是会导致其他事务等待,并发性能相对较低。

乐观锁 的基本思想是,假设在整个数据处理过程中,不会有其他事务修改数据,因此不进行加锁操作。

当一个事务要对数据进行修改时,乐观锁不会立即加锁,而是在提交时检查是否有其他事务修改过数据。如果有冲突,则放弃当前事务的修改,重新尝试,直到成功或达到一定的尝试次数。(一般用数据版本机制或者CAS:比较并交换)。

乐观锁适用于并发读取较多、冲突概率较低的场景,它不会对数据进行加锁,因此并发性能相对较高,但需要增加冲突检测和重试机制。

HashMap底层原理?

数组+链表+红黑树,先通过key计算出hascode值,通过hash函数算出对应在数组的下标,

不同的key可能算出相同的hashcode。所以当发生hash冲突时,hashmap采用链表法,当超过一定的阈值时,自动转为红黑树。(当元素超过数组的0.75倍会扩容成原来2倍)

方法区、栈区、堆区?

方法区放静态方法,静态变量,字符串常量

堆区:放对象

栈区:放变量

synchronized和lock的区别?

1,synchronized是一个关键字,而lock是一个接口。

发生异常时synchronized会自动释放锁,而lock需要手动释放。如果没有释放容易造成死锁问题,所以需要在finally里调用unlock方法释放。

2,lock是可中断锁,而synchronized不是。

3,synchronized是重量级锁

4,Lock 获取锁和释放锁都是显式的,不像 synchronized 是隐式的。所以 synchronized 会在抛异常时自动释放锁,而 Lock 只能是主动释放,加解锁都必须有显式的代码控制。

volatile和synchronized有什么区别?

volatile关键字保证了线程的可见性,就是说当一个修改volatile关键字的变量的值,其他线程立马可以看见。同时volatile关键字还有防止指令重排序。轻量级性能更快,只能保证单个读/写操作的原子性,无法保证整个操作序列的原子性。

==和equals的区别?

==比较基本类型的时候是比较值是否相同,比较对象时是比较地址。

equals是对内容的比较,需要重写equals方法。

get 和 post 请求有哪些区别?

  • get请求一般用来获取数据的,post请求一般是用来传递数据到后端;
  • get请求传递数据一般在地址栏传递,post请求在请求体传递数据(url中也可以传参,一般不用);
  • get请求刷新浏览器或回退没有影响,post请求刷新会重新请求一遍;
  • get请求可以缓存在浏览器记录中,post请求不会缓存在浏览器记录中;

如何防止表单重复提交?

接口幂等性问题,后端第一接收到提交请求时,后端生成唯一标识,存储在缓存或者会话中返回给前端,当后续请求到达时,将唯一标识一起携带,后端先检测是否携带有唯一标识,有就拒绝,没有就处理。

list和linklist区别?

  • list是一个接口,而linklist实现了这个接口。

  • List 使用数组作为底层数据结构,可以通过索引快速定位元素,因此在查询和搜索元素时性能更好。但在插入和删除元素时,需要移动其他元素来维持顺序,因此性能较差。(查询快,修改慢)

  • LinkedList 使用双向链表作为底层数据结构,插入和删除元素只需要修改相邻节点的指针,因此性能更好。但在查询和搜索元素时需要遍历整个链表,性能较差。(修改快,查询慢)

后记
👉👉💕💕美好的一天,到此结束,下次继续努力!欲知后续,请看下回分解,写作不易,感谢大家的支持!! 🌹🌹🌹

相关推荐
Q_19284999062 分钟前
基于Spring Boot的九州美食城商户一体化系统
java·spring boot·后端
张国荣家的弟弟19 分钟前
【Yonghong 企业日常问题 06】上传的文件不在白名单,修改allow.jar.digest属性添加允许上传的文件SH256值?
java·jar·bi
ZSYP-S30 分钟前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
yuanbenshidiaos33 分钟前
c++------------------函数
开发语言·c++
yuanbenshidiaos37 分钟前
C++----------函数的调用机制
java·c++·算法
程序员_三木1 小时前
Three.js入门-Raycaster鼠标拾取详解与应用
开发语言·javascript·计算机外设·webgl·three.js
兔C1 小时前
微信小程序的轮播图学习报告
学习·微信小程序·小程序
是小崔啊1 小时前
开源轮子 - EasyExcel01(核心api)
java·开发语言·开源·excel·阿里巴巴
海海不掉头发1 小时前
苍穹外卖-day05redis 缓存的学习
学习·缓存
tianmu_sama1 小时前
[Effective C++]条款38-39 复合和private继承
开发语言·c++