七天八股速记 Java后端

Day1

接口和抽象类的区别

接口抽象类
方法抽象方法既可以有抽象方法,也可以有普通方法
关键字修饰interfaceabstract class
定义常量变量只能定义静态常量成员变量
子类方法所有方法必须实现实现所有的抽象方法
子类继承多继承单继承
构造方法不能有构造方法可以有构造方法
接口实现只能继承接口,不能实现接口可以实现接口,并且不实现接口中的方法
  • 静态常量:
    • 静态常量const定义期间必须初始化,并且之后不能进行数据修改,即静态常量不能修改
    • 在编译期间进行初始化
    • 静态常量不能通过构造函数进行修改,只能通过初始化器
  • 成员变量:
    • 成员变量定义在类中,在整个类中都可以被访问
    • 成员变量随着对象的建立而建立,随着对象的消失而消失,存在于对象所在的堆内存中
    • 成员变量有默认初始化值
  • 构造方法:
    • 对象创建时要执行的方法

Java 中的继承和 C++ 有什么不同

C++ 中可以实现多继承,而 Java 只能实现单继承。

Java 中有哪些数据结构?用过 HashMap 吗,说一下 HashMap 底层实现。

数据结构有数组、链表、栈、队列、堆、树、集合、映射等。其中HashMap 是一种常用的映射数据结构。
HashMap在JDK1.7之前采用数组加链表的形式实现,在1.8之后使用了红黑树:通过底层数组存储对象节点,采用链地址法,把新增对象节点连接在当前地址的节点下面,且规定当链表长度大于8时,将链表转换成红黑树结构。
HashMap 是基于哈希表实现的,它使用了数组和链表(或红黑树)的结合来实现键值对的存储。HashMap 的底层数据结构主要包括一个数组和若干个链表(或红黑树)。在 HashMap 中,每个键值对会被映射到数组中的一个位置,这个位置就是通过哈希函数计算得到的索引。如果发生哈希冲突(即不同的键映射到了同一个位置),则会使用链表(或红黑树)来存储冲突的键值对。
当往 HashMap 中放入键值对时,首先会根据键的哈希值找到对应的数组位置,然后将键值对插入到链表(或红黑树)的头部。如果链表长度超过阈值(8),(先判断table的长度是否大于64,如果小于64,就通过扩容的方式来解决,避免红黑树结构化)链表会转换为红黑树,以提高查询效率。在进行查找操作时,同样会根据键的哈希值找到对应的数组位置,然后在链表(或红黑树)中顺序查找或通过红黑树的方式查找对应的值。

Java 中用的是值传递还是引用传递?

在 Java 中,方法调用时传递的是变量的值,而不是变量本身。这意味着 Java 使用的是值传递。在 Java 中,对于基本数据类型,传递的是值本身;对于对象类型,传递的是对象的引用值。因此,有时候会有人说 Java 使用的是"引用传递",但更准确的说法是 Java 使用的是"值传递",只不过对于对象类型的值,传递的是引用值。

面向过程和面向对象有什么区别?

面向过程是一种以过程为中心的编程思想,在处理某件事的时候,以正在进行什么为主要目标,分步骤完成目标。而面向对象的思想是将事物抽象为对象,赋予其属性和方法,通过每个对象执行自己的方法来完成目标。面向过程效率更高,而面向对象耦合低(易复用),扩展性强,易维护。

final、finally、finalize 的区别?

  • final 用于修饰属性、类、方法,修饰的变量一旦赋值后,不能被重新赋值。被 final 修饰的实例变量必须显式指定初始值。被final修饰的类不能被继承,方法不能被重写,变量不能改变。
  • finally 用于异常处理,只能⽤在 try/catch 中,finally 后的代码总会被执行。
  • finalize 是 java.lang.Object 类中的⽅法,每⼀个对象都会继承这个方法,在垃圾回收机制执行的时候会被调用,允许回收未被使用的内存垃圾。

什么是序列化?什么是反序列化?

序列化其实就是将对象转化成字节序列格式,使其可储存可传输。
反序列化就是将字节序列格式转换成对象,是序列化的补集。

什么是不可变类

不可变类是指实例的属性不能被修改的类。一个不可变类的实例对象从被创建出来,它的成员变量就不能被修改。Java 平台的类库中包含许多的不可变类,比如 String、基本类型的包装类等。不可变类比一般的更加安全。

为什么 Java 中 String 是不可变类?

  • String 类中包含 char 数组 value、整形的 offset 和 count 三个属性,这三个属性都是 private 的,且没有提供方法修改数值,因此在初始化后无法从外部改变。
  • String 类中的这三个属性都是被 final 修饰的,无法从内部进行改变;
  • 方法区有一块特殊存储区域 String Pool,当创建 String 时,如果在 String Pool 中找到相同的字符串值,则会返回一个已存在 String 的引用而不会新建一个对象。假设 String 是可变的,则会导致其他引用这个字符串值的 String 的值发生变化。

API 和 SPI 的区别

API 和 SPI 都是制定接口传输数据。API 是由实现方负责定义和实现,调用方只负责调用的 API。而 SPI 是指由调用方制定的接口,这个接口由实现方针对接口进行不同的实现,再由调用方选择实现方。例如在 JDBC 连接数据库时,针对不同的数据库需要不同的驱动实现,JDBC 提供了驱动接口,由不同的实现方进行实现了这些不同的驱动,然后我们就可以在 JDK 中引入这些实现了的驱动包进行使用。
API(Application Programming Interface)
大多数情况下,都是实现方来制定接口并完成对接口的不同实现,调用方仅仅依赖并直接进行使用却无权选择不同实现。
SPI(Service Provider Interface)
SPI 是JDK 提供的一种服务提供发现机制, 调用方来制定接口,实现方来针对接口来进行不同的实现。调用方来选择自己需要的实现方。

Day2

线程和进程的区别

进程线程
定义操作系统进行资源分配和调度的基本单位操作系统能够进行运算调度的最小单位
从属关系运行程序的实例进程的一个执行流
资源共享进程间不能进行资源共享线程间可以共享资源
上下文切换切换速度慢切换速度快
操纵方操作系统编程人员

线程和协程的区别?什么场景下用到协程?

线程协程
定义操作系统最小的执行单元操作系统最小的资源管理单元
从属关系一个进程可以有多个线程一个线程可以有多个协程
同步异步同步机制异步机制
资源消耗MB级,更大KB级,更小
  • 高并发服务,如秒杀系统、RPC 服务器等。
  • 爬虫开发。
  • 即时通信服务,如聊天室、游戏服务器等等。

线程和协程是并发编程中两种不同的机制,它们有一些区别。

  • 调度方式:线程由操作系统内核进行调度,它们是操作系统的原生概念,执行的调度和切换由操作系统决定。而协程是在用户空间进行调度,程序员可以显式地控制协程的切换,而不需要依赖操作系统的调度。
  • 并发性:线程是并发执行的,一个程序可以同时有多个线程在运行,每个线程都有自己的执行流。协程通常是单线程的,一个协程执行时可以暂停,切换到另一个协程执行,这样实现了并发。
  • 资源消耗:线程需要较多的资源,如栈空间和线程上下文切换的开销较大。而协程通常只需要较小的栈空间,并且切换开销较低,因为协程的切换是由程序员控制的,不需要切换到操作系统内核态。
  • 阻塞和同步:在传统的线程模型中,当一个线程遇到阻塞操作(如IO操作)时,会被操作系统调度到等待状态,从而允许其他线程运行。而协程可以通过显式的挂起和恢复操作来实现非阻塞的同步,避免了线程切换和阻塞等待。

在一些特定的场景下,协程可以提供更高效的并发编程解决方案:

  • 高并发IO密集型应用:当应用程序需要同时处理大量IO操作(如网络请求、数据库查询等)时,使用协程可以避免线程切换的开销,提高并发处理能力。
  • 异步编程:协程可以使异步代码的编写更加简洁和可读。通过使用协程库或语言提供的异步/await等关键字,可以编写顺序化、可读性高的异步代码,而无需显式地处理回调函数和线程切换。
  • 有限状态机:协程可以用于实现有限状态机(FSM)的编程模型。通过使用协程来表示状态和状态转换,可以简化复杂的状态逻辑和事件处理。

需要注意的是,协程并非在所有情况下都是最佳选择。在某些情况下,如CPU密集型任务或需要与底层系统紧密交互的情况下,线程模型可能更为适合。在选择使用协程时,需要根据具体的应用场景和需求进行评估和权衡。

怎么理解容器的线程安全与线程不安全?里面具体做了什么样的实现?

  • 线程安全
    在拥有共享数据的多条线程并行执行的程序中,代码可以通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据错误等意外情况,称为线程安全。
  • 线程不安全
    不提供机制保护,出现多个线程先后更改数据造成得到脏数据的可能。
  • 线程安全里面具体做了什么样的实现
    • 互斥同步
      通过 synchronized 关键字编译后,在同步块的前后生产 monitorenter 和 monitorexit 两个字节码指令,需要明确的 reference 对象进行解锁。获取 reference 对象后当前线程可以操作代码块,当锁的持有数归 0 锁释放后,可以在被其他线程获取。
    • 非阻塞同步
      对互斥同步的优化,对于获取锁失败的线程,将不再让其挂起,而是自旋等待一段时间,若还是无法获取锁才将其挂起。
      • 无同步方案
        • 可重入代码
          不允许任何进程进行修改,在运行的任何时刻中断去执行其他代码,在合理范围内(多次重入等)继续执行。
        • 线程本地储存
          每个线程都有一个副本,对线程所做的修改都是对副本修改,不会对其他副本造成影响。

Java 如何实现线程安全

  1. 使用 synchronized 关键字:
    在关键代码段使用 synchronized 关键字可以确保同一时间只有一个线程可以访问该代码块,从而避免多个线程同时访问造成的数据竞争问题。
public synchronized void synchronizedMethod() {
    // 线程安全的代码块
}
  1. 使用 AtomicInteger 和 AtomicReference 等原子类:
    Java 中提供了一系列原子类,可以实现针对基本数据类型和对象引用的原子操作,避免了线程安全问题。
private AtomicInteger count = new AtomicInteger(0);

public void increment() {
    count.incrementAndGet();
}
  1. 使用 ThreadLocal:
    ThreadLocal 可以实现每个线程都拥有自己的变量副本,从而避免多个线程之间的数据共享问题。
private ThreadLocal<Integer> threadLocal = ThreadLocal.withInitial(() -> 0);

public void increment() {
    int value = threadLocal.get();
    threadLocal.set(value + 1);
}

并发类库提供的线程池实现有哪些?

  • newCachedThreadPool()
  • newFixedThreadPool(int nThreads)
  • newSingleThreadExecutor()
  • newSingleThreadScheduledExecutor() 和 newScheduledThreadPool(int corePoolSize)
  • newWorkStealingPool(int parallelism)

线程池中的几个参数,比如核心线程数、最大线程数,如果让你定,你会怎么样去设定这些值?基于什么样

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java 后端面试八股文是面试中常见的问题类型,其主要目的在于考察面试者对于 Java 后端开发基础知识的理解程度、实际应用经验以及解决问题的能力,以下是一份常见的 Java 后端面试八股文: 1. Java 基础知识:主要考察面试者对于 Java 语言的基本特性、常用类库、数据类型、面向对象思想等方面的掌握程度。 2. 网络通信:了解网络通信协议,如 TCP/IP 协议和 HTTP 协议,并掌握 socket 编程的基础知识。 3. 数据库:能够熟练编写 SQL 语句进行数据操作,了解关系型数据库和非关系型数据库的优劣及适用场景,如 MySQL、Redis、MongoDB 等。 4. 数据结构和算法:具备基本的算法和数据结构理解,如二叉树、哈希表、排序等,并能够运用算法解决实际问题。 5. 多线程编程:掌握多线程编程的原理和常用技巧,如线程池、锁机制等,以及对线程安全问题的处理。 6. 框架应用:熟悉常见的 Java 后端框架,如 Spring、SpringMVC、Hibernate 等,能够根据业务需求使用和扩展这些框架。 7. 性能优化:了解性能优化的方法和技巧,如内存泄漏、SQL 语句调优、缓存优化等,以提高系统的性能和可扩展性。 8. 实际应用:思路清晰,具备在复杂业务场景下的开发经验,熟悉大型互联网系统相关技术架构,具有较强的工程实践能力。 总之,Java 后端开发是一个庞大而又复杂的领域,其技术栈涵盖了从基础语言、框架应用到业务实践等多个方面,掌握好 Java 的相关知识,能够编写高质量、高性能的代码,并且不断提升自己的能力,是每一个 Java 后端开发工程师都应该具备的基本素质。 ### 回答2: 在Java后端面试中,八股文指的是面试官通常会问到的一些基础问题,这些问题的答案通常是非常标准化和公式化的。因此,这些问题很适合以八股文的形式来回答。 以下是几个常见的Java后端面试八股文题目和回答: 1. 什么是Java线程? Java线程是操作系统执行单元的基本单元。每个Java应用程序都至少有一个线程。Java线程允许同时执行多个任务,每个任务在单独的线程中运行,从而提高了应用程序的效率和响应性。 2. Java中的异常处理机制是什么? Java中的异常处理机制允许程序员在运行时捕获并处理错误。当出现异常时,程序会跳转到异常处理器中,并执行相应的代码。Java程序中的异常可以被自定义,也可以是预定义的异常类型,如NullPointerException、ArrayIndexOutOfBoundsException等。 3. 什么是Java虚拟机? Java虚拟机(JVM)是Java程序的运行环境,它通过将字节码翻译为本地机器指令来执行Java程序。JVM提供了垃圾回收机制、内存管理、安全性和多线程支持等功能,大大简化了Java程序的开发和管理。 4. 什么是Java的反射机制? Java的反射机制是指程序在运行时动态地获取和操作类的信息,包括类的字段、方法、构造函数等。Java中的反射机制支持动态地创建对象、调用方法和修改属性,使得Java程序具有更高的灵活性和可扩展性。 5. 什么是Java的集合框架? Java的集合框架是指一组可重用的数据结构和算法,包括list、set、map等。集合框架在Java程序中被广泛使用,它们提供了更加抽象的数据类型,使得程序员可以更加轻松地操作数据集合。集合框架是Java程序中最重要的库之一。 以上是几个常见的Java后端面试八股文题目和回答,这些题目都是非常基础的知识点,但在实际工作中却被广泛应用。对于准备面试的Java后端开发工程师来说,掌握这些知识点是非常重要的。 ### 回答3: Java后端面试常见的八股文内容包括:Java基础、数据结构与算法、操作系统、计算机网络、数据库等方面。以下是更详细的回答: 1. Java基础 Java基础是Java后端开发的基础,而Java编写的程序跑在JVM(Java虚拟机)上,因此对于Java基础的理解和掌握是至关重要的。Java基础八股文的常见问题包括:Java的数据类型、面向对象的概念以及Java中类与接口的作用等方面。 2. 数据结构与算法 数据结构与算法是所有程序员必须掌握的领域之一。在Java后端开发中,很多应用中会涉及到数据结构与算法,比如使用数据结构实现高效搜索、排序、分析大量数据等。因此,数据结构与算法的八股文占据着重要的地位。 3. 操作系统 操作系统也是Java后端开发中必须掌握的领域之一,因为操作系统是计算机系统中的关键部分,影响着整个系统的运行效率和稳定性。八股文中通常会涉及到操作系统的进程管理、内存管理、文件管理和输入输出等方面。 4. 计算机网络 计算机网络作为互联网的支持与基础,也是Java后端开发中的重要组成部分。八股文中常问计算机网络的协议、TCP/IP模型、网络的安全性以及常见的网络攻击方式等。 5. 数据库 数据库是大部分应用程序中不可或缺的组成部分,对于Java后端开发的常见数据库有MySQL、Oracle、SQL Server等。常见的数据库八股文问题包括SQL语法、数据库设计、事务管理、数据备份和恢复等方面。 以上内容就是Java后端面试八股文的一些常见问题与注意点,当然在实际面试中,还会涉及到其他方面的问题。总的来说,作为一名Java后端开发人员,需要对Java基础、数据结构与算法、操作系统、计算机网络、数据库等多方面知识与技能有着扎实的功底和熟练掌握,才能胜任Java后端开发岗位的工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值